From 4fa2a6eba4c38d2e5411e2410a7821bc638bff51 Mon Sep 17 00:00:00 2001 From: gywndi Date: Fri, 5 Jan 2018 15:26:45 +0900 Subject: [PATCH] add ServerTimeZone --- .../AbstractRowsEventDataDeserializer.java | 9 +++++++-- .../deserialization/EventDeserializer.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java b/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java index bc4aa7cb..f0bf1cdf 100644 --- a/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java +++ b/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java @@ -74,6 +74,7 @@ public abstract class AbstractRowsEventDataDeserializer imp private boolean deserializeDateAndTimeAsLong; private boolean microsecondsPrecision; private boolean deserializeCharAndBinaryAsByteArray; + private static int serverTimezoneDiff; public AbstractRowsEventDataDeserializer(Map tableMapEventByTableId) { this.tableMapEventByTableId = tableMapEventByTableId; @@ -91,6 +92,10 @@ void setDeserializeCharAndBinaryAsByteArray(boolean value) { this.deserializeCharAndBinaryAsByteArray = value; } + void setServerTimezoneDiff(int serverTimezoneDiff) { + this.serverTimezoneDiff = serverTimezoneDiff; + } + protected Serializable[] deserializeRow(long tableId, BitSet includedColumns, ByteArrayInputStream inputStream) throws IOException { TableMapEventData tableMapEvent = tableMapEventByTableId.get(tableId); @@ -538,7 +543,7 @@ public static long from(int year, int month, int day, int hour, int minute, int long daysUpToMonth = isLeapYear(year) ? LEAP_YEAR_DAYS_BY_MONTH[month - 1] : YEAR_DAYS_BY_MONTH[month - 1]; timestamp += ((daysUpToMonth + day - 1) * 24 * 60 * 60) + (hour * 60 * 60) + (minute * 60) + (second); - timestamp = timestamp * 1000 + millis; + timestamp = timestamp * 1000 + millis - serverTimezoneDiff; return timestamp; } @@ -553,7 +558,7 @@ private static long fallbackToGC(int year, int month, int dayOfMonth, int hourOf c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, second); c.set(Calendar.MILLISECOND, millis); - return c.getTimeInMillis(); + return c.getTimeInMillis() - serverTimezoneDiff; } private static int leapYears(int from, int end) { diff --git a/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/EventDeserializer.java b/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/EventDeserializer.java index 061213b1..f0f6ae0f 100644 --- a/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/EventDeserializer.java +++ b/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/EventDeserializer.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; +import java.util.TimeZone; /** * @author Stanley Shyiko @@ -141,6 +142,23 @@ private void afterEventDataDeserializerSet(EventType eventType) { public void setChecksumType(ChecksumType checksumType) { this.checksumLength = checksumType.getLength(); } + + /** + * @see set timezone setting to calculate unix_timestamp + */ + public void setServerTimeZone(String tzId) { + // Check valiad timezone, invalid timezone would be UTC + String tz = TimeZone.getTimeZone(tzId).getID(); + + for (EventDataDeserializer eventDataDeserializer : eventDataDeserializers.values()) { + if (eventDataDeserializer instanceof AbstractRowsEventDataDeserializer) { + AbstractRowsEventDataDeserializer deserializer = + (AbstractRowsEventDataDeserializer) eventDataDeserializer; + // calculate time diff from UTC + deserializer.setServerTimezoneDiff(TimeZone.getTimeZone(tz).getRawOffset()); + } + } + } /** * @see CompatibilityMode