Skip to content

Commit 85fcc35

Browse files
committed
Add support to deserializeTimeV2New
1 parent 492e4f1 commit 85fcc35

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java

+63-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,11 @@ protected Serializable deserializeCell(ColumnType type, int meta, int length, Bi
284284
case TIME:
285285
return deserializeTime(eventDataReader);
286286
case TIME_V2:
287-
return deserializeTimeV2(meta, eventDataReader);
287+
if (deserializeWithNewTimeV2) {
288+
return deserializeTimeV2New(meta, eventDataReader);
289+
} else {
290+
return deserializeTimeV2(meta, eventDataReader);
291+
}
288292
case TIMESTAMP:
289293
return deserializeTimestamp(eventDataReader);
290294
case TIMESTAMP_V2:
@@ -587,6 +591,64 @@ protected Serializable deserializeTimeV2New(int meta, ByteArrayInputStream input
587591
return result;
588592
}
589593

594+
protected Serializable deserializeTimeV2New(int meta, BinaryLogEventDataReader eventDataReader) throws IOException {
595+
long result;
596+
long intPart;
597+
long fracPart;
598+
599+
switch (meta) {
600+
case 1: case 2:
601+
intPart = eventDataReader.readLongBE(3) - TIMEF_INT_OFS;
602+
fracPart = eventDataReader.readUnsignedByte();
603+
604+
605+
if (intPart < 0 && fracPart != 0) {
606+
/*
607+
Negative values are stored with reverse fractional part order,
608+
for binary sort compatibility.
609+
610+
Disk value intpart fracPart Time value Memory value
611+
800000.00 0 0 00:00:00.00 0000000000.000000
612+
7FFFFF.FF -1 255 -00:00:00.01 FFFFFFFFFF.FFD8F0
613+
7FFFFF.9D -1 99 -00:00:00.99 FFFFFFFFFF.F0E4D0
614+
7FFFFF.00 -1 0 -00:00:01.00 FFFFFFFFFF.000000
615+
7FFFFE.FF -1 255 -00:00:01.01 FFFFFFFFFE.FFD8F0
616+
7FFFFE.F6 -2 246 -00:00:01.10 FFFFFFFFFE.FE7960
617+
618+
Formula to convert fractional part from disk format
619+
(now stored in "fracPart" variable) to absolute value: "0x100 - fracPart".
620+
To reconstruct in-memory value, we shift
621+
to the next integer value and then substruct fractional part.
622+
*/
623+
intPart++; /* Shift to the next integer value */
624+
fracPart -= 0x100; /* -(0x100 - fracPart) */
625+
}
626+
result = (intPart << 24) + (fracPart * 10000);
627+
break;
628+
case 3: case 4:
629+
intPart = eventDataReader.readLongBE(3) - TIMEF_INT_OFS;
630+
fracPart = eventDataReader.readLongBE(2);
631+
if (intPart < 0 && fracPart != 0) {
632+
/*
633+
Fix reverse fractional part order: "0x10000 - fracPart".
634+
See comments for FSP=1 and FSP=2 above.
635+
*/
636+
intPart++; /* Shift to the next integer value */
637+
fracPart -= 0x10000; /* -(0x10000-fracPart) */
638+
}
639+
result = (intPart << 24) + (fracPart * 100);
640+
break;
641+
case 5: case 6:
642+
result = eventDataReader.readLongBE(6) - TIMEF_OFS;
643+
break;
644+
default:
645+
intPart = eventDataReader.readLongBE(3) - TIMEF_INT_OFS;
646+
result = intPart << 24;
647+
}
648+
649+
return result;
650+
}
651+
590652
protected Serializable deserializeTimestamp(ByteArrayInputStream inputStream) throws IOException {
591653
long timestamp = inputStream.readLong(4) * 1000;
592654
if (deserializeDateAndTimeAsLong) {

0 commit comments

Comments
 (0)