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 of ValueConverters and SchemaBuilders 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)
  • Field Details

    • POSITIVE_INFINITY_DATE

      public static final Date POSITIVE_INFINITY_DATE
    • 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
    • POSITIVE_INFINITY_LOCAL_DATE

      public static final LocalDate POSITIVE_INFINITY_LOCAL_DATE
    • NEGATIVE_INFINITY_DATE

      public static final Date NEGATIVE_INFINITY_DATE
    • 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
    • NEGATIVE_INFINITY_LOCAL_DATE

      public static final LocalDate NEGATIVE_INFINITY_LOCAL_DATE
    • 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:
    • N_A_N

      public static final String N_A_N
      A string denoting not-a- number for FP and Numeric types
      See Also:
    • POSITIVE_INFINITY

      public static final String POSITIVE_INFINITY
      A string denoting positive infinity for FP and Numeric types
      See Also:
    • NEGATIVE_INFINITY

      public static final String NEGATIVE_INFINITY
      A string denoting negative infinity for FP and Numeric types
      See Also:
    • 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
      true if fields of data type not know should be handle as opaque binary; false if they should be omitted
    • typeRegistry

      private final TypeRegistry typeRegistry
    • hStoreMode

    • intervalMode

    • databaseCharset

      private final Charset databaseCharset
      The current database's character encoding.
    • jsonFactory

      private final com.fasterxml.jackson.core.JsonFactory jsonFactory
    • unchangedToastedPlaceholder

      private final UnchangedToastedPlaceholder unchangedToastedPlaceholder
    • moneyFractionDigits

      private final int moneyFractionDigits
  • Constructor Details

  • Method Details

    • of

      public static PostgresValueConverter of(PostgresConnectorConfig connectorConfig, Charset databaseCharset, TypeRegistry typeRegistry)
    • schemaBuilder

      public org.apache.kafka.connect.data.SchemaBuilder schemaBuilder(Column column)
      Specified by:
      schemaBuilder in interface ValueConverterProvider
      Overrides:
      schemaBuilder in class JdbcValueConverters
    • numericSchema

      private org.apache.kafka.connect.data.SchemaBuilder numericSchema(Column column)
    • hstoreSchema

      private org.apache.kafka.connect.data.SchemaBuilder hstoreSchema()
    • moneySchema

      private org.apache.kafka.connect.data.SchemaBuilder moneySchema()
    • arrayElementSchema

      private org.apache.kafka.connect.data.SchemaBuilder arrayElementSchema(Column column)
    • converter

      public ValueConverter converter(Column column, org.apache.kafka.connect.data.Field fieldDefn)
      Specified by:
      converter in interface ValueConverterProvider
      Overrides:
      converter in class JdbcValueConverters
    • 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:
      convertTime in class JdbcValueConverters
    • 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:
      convertBit in class JdbcValueConverters
    • convertBits

      protected Object convertBits(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, int numBytes)
      Overrides:
      convertBits in class JdbcValueConverters
    • convertMoney

      protected Object convertMoney(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data, JdbcValueConverters.DecimalMode mode)
    • 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:
      convertTimestampWithZone in class JdbcValueConverters
    • convertTimeWithZone

      protected Object convertTimeWithZone(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
      Overrides:
      convertTimeWithZone in class JdbcValueConverters
    • 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)
    • convertIsbn

      protected Object convertIsbn(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 null
      fieldDefn - the Connect field definition for this column; never null
      data - 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:
      getTimePrecision in class JdbcValueConverters
    • convertBinaryToBytes

      protected Object convertBinaryToBytes(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
      Extracts a value from a PGobject .
      Overrides:
      convertBinaryToBytes in class JdbcValueConverters
      Parameters:
      column - the column definition describing the data value; never null
      fieldDefn - the field definition; never null
      data - 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:
      convertBinaryToBase64 in class JdbcValueConverters
    • convertBinaryToBase64UrlSafe

      protected Object convertBinaryToBase64UrlSafe(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
      Overrides:
      convertBinaryToBase64UrlSafe in class JdbcValueConverters
    • convertBinaryToHex

      protected Object convertBinaryToHex(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
      Overrides:
      convertBinaryToHex in class JdbcValueConverters
    • convertString

      protected Object convertString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data)
      Replaces toasted value with a placeholder
      Overrides:
      convertString in class JdbcValueConverters
      Parameters:
      column - the column definition describing the data value; never null
      fieldDefn - the field definition; never null
      data - 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:
      handleUnknownData in class JdbcValueConverters