11use anyhow:: Result ;
22use colored:: Colorize ;
3+ use vespertide_loader:: { load_config, load_models} ;
34use vespertide_query:: { DatabaseBackend , build_plan_queries} ;
45
56use crate :: utils:: load_migrations;
67
7- pub fn cmd_log ( ) -> Result < ( ) > {
8- let plans = load_migrations ( & crate :: utils:: load_config ( ) ?) ?;
8+ pub fn cmd_log ( backend : DatabaseBackend ) -> Result < ( ) > {
9+ let config = load_config ( ) ?;
10+ let plans = load_migrations ( & config) ?;
911
1012 if plans. is_empty ( ) {
1113 println ! ( "{}" , "No migrations found." . bright_yellow( ) ) ;
@@ -19,7 +21,7 @@ pub fn cmd_log() -> Result<()> {
1921 plans. len( ) . to_string( ) . bright_yellow( ) . bold( )
2022 ) ;
2123 println ! ( ) ;
22-
24+ let current_models = load_models ( & config ) ? ;
2325 for plan in & plans {
2426 println ! (
2527 "{} {}" ,
@@ -42,22 +44,42 @@ pub fn cmd_log() -> Result<()> {
4244 plan. actions. len( ) . to_string( ) . bright_yellow( )
4345 ) ;
4446
45- let queries = build_plan_queries ( plan)
47+ let plan_queries = build_plan_queries ( plan, & current_models )
4648 . map_err ( |e| anyhow:: anyhow!( "query build error for v{}: {}" , plan. version, e) ) ?;
47- println ! (
48- " {} {}" ,
49- "SQL statements:" . bright_cyan( ) . bold( ) ,
50- queries. len( ) . to_string( ) . bright_yellow( ) . bold( )
51- ) ;
5249
53- for ( i, q ) in queries . iter ( ) . enumerate ( ) {
50+ for ( i, pq ) in plan_queries . iter ( ) . enumerate ( ) {
5451 println ! (
5552 " {}. {}" ,
5653 ( i + 1 ) . to_string( ) . bright_magenta( ) . bold( ) ,
57- q. build( DatabaseBackend :: Postgres ) . trim( ) . bright_white( )
54+ match backend {
55+ DatabaseBackend :: Postgres => pq
56+ . postgres
57+ . iter( )
58+ . map( |q| q. build( DatabaseBackend :: Postgres ) )
59+ . collect:: <Vec <_>>( )
60+ . join( ";\n " )
61+ . trim( )
62+ . bright_white( ) ,
63+ DatabaseBackend :: MySql => pq
64+ . mysql
65+ . iter( )
66+ . map( |q| q. build( DatabaseBackend :: MySql ) )
67+ . collect:: <Vec <_>>( )
68+ . join( ";\n " )
69+ . trim( )
70+ . bright_white( ) ,
71+ DatabaseBackend :: Sqlite => pq
72+ . sqlite
73+ . iter( )
74+ . map( |q| q. build( DatabaseBackend :: Sqlite ) )
75+ . collect:: <Vec <_>>( )
76+ . join( ";\n " )
77+ . trim( )
78+ . bright_white( ) ,
79+ }
5880 ) ;
59- println ! ( " {} {:?}" , "binds:" . bright_cyan( ) , q. binds( ) ) ;
6081 }
82+
6183 println ! ( ) ;
6284 }
6385
@@ -113,29 +135,85 @@ mod tests {
113135
114136 #[ test]
115137 #[ serial_test:: serial]
116- fn cmd_log_with_single_migration ( ) {
138+ fn cmd_log_with_single_migration_postgres ( ) {
117139 let tmp = tempdir ( ) . unwrap ( ) ;
118140 let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
119141
120142 let cfg = VespertideConfig :: default ( ) ;
121143 write_config ( & cfg) ;
122144 write_migration ( & cfg) ;
123145
124- let result = cmd_log ( ) ;
146+ let result = cmd_log ( DatabaseBackend :: Postgres ) ;
147+ assert ! ( result. is_ok( ) ) ;
148+ }
149+
150+ #[ test]
151+ #[ serial_test:: serial]
152+ fn cmd_log_with_single_migration_mysql ( ) {
153+ let tmp = tempdir ( ) . unwrap ( ) ;
154+ let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
155+
156+ let cfg = VespertideConfig :: default ( ) ;
157+ write_config ( & cfg) ;
158+ write_migration ( & cfg) ;
159+
160+ let result = cmd_log ( DatabaseBackend :: MySql ) ;
161+ assert ! ( result. is_ok( ) ) ;
162+ }
163+
164+ #[ test]
165+ #[ serial_test:: serial]
166+ fn cmd_log_with_single_migration_sqlite ( ) {
167+ let tmp = tempdir ( ) . unwrap ( ) ;
168+ let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
169+
170+ let cfg = VespertideConfig :: default ( ) ;
171+ write_config ( & cfg) ;
172+ write_migration ( & cfg) ;
173+
174+ let result = cmd_log ( DatabaseBackend :: Sqlite ) ;
175+ assert ! ( result. is_ok( ) ) ;
176+ }
177+
178+ #[ test]
179+ #[ serial_test:: serial]
180+ fn cmd_log_no_migrations_postgres ( ) {
181+ let tmp = tempdir ( ) . unwrap ( ) ;
182+ let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
183+
184+ let cfg = VespertideConfig :: default ( ) ;
185+ write_config ( & cfg) ;
186+ fs:: create_dir_all ( cfg. migrations_dir ( ) ) . unwrap ( ) ;
187+
188+ let result = cmd_log ( DatabaseBackend :: Postgres ) ;
189+ assert ! ( result. is_ok( ) ) ;
190+ }
191+
192+ #[ test]
193+ #[ serial_test:: serial]
194+ fn cmd_log_no_migrations_mysql ( ) {
195+ let tmp = tempdir ( ) . unwrap ( ) ;
196+ let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
197+
198+ let cfg = VespertideConfig :: default ( ) ;
199+ write_config ( & cfg) ;
200+ fs:: create_dir_all ( cfg. migrations_dir ( ) ) . unwrap ( ) ;
201+
202+ let result = cmd_log ( DatabaseBackend :: MySql ) ;
125203 assert ! ( result. is_ok( ) ) ;
126204 }
127205
128206 #[ test]
129207 #[ serial_test:: serial]
130- fn cmd_log_no_migrations ( ) {
208+ fn cmd_log_no_migrations_sqlite ( ) {
131209 let tmp = tempdir ( ) . unwrap ( ) ;
132210 let _guard = CwdGuard :: new ( & tmp. path ( ) . to_path_buf ( ) ) ;
133211
134212 let cfg = VespertideConfig :: default ( ) ;
135213 write_config ( & cfg) ;
136214 fs:: create_dir_all ( cfg. migrations_dir ( ) ) . unwrap ( ) ;
137215
138- let result = cmd_log ( ) ;
216+ let result = cmd_log ( DatabaseBackend :: Sqlite ) ;
139217 assert ! ( result. is_ok( ) ) ;
140218 }
141219}
0 commit comments