|
1 | 1 | use crate::Secretariat; |
2 | | - |
| 2 | +use crate::Student; |
| 3 | +use crate::Materie; |
| 4 | +use crate::Inrolare; |
3 | 5 |
|
4 | 6 | use crate::queries::where_clause::*; |
5 | 7 |
|
6 | | -/* |
7 | | -TODO: daca stergerea se fac din tabelele Studenti/Materii, |
8 | | - sterge intrarile asociate din Inrolari |
9 | | - */ |
10 | 8 |
|
11 | | -fn delete_from_table<T: Matchable>( |
| 9 | +enum IdType { |
| 10 | + IdStudent, |
| 11 | + IdMaterie, |
| 12 | +} |
| 13 | + |
| 14 | + |
| 15 | +fn delete_from_inrolari_by_id(s: &mut Secretariat, id_type: IdType, id: u32) { |
| 16 | + let mut idx = 0; |
| 17 | + |
| 18 | + while idx < s.inrolari.len() { |
| 19 | + let remove: bool = match id_type { |
| 20 | + IdType::IdStudent => s.inrolari[idx].id_student == id, |
| 21 | + IdType::IdMaterie => s.inrolari[idx].id_materie == id, |
| 22 | + }; |
| 23 | + |
| 24 | + if remove { |
| 25 | + s.inrolari.remove(idx); |
| 26 | + } else { |
| 27 | + idx += 1; |
| 28 | + } |
| 29 | + } |
| 30 | +} |
| 31 | + |
| 32 | +/// Trait pentru elementele unei tabele |
| 33 | +trait TableEntry: Matchable { |
| 34 | + fn id(&self) -> u32; |
| 35 | + |
| 36 | + /// returneaza ID-urile care trebuie sterse din Inrolari |
| 37 | + fn related_ids_to_delete(&self) -> Vec<(IdType, u32)> { |
| 38 | + Vec::new() // default: nu sterge nimic |
| 39 | + } |
| 40 | +} |
| 41 | + |
| 42 | + |
| 43 | +impl TableEntry for Student { |
| 44 | + fn id(&self) -> u32 { self.id } |
| 45 | + |
| 46 | + fn related_ids_to_delete(&self) -> Vec<(IdType, u32)> { |
| 47 | + vec![(IdType::IdStudent, self.id)] |
| 48 | + } |
| 49 | +} |
| 50 | + |
| 51 | +impl TableEntry for Materie { |
| 52 | + fn id(&self) -> u32 { self.id } |
| 53 | + |
| 54 | + fn related_ids_to_delete(&self) -> Vec<(IdType, u32)> { |
| 55 | + vec![(IdType::IdMaterie, self.id)] |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +impl TableEntry for Inrolare { |
| 60 | + fn id(&self) -> u32 { 0 } |
| 61 | + // default: nu sterge nimic |
| 62 | +} |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +/// Functie generica de stergere dintr-o tabela |
| 67 | +fn delete_from_table<T: TableEntry>( |
12 | 68 | entries: &mut Vec<T>, |
13 | | - conditii: &Vec<Conditie> |
14 | | -) -> Result<(), String> |
15 | | -{ |
16 | | - let mut idx: usize = 0; |
| 69 | + conditii: &Vec<Conditie>, |
| 70 | +) -> Result<Vec<(IdType, u32)>, String> { |
| 71 | + let mut idx = 0; |
| 72 | + let mut related_ids = Vec::new(); |
| 73 | + |
17 | 74 | while idx < entries.len() { |
18 | | - match match_on_all_conditii(&entries[idx], conditii)? { |
19 | | - true => { |
20 | | - entries.remove(idx); |
21 | | - } |
22 | | - false => |
23 | | - idx += 1 |
| 75 | + if match_on_all_conditii(&entries[idx], conditii)? { |
| 76 | + related_ids.extend(entries[idx].related_ids_to_delete()); |
| 77 | + entries.remove(idx); |
| 78 | + } else { |
| 79 | + idx += 1; |
24 | 80 | } |
25 | | - |
26 | 81 | } |
27 | 82 |
|
28 | | - Ok(()) |
| 83 | + Ok(related_ids) |
29 | 84 | } |
30 | 85 |
|
| 86 | + |
| 87 | + |
31 | 88 | /* Template |
32 | 89 | DELETE FROM <tabel> WHERE <conditie>; |
33 | 90 | DELETE FROM <tabel> WHERE <conditie1> AND <conditie2>; |
@@ -90,12 +147,27 @@ pub fn delete(s: &mut Secretariat, query: &str) -> Result<(), String> { |
90 | 147 | let conditii: Vec<Conditie> = parseaza_conditiile_where(str_conditii)?; |
91 | 148 |
|
92 | 149 | match nume_tabela { |
93 | | - "studenti" => delete_from_table(&mut s.studenti, &conditii), |
94 | | - "materii" => delete_from_table(&mut s.materii, &conditii), |
95 | | - "inrolari" => delete_from_table(&mut s.inrolari, &conditii), |
| 150 | + "studenti" => { |
| 151 | + let related_ids = delete_from_table(&mut s.studenti, &conditii)?; |
| 152 | + for (id_type, id) in related_ids { |
| 153 | + delete_from_inrolari_by_id(s, id_type, id); |
| 154 | + } |
| 155 | + Ok(()) |
| 156 | + } |
| 157 | + "materii" => { |
| 158 | + let related_ids = delete_from_table(&mut s.materii, &conditii)?; |
| 159 | + for (id_type, id) in related_ids { |
| 160 | + delete_from_inrolari_by_id(s, id_type, id); |
| 161 | + } |
| 162 | + Ok(()) |
| 163 | + } |
| 164 | + "inrolari" => { |
| 165 | + delete_from_table(&mut s.inrolari, &conditii)?; |
| 166 | + Ok(()) |
| 167 | + } |
96 | 168 | _ => Err(format!( |
97 | 169 | "Tabela {:?} nu exista in baza de date a facultati!", |
98 | 170 | nume_tabela |
99 | | - )) |
| 171 | + )), |
100 | 172 | } |
101 | 173 | } |
0 commit comments