Class RowDeserializers
java.lang.Object
io.debezium.connector.binlog.event.RowDeserializers
Custom deserializers for the binlog client library.
A few of the
AbstractRowsEventDataDeserializer convert row data into Date, Time,
and Timestamp values using Calendar instances (and thus implicitly uses the local timezone
to calculate the milliseconds past epoch. Rather than perform this conversion, we prefer to convert the
raw values directly into LocalDate, LocalTime, and OffsetDateTime.
Unfortunately, all the methods used to deserialize individuals values are defined on the AbstractRowsEventDataDeserializer
base class, and inherited by the DeleteRowsEventDataDeserializer, UpdateRowsEventDataDeserializer,
and WriteRowsEventDataDeserializer subclasses. Since we cannot provide a new base class, the simplest
way to override is to subclass each of these 3 subclasses and override the methods on them all.
See MySQL Date Time documentation.- Author:
- Randall Hauch, Chris Cranford
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classA specialization ofDeleteRowsEventDataDeserializerthat convertsDATE,TIME,DATETIME, andTIMESTAMPvalues toLocalDate,LocalTime,LocalDateTime, andOffsetDateTimeobjects, respectively.static classA specialization ofUpdateRowsEventDataDeserializerthat convertsDATE,TIME,DATETIME, andTIMESTAMPvalues toLocalDate,LocalTime,LocalDateTime, andOffsetDateTimeobjects, respectively.static classA specialization ofWriteRowsEventDataDeserializerthat convertsDATE,TIME,DATETIME, andTIMESTAMPvalues toLocalDate,LocalTime,LocalDateTime, andOffsetDateTimeobjects, respectively. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final org.slf4j.Loggerprivate static final intprivate static final int -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected static longbigEndianLong(byte[] bytes, int offset, int length) Read a big-endian long value.protected static intbitSlice(long value, int bitOffset, int numberOfBits, int payloadSize) Slice an integer out of a portion of long value.protected static SerializabledeserializeDate(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) Converts aDATEvalue to aLocalDate.protected static SerializabledeserializeDatetime(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) Converts aDATETIMEvalue without fractional seconds to aLocalDateTime.protected static SerializabledeserializeDatetimeV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) Converts aDATETIMEvalue with fractional seconds to aLocalDateTime.protected static intdeserializeFractionalSecondsInNanos(int fsp, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Read the binary input stream to obtain the number of nanoseconds given the fractional seconds precision, or fsp.protected static SerializabledeserializeString(int length, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts a database string to abyte[].protected static SerializabledeserializeTime(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts aTIMEvalue without fractional seconds to aDuration.protected static SerializabledeserializeTimestamp(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts aTIMESTAMPvalue without fractional seconds to aOffsetDateTime.protected static SerializabledeserializeTimestampV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts aTIMESTAMPvalue with fractional seconds to aOffsetDateTime.protected static SerializabledeserializeTimeV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts aTIMEvalue with fractional seconds to aDuration.protected static SerializabledeserializeVarString(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts a database string to abyte[].protected static SerializabledeserializeYear(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) Converts aYEARvalue to aYearobject.private static SerializablehandleException(CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode, String columnType, Exception e, Serializable defaultValue) protected static int[]split(long value, int divider, int length) Split the integer into multiple integers.
-
Field Details
-
LOGGER
private static final org.slf4j.Logger LOGGER -
MASK_10_BITS
private static final int MASK_10_BITS- See Also:
-
MASK_6_BITS
private static final int MASK_6_BITS- See Also:
-
-
Constructor Details
-
RowDeserializers
private RowDeserializers()
-
-
Method Details
-
deserializeString
protected static Serializable deserializeString(int length, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts a database string to abyte[].- Parameters:
length- the number of bytes used to store the length of the stringinputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
byte[]object - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeVarString
protected static Serializable deserializeVarString(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts a database string to abyte[].- Parameters:
meta- themetavalue containing the number of bytes in the length fieldinputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
byte[]object - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeDate
protected static Serializable deserializeDate(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) throws IOException Converts aDATEvalue to aLocalDate.This method treats all zero values for
DATEcolumns as NULL, since they cannot be accurately represented as validLocalDateobjects.- Parameters:
inputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
LocalDateobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeTime
protected static Serializable deserializeTime(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts aTIMEvalue without fractional seconds to aDuration.- Parameters:
inputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
LocalTimeobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeTimeV2
protected static Serializable deserializeTimeV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts aTIMEvalue with fractional seconds to aDuration.- Parameters:
meta- themetavalue containing the fractional second precision, orfspinputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
Durationobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeDatetime
protected static Serializable deserializeDatetime(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) throws IOException Converts aDATETIMEvalue without fractional seconds to aLocalDateTime.This method treats all zero values for
DATETIMEcolumns as NULL, since they cannot be accurately represented as validLocalDateTimeobjects.- Parameters:
inputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
LocalDateTimeobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeDatetimeV2
protected static Serializable deserializeDatetimeV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream, CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode) throws IOException Converts aDATETIMEvalue with fractional seconds to aLocalDateTime.This method treats all zero values for
DATETIMEcolumns as NULL, since they cannot be accurately represented as validLocalDateTimeobjects.- Parameters:
meta- themetavalue containing the fractional second precision, orfspinputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
LocalDateTimeobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeTimestamp
protected static Serializable deserializeTimestamp(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts aTIMESTAMPvalue without fractional seconds to aOffsetDateTime. MySQL stores theTIMESTAMPvalues as seconds past epoch in UTC, but the resultingOffsetDateTimewill be in the local timezone.- Parameters:
inputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
OffsetDateTimeobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeTimestampV2
protected static Serializable deserializeTimestampV2(int meta, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts aTIMESTAMPvalue with fractional seconds to aOffsetDateTime. MySQL stores theTIMESTAMPvalues as seconds + fractional seconds past epoch in UTC, but the resultingOffsetDateTimewill be in the local timezone.- Parameters:
meta- themetavalue containing the fractional second precision, orfspinputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
OffsetDateTimeobject - Throws:
IOException- if there is an error reading from the binlog event data
-
deserializeYear
protected static Serializable deserializeYear(com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Converts aYEARvalue to aYearobject.- Parameters:
inputStream- the binary stream containing the raw binlog event data for the value- Returns:
- the
Yearobject - Throws:
IOException- if there is an error reading from the binlog event data
-
split
protected static int[] split(long value, int divider, int length) Split the integer into multiple integers. We can't use/access the privatesplitmethod in theAbstractRowsEventDataDeserializerclass, so we replicate it here. Note the original is licensed under the same Apache Software License 2.0 as Debezium.- Parameters:
value- the long valuedivider- the value used to separate the individual values (e.g., 10 to separate each digit into a separate value, 100 to separate each pair of digits into a separate value, 1000 to separate each 3 digits into a separate value, etc.)length- the expected length of the integer array- Returns:
- the integer values
-
bigEndianLong
protected static long bigEndianLong(byte[] bytes, int offset, int length) Read a big-endian long value. We can't use/access the privatebigEndianLongmethod in theAbstractRowsEventDataDeserializerclass, so we replicate it here. Note the original is licensed under the same Apache Software License 2.0 as Debezium.- Parameters:
bytes- the bytes containing the big-endian representation of the valueoffset- the offset within thebytesbyte array where the value startslength- the length of the byte representation within thebytesbyte array- Returns:
- the long value
-
bitSlice
protected static int bitSlice(long value, int bitOffset, int numberOfBits, int payloadSize) Slice an integer out of a portion of long value. We can't use/access the privatebitSlicemethod in theAbstractRowsEventDataDeserializerclass, so we replicate it here. Note the original is licensed under the same Apache Software License 2.0 as Debezium.- Parameters:
value- the long containing the integer encoded within itbitOffset- the number of bits where the integer value startsnumberOfBits- the number of bits in the integer valuepayloadSize- the total number of bits used in thevalue- Returns:
- the integer value
-
deserializeFractionalSecondsInNanos
protected static int deserializeFractionalSecondsInNanos(int fsp, com.github.shyiko.mysql.binlog.io.ByteArrayInputStream inputStream) throws IOException Read the binary input stream to obtain the number of nanoseconds given the fractional seconds precision, or fsp. We can't use/access thedeserializeFractionalSecondsmethod in theAbstractRowsEventDataDeserializerclass, so we replicate it here with modifications to support nanoseconds rather than microseconds. Note the original is licensed under the same Apache Software License 2.0 as Debezium.- Parameters:
fsp- the fractional seconds precision describing the number of digits precision used to store the fractional seconds (e.g., 1 for storing tenths of a second, 2 for storing hundredths, 3 for storing milliseconds, etc.)inputStream- the binary data stream- Returns:
- the number of nanoseconds
- Throws:
IOException- if there is an error reading from the binlog event data
-
handleException
private static Serializable handleException(CommonConnectorConfig.EventProcessingFailureHandlingMode eventProcessingFailureHandlingMode, String columnType, Exception e, Serializable defaultValue)
-