@@ -34,6 +34,7 @@ use crate::db::column_privilege::ColumnPrivilege;
3434use crate :: db:: index:: Index ;
3535use crate :: db:: privilege:: Privilege ;
3636use crate :: db:: routine:: Routine ;
37+ use crate :: db:: routine_parameters:: RoutineParameter ;
3738use crate :: db:: routine_privilege:: RoutinePrivilege ;
3839use crate :: db:: table_constraint:: TableConstraint ;
3940use crate :: db:: table_privilege:: TablePrivilege ;
@@ -72,6 +73,8 @@ impl Comparer {
7273 let right_column_privileges = self . right_db . column_privileges ( & schemas[ ..] ) . await ?;
7374 let left_routines = self . left_db . routines ( & schemas[ ..] ) . await ?;
7475 let right_routines = self . right_db . routines ( & schemas[ ..] ) . await ?;
76+ let left_routine_parameters = self . left_db . routine_parameters ( & schemas[ ..] ) . await ?;
77+ let right_routine_parameters = self . right_db . routine_parameters ( & schemas[ ..] ) . await ?;
7578 let left_routine_privileges = self . left_db . routine_privileges ( & schemas[ ..] ) . await ?;
7679 let right_routine_privileges = self . right_db . routine_privileges ( & schemas[ ..] ) . await ?;
7780 let left_schemas = self . left_db . schemas ( & schemas[ ..] ) . await ?;
@@ -107,9 +110,17 @@ impl Comparer {
107110
108111 let left_schema_routines = left_routines. iter ( ) . filter ( |r| r. routine_schema == schema) . collect ( ) ;
109112 let right_schema_routines = right_routines. iter ( ) . filter ( |r| r. routine_schema == schema) . collect ( ) ;
113+ let left_schema_routine_parameters = left_routine_parameters. iter ( ) . filter ( |p| p. specific_schema == schema) . collect ( ) ;
114+ let right_schema_routine_parameters = right_routine_parameters. iter ( ) . filter ( |p| p. specific_schema == schema) . collect ( ) ;
110115 let left_schema_routine_privileges = left_routine_privileges. iter ( ) . filter ( |p| p. routine_schema == schema) . collect ( ) ;
111116 let right_schema_routine_privileges = right_routine_privileges. iter ( ) . filter ( |p| p. routine_schema == schema) . collect ( ) ;
112- let routines = self . compare_routines ( left_schema_routines, right_schema_routines, left_schema_routine_privileges, right_schema_routine_privileges) ?;
117+ let routines = self . compare_routines (
118+ left_schema_routines,
119+ right_schema_routines,
120+ left_schema_routine_parameters,
121+ right_schema_routine_parameters,
122+ left_schema_routine_privileges,
123+ right_schema_routine_privileges) ?;
113124
114125 let left_schema_sequences = left_sequences. iter ( ) . filter ( |s| s. sequence_schema == schema) . collect ( ) ;
115126 let right_schema_sequences = right_sequences. iter ( ) . filter ( |s| s. sequence_schema == schema) . collect ( ) ;
@@ -172,39 +183,42 @@ impl Comparer {
172183 fn compare_routines ( & mut self ,
173184 left_routines : Vec < & Routine > ,
174185 right_routines : Vec < & Routine > ,
186+ left_routine_parameters : Vec < & RoutineParameter > ,
187+ right_routine_parameters : Vec < & RoutineParameter > ,
175188 left_routine_privileges : Vec < & RoutinePrivilege > ,
176189 right_routine_privileges : Vec < & RoutinePrivilege > ,
177190 ) -> Result < Report < RoutineComparison > , Error > {
178- let mut right_routines_map: HashMap < String , & Routine > = right_routines. into_iter ( ) . map ( |t | ( t . signature . clone ( ) , t ) ) . collect ( ) ;
191+ let mut right_routines_map: HashMap < String , & Routine > = right_routines. into_iter ( ) . map ( |r | ( routine_signature ( r , & right_routine_parameters ) , r ) ) . collect ( ) ;
179192 let mut entries = Vec :: new ( ) ;
180193
181194 for left_routine in left_routines {
182- let right_routine = right_routines_map. get ( & left_routine. signature ) ;
195+ let signature = routine_signature ( left_routine, & left_routine_parameters) ;
196+ let right_routine = right_routines_map. get ( & signature) ;
183197
184198 match right_routine {
185199 None => {
186- entries. push ( RoutineRemoved { routine_signature : left_routine . signature . clone ( ) } ) ;
200+ entries. push ( RoutineRemoved { routine_signature : signature. clone ( ) } ) ;
187201 } ,
188202 Some ( rr) => {
189203 let properties = self . compare_routine_properties ( & left_routine, rr) ;
190-
191- let left_routine_routine_privileges: Vec < & RoutinePrivilege > = left_routine_privileges. iter ( ) . filter ( |p| p. signature == left_routine. signature ) . cloned ( ) . collect ( ) ;
192- let right_routine_routine_privileges: Vec < & RoutinePrivilege > = right_routine_privileges. iter ( ) . filter ( |p| p. signature == rr. signature ) . cloned ( ) . collect ( ) ;
204+
205+ let left_routine_routine_privileges: Vec < & RoutinePrivilege > = left_routine_privileges. iter ( ) . filter ( |p| p. specific_catalog == left_routine. specific_catalog && p . specific_schema == left_routine . specific_schema && p . specific_name == left_routine . specific_name ) . cloned ( ) . collect ( ) ;
206+ let right_routine_routine_privileges: Vec < & RoutinePrivilege > = right_routine_privileges. iter ( ) . filter ( |p| p. specific_catalog == rr. specific_catalog && p . specific_schema == rr . specific_schema && p . specific_name == rr . specific_name ) . cloned ( ) . collect ( ) ;
193207 let privileges = self . compare_routine_privileges ( left_routine_routine_privileges, right_routine_routine_privileges) ?;
194208
195- entries. push ( RoutineMaintained { routine_signature : left_routine . signature . clone ( ) , properties, privileges } ) ;
209+ entries. push ( RoutineMaintained { routine_signature : signature. clone ( ) , properties, privileges } ) ;
196210
197- right_routines_map. remove ( & rr . signature . clone ( ) ) ;
211+ right_routines_map. remove ( & signature) ;
198212 }
199213 }
200214 }
201215
202216 if right_routines_map. len ( ) > 0 {
203- let mut added_routines : Vec < & & Routine > = right_routines_map. values ( ) . collect ( ) ;
204- added_routines . sort_unstable_by_key ( |r| & r . signature ) ;
217+ let mut added_signatures : Vec < & String > = right_routines_map. keys ( ) . collect ( ) ;
218+ added_signatures . sort_unstable ( ) ;
205219
206- for right_routine in added_routines {
207- entries. push ( RoutineAdded { routine_signature : right_routine . signature . clone ( ) } ) ;
220+ for added_signature in added_signatures {
221+ entries. push ( RoutineAdded { routine_signature : added_signature . clone ( ) } ) ;
208222 }
209223 }
210224
@@ -786,4 +800,37 @@ impl Comparer {
786800 PropertyChanged { property_name : String :: from ( property_name) , left_value : left. to_string ( ) , right_value : right. to_string ( ) }
787801 }
788802 }
803+
804+ }
805+
806+ fn routine_signature ( routine : & Routine , all_parameters : & Vec < & RoutineParameter > ) -> String {
807+ let parameters : Vec < & RoutineParameter > = all_parameters. iter ( ) . filter ( |p| p. specific_catalog == routine. specific_catalog && p. specific_schema == routine. specific_schema && p. specific_name == routine. specific_name ) . cloned ( ) . collect ( ) ;
808+
809+ let mut signature = routine. routine_name . clone ( ) ;
810+ signature. push ( '(' ) ;
811+
812+ for ( index, parameter) in parameters. iter ( ) . enumerate ( ) {
813+ if index > 0 {
814+ signature. push_str ( ", " )
815+ }
816+
817+ let parameter_name = match & parameter. parameter_name {
818+ Some ( parameter_name) => parameter_name,
819+ None => & format ! ( "${}" , parameter. ordinal_position) ,
820+ } ;
821+
822+ signature. push_str ( parameter_name) ;
823+ signature. push ( ' ' ) ;
824+ signature. push_str ( & parameter. parameter_mode ) ;
825+ signature. push ( ' ' ) ;
826+ signature. push_str ( & parameter. udt_catalog ) ;
827+ signature. push ( '.' ) ;
828+ signature. push_str ( & parameter. udt_schema ) ;
829+ signature. push ( '.' ) ;
830+ signature. push_str ( & parameter. udt_name ) ;
831+ }
832+
833+ signature. push ( ')' ) ;
834+
835+ signature
789836}
0 commit comments