Package io.debezium.connector.postgresql
Class PostgresValueConverter
- java.lang.Object
-
- io.debezium.jdbc.JdbcValueConverters
-
- io.debezium.connector.postgresql.PostgresValueConverter
-
- All Implemented Interfaces:
ValueConverterProvider
public class PostgresValueConverter extends JdbcValueConverters
A provider ofValueConverters andSchemaBuilders for various Postgres specific column types. In addition to handling data type conversion from values coming from JDBC, this is also expected to handle data type conversion for data types coming from the logical decoding plugin.- Author:
- Horia Chiorean (hchiorea@redhat.com)
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class io.debezium.jdbc.JdbcValueConverters
JdbcValueConverters.BigIntUnsignedMode, JdbcValueConverters.DecimalMode
-
-
Field Summary
Fields Modifier and Type Field Description private CharsetdatabaseCharsetThe current database's character encoding.private PostgresConnectorConfig.HStoreHandlingModehStoreModeprivate booleanincludeUnknownDatatypestrueif fields of data type not know should be handle as opaque binary;falseif they should be omittedprivate PostgresConnectorConfig.IntervalHandlingModeintervalModeprivate com.fasterxml.jackson.core.JsonFactoryjsonFactoryprivate static BigDecimalMICROSECONDS_PER_SECONDstatic StringN_A_NA string denoting not-a- number for FP and Numeric typesstatic StringNEGATIVE_INFINITYA string denoting negative infinity for FP and Numeric typesstatic InstantNEGATIVE_INFINITY_INSTANTstatic LocalDateTimeNEGATIVE_INFINITY_LOCAL_DATE_TIMEstatic OffsetDateTimeNEGATIVE_INFINITY_OFFSET_DATE_TIMEstatic TimestampNEGATIVE_INFINITY_TIMESTAMPstatic StringPOSITIVE_INFINITYA string denoting positive infinity for FP and Numeric typesstatic InstantPOSITIVE_INFINITY_INSTANTstatic LocalDateTimePOSITIVE_INFINITY_LOCAL_DATE_TIMEstatic OffsetDateTimePOSITIVE_INFINITY_OFFSET_DATE_TIMEstatic TimestampPOSITIVE_INFINITY_TIMESTAMPprivate static DateTimeFormatterTIME_WITH_TIMEZONE_FORMATTERA formatter used to parse TIMETZ columns when provided as strings.private byte[]toastPlaceholderBinaryprivate StringtoastPlaceholderStringprivate TypeRegistrytypeRegistryprivate static intVARIABLE_SCALE_DECIMAL_LENGTHVariable scale decimal/numeric is defined by metadata scale - 0 length - 131089-
Fields inherited from class io.debezium.jdbc.JdbcValueConverters
adaptiveTimeMicrosecondsPrecisionMode, adaptiveTimePrecisionMode, bigIntUnsignedMode, binaryMode, decimalMode, logger
-
-
Constructor Summary
Constructors Modifier Constructor Description protectedPostgresValueConverter(Charset databaseCharset, JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, ZoneOffset defaultOffset, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, boolean includeUnknownDatatypes, TypeRegistry typeRegistry, PostgresConnectorConfig.HStoreHandlingMode hStoreMode, CommonConnectorConfig.BinaryHandlingMode binaryMode, PostgresConnectorConfig.IntervalHandlingMode intervalMode, byte[] toastPlaceholder)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private StringasHstoreString(byte[] data)Returns an Hstore field as string in the form of"key 1"=>"value1", "key_2"=>"val 1"; i.e.private StringchangePlainStringRepresentationToJsonStringRepresentation(String text)protected ObjectconvertArray(Column column, org.apache.kafka.connect.data.Field fieldDefn, PostgresType elementType, ValueConverter elementConverter, Object data)protected ObjectconvertBinaryToBase64(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertBinaryToBytes(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)Extracts a value from a PGobject .protected ObjectconvertBinaryToHex(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertBit(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertBits(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, int numBytes)protected ObjectconvertCitext(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertDecimal(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, JdbcValueConverters.DecimalMode mode)ValueConverterconverter(Column column, org.apache.kafka.connect.data.Field fieldDefn)protected ObjectconvertGeography(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertGeometry(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertHStore(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, PostgresConnectorConfig.HStoreHandlingMode mode)private ObjectconvertHstoreToJsonString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private ObjectconvertHstoreToMap(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertInterval(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private ObjectconvertLtree(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private ObjectconvertLtreeArray(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private StringconvertMapToJsonStringRepresentation(Map<String,String> map)protected ObjectconvertMoney(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertPoint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)Converts a value representing a Postgres point for a column, to a Kafka Connect value.protected ObjectconvertString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)Replaces toasted value with a placeholderprotected ObjectconvertTime(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertTimestampToLocalDateTime(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertTimestampWithZone(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)protected ObjectconvertTimeWithZone(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private ValueConvertercreateArrayConverter(Column column, org.apache.kafka.connect.data.Field fieldDefn)protected intgetTimePrecision(Column column)protected ObjecthandleUnknownData(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)private org.apache.kafka.connect.data.SchemaBuilderhstoreSchema()private booleanisVariableScaleDecimal(Column column)private org.apache.kafka.connect.data.SchemaBuildernumericSchema(Column column)static PostgresValueConverterof(PostgresConnectorConfig connectorConfig, Charset databaseCharset, TypeRegistry typeRegistry)private ObjectresolveArrayValue(Object value, PostgresType elementType)org.apache.kafka.connect.data.SchemaBuilderschemaBuilder(Column column)static Optional<SpecialValueDecimal>toSpecialValue(String value)-
Methods inherited from class io.debezium.jdbc.JdbcValueConverters
byteOrderOfBitType, convertBigInt, convertBinary, convertBits, convertBoolean, convertDateToEpochDays, convertDateToEpochDaysAsDate, convertDecimal, convertDouble, convertFloat, convertInteger, convertNumeric, convertReal, convertRowId, convertSmallInt, convertTimestampToEpochMicros, convertTimestampToEpochMillis, convertTimestampToEpochMillisAsDate, convertTimestampToEpochNanos, convertTimeToMicrosPastMidnight, convertTimeToMillisPastMidnight, convertTimeToMillisPastMidnightAsDate, convertTimeToNanosPastMidnight, convertTinyInt, convertValue, normalizeBinaryData, padLittleEndian, toBigDecimal, toByteBuffer, unexpectedBinary, withScaleAdjustedIfNeeded
-
-
-
-
Field Detail
-
POSITIVE_INFINITY_TIMESTAMP
public static final Timestamp POSITIVE_INFINITY_TIMESTAMP
-
POSITIVE_INFINITY_INSTANT
public static final Instant POSITIVE_INFINITY_INSTANT
-
POSITIVE_INFINITY_LOCAL_DATE_TIME
public static final LocalDateTime POSITIVE_INFINITY_LOCAL_DATE_TIME
-
POSITIVE_INFINITY_OFFSET_DATE_TIME
public static final OffsetDateTime POSITIVE_INFINITY_OFFSET_DATE_TIME
-
NEGATIVE_INFINITY_TIMESTAMP
public static final Timestamp NEGATIVE_INFINITY_TIMESTAMP
-
NEGATIVE_INFINITY_INSTANT
public static final Instant NEGATIVE_INFINITY_INSTANT
-
NEGATIVE_INFINITY_LOCAL_DATE_TIME
public static final LocalDateTime NEGATIVE_INFINITY_LOCAL_DATE_TIME
-
NEGATIVE_INFINITY_OFFSET_DATE_TIME
public static final OffsetDateTime NEGATIVE_INFINITY_OFFSET_DATE_TIME
-
VARIABLE_SCALE_DECIMAL_LENGTH
private static final int VARIABLE_SCALE_DECIMAL_LENGTH
Variable scale decimal/numeric is defined by metadata scale - 0 length - 131089- See Also:
- Constant Field Values
-
N_A_N
public static final String N_A_N
A string denoting not-a- number for FP and Numeric types- See Also:
- Constant Field Values
-
POSITIVE_INFINITY
public static final String POSITIVE_INFINITY
A string denoting positive infinity for FP and Numeric types- See Also:
- Constant Field Values
-
NEGATIVE_INFINITY
public static final String NEGATIVE_INFINITY
A string denoting negative infinity for FP and Numeric types- See Also:
- Constant Field Values
-
MICROSECONDS_PER_SECOND
private static final BigDecimal MICROSECONDS_PER_SECOND
-
TIME_WITH_TIMEZONE_FORMATTER
private static final DateTimeFormatter TIME_WITH_TIMEZONE_FORMATTER
A formatter used to parse TIMETZ columns when provided as strings.
-
includeUnknownDatatypes
private final boolean includeUnknownDatatypes
trueif fields of data type not know should be handle as opaque binary;falseif they should be omitted
-
typeRegistry
private final TypeRegistry typeRegistry
-
hStoreMode
private final PostgresConnectorConfig.HStoreHandlingMode hStoreMode
-
intervalMode
private final PostgresConnectorConfig.IntervalHandlingMode intervalMode
-
databaseCharset
private final Charset databaseCharset
The current database's character encoding.
-
jsonFactory
private final com.fasterxml.jackson.core.JsonFactory jsonFactory
-
toastPlaceholderString
private final String toastPlaceholderString
-
toastPlaceholderBinary
private final byte[] toastPlaceholderBinary
-
-
Constructor Detail
-
PostgresValueConverter
protected PostgresValueConverter(Charset databaseCharset, JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, ZoneOffset defaultOffset, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, boolean includeUnknownDatatypes, TypeRegistry typeRegistry, PostgresConnectorConfig.HStoreHandlingMode hStoreMode, CommonConnectorConfig.BinaryHandlingMode binaryMode, PostgresConnectorConfig.IntervalHandlingMode intervalMode, byte[] toastPlaceholder)
-
-
Method Detail
-
of
public static PostgresValueConverter of(PostgresConnectorConfig connectorConfig, Charset databaseCharset, TypeRegistry typeRegistry)
-
schemaBuilder
public org.apache.kafka.connect.data.SchemaBuilder schemaBuilder(Column column)
- Specified by:
schemaBuilderin interfaceValueConverterProvider- Overrides:
schemaBuilderin classJdbcValueConverters
-
numericSchema
private org.apache.kafka.connect.data.SchemaBuilder numericSchema(Column column)
-
hstoreSchema
private org.apache.kafka.connect.data.SchemaBuilder hstoreSchema()
-
converter
public ValueConverter converter(Column column, org.apache.kafka.connect.data.Field fieldDefn)
- Specified by:
converterin interfaceValueConverterProvider- Overrides:
converterin classJdbcValueConverters
-
createArrayConverter
private ValueConverter createArrayConverter(Column column, org.apache.kafka.connect.data.Field fieldDefn)
-
convertTime
protected Object convertTime(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertTimein classJdbcValueConverters
-
convertDecimal
protected Object convertDecimal(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, JdbcValueConverters.DecimalMode mode)
-
convertHStore
protected Object convertHStore(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, PostgresConnectorConfig.HStoreHandlingMode mode)
-
convertLtree
private Object convertLtree(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertLtreeArray
private Object convertLtreeArray(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertHstoreToMap
private Object convertHstoreToMap(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
asHstoreString
private String asHstoreString(byte[] data)
Returns an Hstore field as string in the form of"key 1"=>"value1", "key_2"=>"val 1"; i.e. the given byte array is NOT the byte representation returned by {@link HStoreConverter#toBytes(Map, org.postgresql.core.Encoding))}, but the String based representation
-
convertHstoreToJsonString
private Object convertHstoreToJsonString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
changePlainStringRepresentationToJsonStringRepresentation
private String changePlainStringRepresentationToJsonStringRepresentation(String text)
-
convertMapToJsonStringRepresentation
private String convertMapToJsonStringRepresentation(Map<String,String> map)
-
convertBit
protected Object convertBit(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertBitin classJdbcValueConverters
-
convertBits
protected Object convertBits(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, int numBytes)
- Overrides:
convertBitsin classJdbcValueConverters
-
convertMoney
protected Object convertMoney(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertInterval
protected Object convertInterval(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertTimestampWithZone
protected Object convertTimestampWithZone(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertTimestampWithZonein classJdbcValueConverters
-
convertTimeWithZone
protected Object convertTimeWithZone(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertTimeWithZonein classJdbcValueConverters
-
convertGeometry
protected Object convertGeometry(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertGeography
protected Object convertGeography(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertCitext
protected Object convertCitext(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
convertPoint
protected Object convertPoint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
Converts a value representing a Postgres point for a column, to a Kafka Connect value.- Parameters:
column- the JDBC column; never nullfieldDefn- the Connect field definition for this column; never nulldata- a data for the point column, either coming from the JDBC driver or logical decoding plugin- Returns:
- a value which will be used by Connect to represent the actual point value
-
convertArray
protected Object convertArray(Column column, org.apache.kafka.connect.data.Field fieldDefn, PostgresType elementType, ValueConverter elementConverter, Object data)
-
resolveArrayValue
private Object resolveArrayValue(Object value, PostgresType elementType)
-
isVariableScaleDecimal
private boolean isVariableScaleDecimal(Column column)
-
toSpecialValue
public static Optional<SpecialValueDecimal> toSpecialValue(String value)
-
convertTimestampToLocalDateTime
protected Object convertTimestampToLocalDateTime(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
-
getTimePrecision
protected int getTimePrecision(Column column)
- Overrides:
getTimePrecisionin classJdbcValueConverters
-
convertBinaryToBytes
protected Object convertBinaryToBytes(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
Extracts a value from a PGobject .- Overrides:
convertBinaryToBytesin classJdbcValueConverters- Parameters:
column- the column definition describing thedatavalue; never nullfieldDefn- the field definition; never nulldata- the data object to be converted into a Kafka Connect type- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException- if the value could not be converted but the column does not allow nulls
-
convertBinaryToBase64
protected Object convertBinaryToBase64(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertBinaryToBase64in classJdbcValueConverters
-
convertBinaryToHex
protected Object convertBinaryToHex(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
convertBinaryToHexin classJdbcValueConverters
-
convertString
protected Object convertString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
Replaces toasted value with a placeholder- Overrides:
convertStringin classJdbcValueConverters- Parameters:
column- the column definition describing thedatavalue; never nullfieldDefn- the field definition; never nulldata- the data object to be converted into a Kafka Connect type- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException- if the value could not be converted but the column does not allow nulls
-
handleUnknownData
protected Object handleUnknownData(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
- Overrides:
handleUnknownDatain classJdbcValueConverters
-
-