11use crate :: Secretariat ;
2+ use crate :: Student ;
3+ use crate :: Materie ;
4+ use crate :: Inrolare ;
5+
26
37use crate :: queries:: where_clause:: * ;
48use crate :: queries:: where_clause:: parseaza_conditiile_where;
59
10+ use crate :: task1:: calculeaza_medii_generale;
11+
612trait 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}
0 commit comments