diff --git a/src/binlog/misc.rs b/src/binlog/misc.rs index a80890d..35cdd5a 100644 --- a/src/binlog/misc.rs +++ b/src/binlog/misc.rs @@ -73,10 +73,12 @@ pub fn time_from_packed(mut tmp: i64) -> Value { }; let hms = my_packed_time_get_int_part(tmp); let h = ((hms >> 12) as u32) % (1 << 10); + let d = h / 24; + let h = h % 24; let m = ((hms >> 6) as u32) % (1 << 6); let s = ((hms) as u32) % (1 << 6); let u = my_packed_time_get_frac_part(tmp); - Value::Time(neg, 0, h as u8, m as u8, s as u8, u as u32) + Value::Time(neg, d, h as u8, m as u8, s as u8, u as u32) } pub fn my_datetime_packed_from_binary(mut input: T, dec: u32) -> io::Result { diff --git a/src/binlog/mod.rs b/src/binlog/mod.rs index 46f9ea7..235e75d 100644 --- a/src/binlog/mod.rs +++ b/src/binlog/mod.rs @@ -1190,6 +1190,26 @@ mod tests { } } + if file_path.file_name().unwrap() == "time_issue.000001" { + let event_data = ev.read_data().unwrap(); + match event_data { + Some(EventData::RowsEvent(ev)) => { + let table_map_event = + binlog_file.reader().get_tme(ev.table_id()).unwrap(); + let row = ev.rows(table_map_event).next().unwrap().unwrap(); + let after_image = row.1.unwrap(); + after_image.columns().iter().enumerate().for_each(|(i, _)| { + match after_image.as_ref(i).unwrap() { + BinlogValue::Value(val) => { + assert_eq!(val, &Value::Time(true, 21, 3, 48, 27, 0)); + } + _ => panic!("Expected a value"), + } + }); + } + _ => (), + } + } ev_pos = ev_end; } } diff --git a/test-data/binlogs/time_issue.000001 b/test-data/binlogs/time_issue.000001 new file mode 100644 index 0000000..d4fe9b4 Binary files /dev/null and b/test-data/binlogs/time_issue.000001 differ