Skip to content

Commit 4c03890

Browse files
[Rust - Task 2] Generic DELETE
1 parent 5a4d262 commit 4c03890

1 file changed

Lines changed: 94 additions & 22 deletions

File tree

rust-method/src/queries/delete.rs

Lines changed: 94 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,90 @@
11
use crate::Secretariat;
2-
2+
use crate::Student;
3+
use crate::Materie;
4+
use crate::Inrolare;
35

46
use crate::queries::where_clause::*;
57

6-
/*
7-
TODO: daca stergerea se fac din tabelele Studenti/Materii,
8-
sterge intrarile asociate din Inrolari
9-
*/
108

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>(
1268
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+
1774
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;
2480
}
25-
2681
}
2782

28-
Ok(())
83+
Ok(related_ids)
2984
}
3085

86+
87+
3188
/* Template
3289
DELETE FROM <tabel> WHERE <conditie>;
3390
DELETE FROM <tabel> WHERE <conditie1> AND <conditie2>;
@@ -90,12 +147,27 @@ pub fn delete(s: &mut Secretariat, query: &str) -> Result<(), String> {
90147
let conditii: Vec<Conditie> = parseaza_conditiile_where(str_conditii)?;
91148

92149
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+
}
96168
_ => Err(format!(
97169
"Tabela {:?} nu exista in baza de date a facultati!",
98170
nume_tabela
99-
))
171+
)),
100172
}
101173
}

0 commit comments

Comments
 (0)