@@ -405,49 +405,59 @@ impl Database {
405405
406406 // Optimize job - configurable schedule (default: every 30mins)
407407 let optimize_schedule = env:: var ( "TIMEFUSION_OPTIMIZE_SCHEDULE" ) . unwrap_or_else ( |_| "0 */30 * * * *" . to_string ( ) ) ;
408- info ! ( "Optimize job scheduled with cron expression: {}" , optimize_schedule) ;
408+
409+ if !optimize_schedule. is_empty ( ) {
410+ info ! ( "Optimize job scheduled with cron expression: {}" , optimize_schedule) ;
409411
410- let optimize_job = Job :: new_async ( & optimize_schedule, {
411- let db = db. clone ( ) ;
412- move |_, _| {
412+ let optimize_job = Job :: new_async ( & optimize_schedule, {
413413 let db = db. clone ( ) ;
414- Box :: pin ( async move {
415- info ! ( "Running scheduled optimize on all tables" ) ;
416- for ( ( project_id, table_name) , table) in db. project_configs . read ( ) . await . iter ( ) {
417- if let Err ( e) = db. optimize_table ( table, None ) . await {
418- error ! ( "Optimize failed for project '{}' table '{}': {}" , project_id, table_name, e) ;
414+ move |_, _| {
415+ let db = db. clone ( ) ;
416+ Box :: pin ( async move {
417+ info ! ( "Running scheduled optimize on all tables" ) ;
418+ for ( ( project_id, table_name) , table) in db. project_configs . read ( ) . await . iter ( ) {
419+ if let Err ( e) = db. optimize_table ( table, None ) . await {
420+ error ! ( "Optimize failed for project '{}' table '{}': {}" , project_id, table_name, e) ;
421+ }
419422 }
420- }
421- } )
422- }
423- } ) ?;
423+ } )
424+ }
425+ } ) ?;
424426
425- scheduler. add ( optimize_job) . await ?;
427+ scheduler. add ( optimize_job) . await ?;
428+ } else {
429+ info ! ( "Optimize job scheduling skipped - empty schedule" ) ;
430+ }
426431
427432 // Vacuum job - configurable schedule (default: daily at 2AM)
428433 let vacuum_schedule = env:: var ( "TIMEFUSION_VACUUM_SCHEDULE" ) . unwrap_or_else ( |_| "0 0 2 * * *" . to_string ( ) ) ;
429- info ! ( "Vacuum job scheduled with cron expression: {}" , vacuum_schedule) ;
434+
435+ if !vacuum_schedule. is_empty ( ) {
436+ info ! ( "Vacuum job scheduled with cron expression: {}" , vacuum_schedule) ;
430437
431- let vacuum_job = Job :: new_async ( & vacuum_schedule, {
432- let db = db. clone ( ) ;
433- move |_, _| {
438+ let vacuum_job = Job :: new_async ( & vacuum_schedule, {
434439 let db = db. clone ( ) ;
435- Box :: pin ( async move {
436- info ! ( "Running scheduled vacuum on all tables" ) ;
437- let retention_hours = env:: var ( "TIMEFUSION_VACUUM_RETENTION_HOURS" )
438- . unwrap_or_else ( |_| DEFAULT_VACUUM_RETENTION_HOURS . to_string ( ) )
439- . parse :: < u64 > ( )
440- . unwrap_or ( DEFAULT_VACUUM_RETENTION_HOURS ) ;
441-
442- for ( ( project_id, table_name) , table) in db. project_configs . read ( ) . await . iter ( ) {
443- info ! ( "Vacuuming project '{}' table '{}' (retention: {}h)" , project_id, table_name, retention_hours) ;
444- db. vacuum_table ( table, retention_hours) . await ;
445- }
446- } )
447- }
448- } ) ?;
440+ move |_, _| {
441+ let db = db. clone ( ) ;
442+ Box :: pin ( async move {
443+ info ! ( "Running scheduled vacuum on all tables" ) ;
444+ let retention_hours = env:: var ( "TIMEFUSION_VACUUM_RETENTION_HOURS" )
445+ . unwrap_or_else ( |_| DEFAULT_VACUUM_RETENTION_HOURS . to_string ( ) )
446+ . parse :: < u64 > ( )
447+ . unwrap_or ( DEFAULT_VACUUM_RETENTION_HOURS ) ;
448+
449+ for ( ( project_id, table_name) , table) in db. project_configs . read ( ) . await . iter ( ) {
450+ info ! ( "Vacuuming project '{}' table '{}' (retention: {}h)" , project_id, table_name, retention_hours) ;
451+ db. vacuum_table ( table, retention_hours) . await ;
452+ }
453+ } )
454+ }
455+ } ) ?;
449456
450- scheduler. add ( vacuum_job) . await ?;
457+ scheduler. add ( vacuum_job) . await ?;
458+ } else {
459+ info ! ( "Vacuum job scheduling skipped - empty schedule" ) ;
460+ }
451461
452462 // Cache stats job - every 5 minutes
453463 let cache_stats_job = Job :: new_async ( "0 */5 * * * *" , {
0 commit comments