@@ -5,6 +5,7 @@ use std::pin::Pin;
55use std:: sync:: Arc ;
66
77use async_compression:: tokio:: write:: GzipEncoder ;
8+ use chrono:: TimeZone ;
89use futures:: io:: { BufReader , BufWriter } ;
910use futures:: { Stream , StreamExt , TryStreamExt } ;
1011use log:: { error, info, warn} ;
@@ -798,6 +799,17 @@ async fn pushlog_handler(
798799 ) . into ( ) )
799800}
800801
802+ fn file_name_to_file_msec ( filename : & str ) -> Result < i64 , String > {
803+ let without_ext = filename
804+ . strip_suffix ( ".log2" )
805+ . ok_or_else ( || format ! ( "Invalid file extension in '{filename}'" ) ) ?;
806+
807+ let datetime = chrono:: NaiveDateTime :: parse_from_str ( without_ext, "%Y-%m-%dT%H-%M-%S-%3f" )
808+ . map_err ( |e| format ! ( "Failed to parse '{filename}': {e}" ) ) ?;
809+
810+ Ok ( chrono:: Utc . from_utc_datetime ( & datetime) . timestamp_millis ( ) )
811+ }
812+
801813pub async fn getlog_handler (
802814 site_path : & str ,
803815 params : & GetLog2Params ,
@@ -844,17 +856,13 @@ pub async fn getlog_handler(
844856 match & params. since {
845857 GetLog2Since :: DateTime ( date_time) => {
846858 let since_ms = date_time. epoch_msec ( ) ;
847- let file_name_to_msec = |file_name : & str | file_name
848- . strip_suffix ( ".log2" )
849- . and_then ( |file| shvproto:: DateTime :: from_iso_str ( file) . ok ( ) . as_ref ( ) . map ( shvproto:: DateTime :: epoch_msec) )
850- . unwrap_or ( i64:: MAX ) ;
851859
852860 log_files
853861 . iter ( )
854862 . map ( DirEntry :: file_name)
855863 . enumerate ( )
856864 . rev ( )
857- . find ( |( _, file) | file_name_to_msec ( & file. to_string_lossy ( ) ) < since_ms)
865+ . find ( |( _, file) | file_name_to_file_msec ( & file. to_string_lossy ( ) ) . is_ok_and ( |ms| ms < since_ms) )
858866 . map ( |( idx, _) | idx)
859867 . unwrap_or ( 0 )
860868 }
0 commit comments