Skip to content

Commit f5ecbdc

Browse files
[Rust - Task 2] Full implementation of UPDATE
1 parent 2c7f62b commit f5ecbdc

4 files changed

Lines changed: 146 additions & 24 deletions

File tree

rust-method/src/queries/delete.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,27 @@ fn delete_from_inrolari_by_id(s: &mut Secretariat, id_type: IdType, id: usize) {
3131

3232
/// Trait pentru elementele unei tabele
3333
trait TableEntry: Matchable {
34-
fn id(&self) -> usize;
35-
3634
/// returneaza ID-urile care trebuie sterse din Inrolari
37-
fn related_ids_to_delete(&self) -> Vec<(IdType, usize)> {
38-
Vec::new() // default: nu sterge nimic
39-
}
35+
fn related_ids_to_delete(&self) -> Vec<(IdType, usize)>;
4036
}
4137

4238

4339
impl TableEntry for Student {
44-
fn id(&self) -> usize { self.id }
45-
4640
fn related_ids_to_delete(&self) -> Vec<(IdType, usize)> {
4741
vec![(IdType::IdStudent, self.id)]
4842
}
4943
}
5044

5145
impl TableEntry for Materie {
52-
fn id(&self) -> usize { self.id }
53-
5446
fn related_ids_to_delete(&self) -> Vec<(IdType, usize)> {
5547
vec![(IdType::IdMaterie, self.id)]
5648
}
5749
}
5850

5951
impl TableEntry for Inrolare {
60-
fn id(&self) -> usize { 0 }
61-
// default: nu sterge nimic
52+
fn related_ids_to_delete(&self) -> Vec<(IdType, usize)> {
53+
Vec::new() // default: nu sterge nimic
54+
}
6255
}
6356

6457

rust-method/src/queries/update.rs

Lines changed: 138 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,135 @@
11
use crate::Secretariat;
2+
use crate::Student;
3+
use crate::Materie;
4+
use crate::Inrolare;
5+
26

37
use crate::queries::where_clause::*;
48
use crate::queries::where_clause::parseaza_conditiile_where;
59

10+
use crate::task1::calculeaza_medii_generale;
11+
612
trait Updateable {
7-
fn update_table_field(&self, field: &str, value: &str) -> Result<(), String>;
13+
fn update_table_field(&mut self, field: &str, value: &str) -> Result<(), String>;
14+
}
15+
16+
17+
impl Updateable for Student {
18+
fn update_table_field(&mut self, field: &str, value: &str) -> Result<(), String> {
19+
match field {
20+
"id" =>
21+
self.id = value
22+
.parse::<usize>()
23+
.map_err(|_| format!("ID invalid: {:?}", value))?,
24+
"nume" =>
25+
self.nume = value.to_string(),
26+
"an studiu" =>
27+
self.an_studiu = value
28+
.parse::<u8>()
29+
.map_err(|_| format!("An studiu invalid: {:?}", value))?,
30+
"statut" => {
31+
match value {
32+
"t" => self.statut = 't',
33+
"b" => self.statut = 'b',
34+
_ => return Err(format!("Statut invalid: {:?}", value)),
35+
}
36+
}
37+
"medie_generala" =>
38+
return Err("Buna incercare :) NU poti modifica media generala!".to_string()),
39+
_ =>
40+
return Err(format!("Camp invalid {:?}", field))
41+
}
42+
43+
Ok(())
44+
}
45+
}
46+
47+
48+
impl Updateable for Materie {
49+
fn update_table_field(&mut self, field: &str, value: &str) -> Result<(), String> {
50+
match field {
51+
"id" =>
52+
self.id = value
53+
.parse::<usize>()
54+
.map_err(|_| format!("ID invalid: {:?}", value))?,
55+
"nume" =>
56+
self.nume = value.to_string(),
57+
"nume_titular" =>
58+
self.nume_titular = value.to_string(),
59+
_ =>
60+
return Err(format!("Camp invalid {:?}", field))
61+
}
62+
63+
Ok(())
64+
}
65+
}
66+
67+
68+
impl Updateable for Inrolare {
69+
fn update_table_field(&mut self, field: &str, value: &str) -> Result<(), String> {
70+
match field {
71+
72+
"id_student" =>
73+
self.id_student = value
74+
.parse::<usize>()
75+
.map_err(|_| format!("ID invalid pentru student: {:?}", value))?,
76+
"id_materie" =>
77+
self.id_materie = value
78+
.parse::<usize>()
79+
.map_err(|_| format!("ID invalid pentru metid_materie: {:?}", value))?,
80+
"note" => {
81+
let mut tokens = value.split_whitespace();
82+
83+
let nota_laborator: f32 = tokens
84+
.next()
85+
.ok_or_else(|| "Note invalide".to_string())?
86+
.parse()
87+
.map_err(|_| "Note invalide".to_string())?;
88+
89+
let nota_partial: f32 = tokens
90+
.next()
91+
.ok_or_else(|| "Note invalide".to_string())?
92+
.parse()
93+
.map_err(|_| "Note invalide".to_string())?;
94+
95+
let nota_final: f32 = tokens
96+
.next()
97+
.ok_or_else(|| "Note invalide".to_string())?
98+
.parse()
99+
.map_err(|_| "Note invalide".to_string())?;
100+
101+
self.note[0] = nota_laborator;
102+
self.note[1] = nota_partial;
103+
self.note[2] = nota_final;
104+
}
105+
_ =>
106+
return Err(format!("Camp invalid {:?}", field))
107+
}
108+
109+
Ok(())
110+
}
8111
}
9112

10113

114+
/// Functie generica
115+
fn update_table<T: Updateable + Matchable>(
116+
entries: &mut [T],
117+
conditii: &Vec<Conditie>,
118+
field: &str, value: &str
119+
) -> Result<(), String>
120+
{
121+
for entry in entries.iter_mut() {
122+
match match_on_all_conditii(entry, conditii) {
123+
Ok(true) => (),
124+
Ok(false) => continue,
125+
Err(message) => return Err(message),
126+
}
127+
128+
entry.update_table_field(field, value)?;
129+
}
130+
131+
Ok(())
132+
}
11133

12134

13135
/* Template:
@@ -35,10 +157,10 @@ pub fn update(s: &mut Secretariat, query: &str) -> Result<(), String> {
35157
// Imparte <camp> de <valoare>
36158
let eq_pos = camp_valoare.find('=').ok_or("Lipseste '=' in expresia de update")?;
37159
let camp = camp_valoare[..eq_pos].trim();
38-
let mut valoare = camp_valoare[eq_pos + 1..].trim().to_string();
160+
let mut valoare = camp_valoare[eq_pos + 1..].trim();
39161

40162
// Sterge ghilimele daca exista
41-
valoare = valoare.trim_matches('"').trim_matches('\'').to_string();
163+
valoare = valoare.trim_matches('"').trim_matches('\'');
42164

43165
// Extrage conditii (TOT ce este dupa WHERE)
44166
let mut str_conditii = ptr.trim().to_string();
@@ -52,10 +174,17 @@ pub fn update(s: &mut Secretariat, query: &str) -> Result<(), String> {
52174
// exemplu: parseaza conditii
53175
let conditii = parseaza_conditiile_where(&str_conditii)?;
54176

55-
println!("Tabela: {}", nume_tabela);
56-
println!("Camp: {}", camp);
57-
println!("Valoare: {}", valoare);
58-
println!("Conditii: {:?}", conditii);
59-
60-
Ok(())
177+
match nume_tabela {
178+
"studenti" => update_table(&mut s.studenti, &conditii, camp, valoare),
179+
"materii" => update_table(&mut s.materii, &conditii, camp, valoare),
180+
"inrolari" => {
181+
let result = update_table(&mut s.inrolari, &conditii, camp, valoare);
182+
calculeaza_medii_generale(s);
183+
result
184+
}
185+
_ => Err(format!(
186+
"Tabela {:?} nu exista in baza de date a facultati!",
187+
nume_tabela
188+
))
189+
}
61190
}

rust-method/src/queries/where_clause.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ pub fn parseaza_conditiile_where(str_conditii: &str) -> Result<Vec<Conditie>, St
6262
// Fiecare conditie trebuie sa aiba cel putin 3 token-uri: camp, operator, valoare
6363
let mut tokens = cond_str.splitn(3, ' '); // split in maxim 3 parti
6464

65-
let camp = tokens.next().ok_or(format!("Camp lipsa in conditie: '{}'", cond_str))?.trim();
66-
let op_comp = tokens.next().ok_or(format!("Operator lipsa in conditie: '{}'", cond_str))?.trim();
67-
let valoare = tokens.next().ok_or(format!("Valoare lipsa in conditie: '{}'", cond_str))?.trim();
65+
let camp = tokens.next().ok_or(format!("Camp lipsa in conditie: {:?}", cond_str))?.trim();
66+
let op_comp = tokens.next().ok_or(format!("Operator lipsa in conditie: {:?}", cond_str))?.trim();
67+
let valoare = tokens.next().ok_or(format!("Valoare lipsa in conditie: {:?}", cond_str))?.trim();
6868

6969
// Elimina ghilimelele de la inceput si sfarsit
7070
let valoare = valoare.trim_matches('"').to_string();

rust-method/src/task1.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ pub fn calculeaza_medii_generale(s: &mut Secretariat) -> () {
162162
pub fn citeste_secretariat(nume_fisier: &str) -> Secretariat {
163163
let mut secretariat = Secretariat::default();
164164
let file = File::open(nume_fisier).unwrap_or_else(|_| {
165-
eprintln!("Eroare: nu pot deschide fișierul {}", nume_fisier);
165+
eprintln!("Eroare: nu pot deschide fișierul {:?}", nume_fisier);
166166
process::exit(255);
167167
});
168168

0 commit comments

Comments
 (0)