DBZ-7783 Introduce BinlogCharsetRegistry contract

This commit is contained in:
Chris Cranford 2024-06-13 16:30:29 -04:00 committed by Jiri Pechanec
parent 09de996b64
commit 14ec7d6477
29 changed files with 256 additions and 122 deletions

View File

@ -19,6 +19,7 @@
import io.debezium.config.EnumeratedValue; import io.debezium.config.EnumeratedValue;
import io.debezium.config.Field; import io.debezium.config.Field;
import io.debezium.config.Field.ValidationOutput; import io.debezium.config.Field.ValidationOutput;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.gtid.GtidSet; import io.debezium.connector.binlog.gtid.GtidSet;
import io.debezium.connector.binlog.gtid.GtidSetFactory; import io.debezium.connector.binlog.gtid.GtidSetFactory;
import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode; import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode;
@ -894,6 +895,11 @@ public boolean isTimeAdjustedEnabled() {
*/ */
public abstract GtidSetFactory getGtidSetFactory(); public abstract GtidSetFactory getGtidSetFactory();
/**
* @return the character set registry
*/
public abstract BinlogCharsetRegistry getCharsetRegistry();
/** /**
* Check whether tests request global lock usage. * Check whether tests request global lock usage.
* *

View File

@ -0,0 +1,43 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.connector.binlog.charset;
/**
* Contract for handling binlog-based character set features
*
* @author Chris Cranford
*/
public interface BinlogCharsetRegistry {
/**
* Get the size of the character set registry map.
* @return the map size
*/
int getCharsetMapSize();
/**
* Get the collation name for a collation index.
*
* @param collationIndex the collation index, should not be {@code null}
* @return the collation name or {@code null} if not found or index is invalid
*/
String getCollationNameForCollationIndex(Integer collationIndex);
/**
* Get the collation name for the collation index
*
* @param collationIndex the collation index, should not be {@code null}
* @return the collation name or {@code null} if not found or index is invalid
*/
String getCharsetNameForCollationIndex(Integer collationIndex);
/**
* Get the Java encoding for a database character set name.
*
* @param charSetName the database character set name
* @return the java encoding for the character set name
*/
String getJavaEncodingForCharSet(String charSetName);
}

View File

@ -15,6 +15,7 @@
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import io.debezium.connector.binlog.BinlogConnectorConfig; import io.debezium.connector.binlog.BinlogConnectorConfig;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.relational.Column; import io.debezium.relational.Column;
import io.debezium.relational.Table; import io.debezium.relational.Table;
import io.debezium.relational.TableId; import io.debezium.relational.TableId;
@ -123,7 +124,7 @@ public Object readField(ResultSet rs, int columnIndex, Column column, Table tabl
/** /**
* Read the column's character set. * Read the column's character set.
*/ */
protected abstract String getCharacterSet(Column column) throws UnsupportedEncodingException; protected abstract String getCharacterSet(Column column);
/** /**
* Common handler for logging invalid values. * Common handler for logging invalid values.
@ -141,4 +142,8 @@ protected void logInvalidValue(ResultSet rs, int columnIndex, Object value) thro
protected boolean hasValueConverter(Column column, TableId tableId) { protected boolean hasValueConverter(Column column, TableId tableId) {
return connectorConfig.customConverterRegistry().getValueConverter(tableId, column).isPresent(); return connectorConfig.customConverterRegistry().getValueConverter(tableId, column).isPresent();
} }
protected BinlogCharsetRegistry getCharsetRegistry() {
return connectorConfig.getCharsetRegistry();
}
} }

View File

@ -44,6 +44,7 @@
import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode; import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode;
import io.debezium.connector.binlog.BinlogGeometry; import io.debezium.connector.binlog.BinlogGeometry;
import io.debezium.connector.binlog.BinlogUnsignedIntegerConverter; import io.debezium.connector.binlog.BinlogUnsignedIntegerConverter;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.data.Json; import io.debezium.data.Json;
import io.debezium.data.SpecialValueDecimal; import io.debezium.data.SpecialValueDecimal;
import io.debezium.jdbc.JdbcValueConverters; import io.debezium.jdbc.JdbcValueConverters;
@ -94,6 +95,7 @@ public abstract class BinlogValueConverters extends JdbcValueConverters {
private static final Pattern TIMESTAMP_FIELD_PATTERN = Pattern.compile("([0-9]*)-([0-9]*)-([0-9]*) .*"); private static final Pattern TIMESTAMP_FIELD_PATTERN = Pattern.compile("([0-9]*)-([0-9]*)-([0-9]*) .*");
private final EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode; private final EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode;
private final BinlogCharsetRegistry charsetRegistry;
/** /**
* Create a new instance of the value converters that always uses UTC for the default time zone when * Create a new instance of the value converters that always uses UTC for the default time zone when
@ -105,15 +107,18 @@ public abstract class BinlogValueConverters extends JdbcValueConverters {
* @param binaryHandlingMode how binary columns should be treated * @param binaryHandlingMode how binary columns should be treated
* @param adjuster a temporal adjuster to make a database specific time before conversion * @param adjuster a temporal adjuster to make a database specific time before conversion
* @param eventConvertingFailureHandlingMode how to handle conversion failures * @param eventConvertingFailureHandlingMode how to handle conversion failures
* @param charsetRegistry the character set registry
*/ */
public BinlogValueConverters(DecimalMode decimalMode, public BinlogValueConverters(DecimalMode decimalMode,
TemporalPrecisionMode temporalPrecisionMode, TemporalPrecisionMode temporalPrecisionMode,
BigIntUnsignedMode bigIntUnsignedMode, BigIntUnsignedMode bigIntUnsignedMode,
BinaryHandlingMode binaryHandlingMode, BinaryHandlingMode binaryHandlingMode,
TemporalAdjuster adjuster, TemporalAdjuster adjuster,
EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode) { EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode,
BinlogCharsetRegistry charsetRegistry) {
super(decimalMode, temporalPrecisionMode, ZoneOffset.UTC, adjuster, bigIntUnsignedMode, binaryHandlingMode); super(decimalMode, temporalPrecisionMode, ZoneOffset.UTC, adjuster, bigIntUnsignedMode, binaryHandlingMode);
this.eventConvertingFailureHandlingMode = eventConvertingFailureHandlingMode; this.eventConvertingFailureHandlingMode = eventConvertingFailureHandlingMode;
this.charsetRegistry = charsetRegistry;
} }
@Override @Override
@ -815,7 +820,9 @@ protected Object convertTimestampToLocalDateTime(Column column, Field fieldDefn,
protected abstract List<String> extractEnumAndSetOptions(Column column); protected abstract List<String> extractEnumAndSetOptions(Column column);
protected abstract String getJavaEncodingForCharSet(String charSetName); protected String getJavaEncodingForCharSet(String charSetName) {
return charsetRegistry.getJavaEncodingForCharSet(charSetName);
}
/** /**
* A utility method that adjusts <a href="https://dev.mysql.com/doc/refman/8.2/en/two-digit-years.html">ambiguous</a> 2-digit * A utility method that adjusts <a href="https://dev.mysql.com/doc/refman/8.2/en/two-digit-years.html">ambiguous</a> 2-digit

View File

@ -22,7 +22,9 @@
import io.debezium.connector.AbstractSourceInfo; import io.debezium.connector.AbstractSourceInfo;
import io.debezium.connector.SourceInfoStructMaker; import io.debezium.connector.SourceInfoStructMaker;
import io.debezium.connector.binlog.BinlogConnectorConfig; import io.debezium.connector.binlog.BinlogConnectorConfig;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.gtid.GtidSetFactory; import io.debezium.connector.binlog.gtid.GtidSetFactory;
import io.debezium.connector.mariadb.charset.MariaDbCharsetRegistry;
import io.debezium.connector.mariadb.gtid.MariaDbGtidSetFactory; import io.debezium.connector.mariadb.gtid.MariaDbGtidSetFactory;
import io.debezium.connector.mariadb.history.MariaDbHistoryRecordComparator; import io.debezium.connector.mariadb.history.MariaDbHistoryRecordComparator;
import io.debezium.function.Predicates; import io.debezium.function.Predicates;
@ -196,10 +198,12 @@ protected static ConfigDef configDef() {
private final Predicate<String> gtidSourceFilter; private final Predicate<String> gtidSourceFilter;
private final SnapshotLockingMode snapshotLockingMode; private final SnapshotLockingMode snapshotLockingMode;
private final SnapshotLockingStrategy snapshotLockingStrategy; private final SnapshotLockingStrategy snapshotLockingStrategy;
private final MariaDbCharsetRegistry charsetRegistry;
public MariaDbConnectorConfig(Configuration config) { public MariaDbConnectorConfig(Configuration config) {
super(MariaDbConnector.class, config, DEFAULT_NON_STREAMING_FETCH_SIZE); super(MariaDbConnector.class, config, DEFAULT_NON_STREAMING_FETCH_SIZE);
this.gtidSetFactory = new MariaDbGtidSetFactory(); this.gtidSetFactory = new MariaDbGtidSetFactory();
this.charsetRegistry = new MariaDbCharsetRegistry();
final String gtidIncludes = config.getString(GTID_SOURCE_INCLUDES); final String gtidIncludes = config.getString(GTID_SOURCE_INCLUDES);
final String gtidExcludes = config.getString(GTID_SOURCE_EXCLUDES); final String gtidExcludes = config.getString(GTID_SOURCE_EXCLUDES);
@ -250,6 +254,11 @@ public Optional<SnapshotLockingMode> getSnapshotLockingMode() {
return Optional.of(snapshotLockingMode); return Optional.of(snapshotLockingMode);
} }
@Override
public BinlogCharsetRegistry getCharsetRegistry() {
return charsetRegistry;
}
/** /**
* Custom {@link io.debezium.connector.binlog.BinlogConnectorConfig.SnapshotLockingStrategy} for MariaDB. * Custom {@link io.debezium.connector.binlog.BinlogConnectorConfig.SnapshotLockingStrategy} for MariaDB.
*/ */

View File

@ -25,6 +25,7 @@
import io.debezium.connector.binlog.BinlogSourceTask; import io.debezium.connector.binlog.BinlogSourceTask;
import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection; import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection;
import io.debezium.connector.binlog.jdbc.BinlogFieldReader; import io.debezium.connector.binlog.jdbc.BinlogFieldReader;
import io.debezium.connector.mariadb.charset.MariaDbCharsetRegistry;
import io.debezium.connector.mariadb.jdbc.MariaDbConnection; import io.debezium.connector.mariadb.jdbc.MariaDbConnection;
import io.debezium.connector.mariadb.jdbc.MariaDbConnectionConfiguration; import io.debezium.connector.mariadb.jdbc.MariaDbConnectionConfiguration;
import io.debezium.connector.mariadb.jdbc.MariaDbFieldReader; import io.debezium.connector.mariadb.jdbc.MariaDbFieldReader;
@ -78,6 +79,7 @@ protected Iterable<Field> getAllConfigurationFields() {
@Override @Override
protected ChangeEventSourceCoordinator<MariaDbPartition, MariaDbOffsetContext> start(Configuration configuration) { protected ChangeEventSourceCoordinator<MariaDbPartition, MariaDbOffsetContext> start(Configuration configuration) {
final MariaDbCharsetRegistry charsetRegistry = new MariaDbCharsetRegistry();
final Clock clock = Clock.system(); final Clock clock = Clock.system();
final MariaDbConnectorConfig connectorConfig = new MariaDbConnectorConfig(configuration); final MariaDbConnectorConfig connectorConfig = new MariaDbConnectorConfig(configuration);
final TopicNamingStrategy<TableId> topicNamingStrategy = connectorConfig.getTopicNamingStrategy(TOPIC_NAMING_STRATEGY); final TopicNamingStrategy<TableId> topicNamingStrategy = connectorConfig.getTopicNamingStrategy(TOPIC_NAMING_STRATEGY);
@ -285,7 +287,8 @@ private MariaDbValueConverters getValueConverters(MariaDbConnectorConfig connect
connectorConfig.getBigIntUnsignedHandlingMode().asBigIntUnsignedMode(), connectorConfig.getBigIntUnsignedHandlingMode().asBigIntUnsignedMode(),
connectorConfig.binaryHandlingMode(), connectorConfig.binaryHandlingMode(),
connectorConfig.isTimeAdjustedEnabled() ? MariaDbValueConverters::adjustTemporal : x -> x, connectorConfig.isTimeAdjustedEnabled() ? MariaDbValueConverters::adjustTemporal : x -> x,
connectorConfig.getEventConvertingFailureHandlingMode()); connectorConfig.getEventConvertingFailureHandlingMode(),
connectorConfig.getCharsetRegistry());
} }
private BinlogFieldReader getFieldReader(MariaDbConnectorConfig connectorConfig) { private BinlogFieldReader getFieldReader(MariaDbConnectorConfig connectorConfig) {

View File

@ -40,7 +40,8 @@ protected DdlParser createDdlParser(BinlogConnectorConfig connectorConfig, Maria
false, false,
connectorConfig.isSchemaChangesHistoryEnabled(), connectorConfig.isSchemaChangesHistoryEnabled(),
valueConverter, valueConverter,
getTableFilter()); getTableFilter(),
connectorConfig.getCharsetRegistry());
} }
} }

View File

@ -18,12 +18,13 @@
import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTree;
import io.debezium.annotation.VisibleForTesting;
import io.debezium.antlr.AntlrDdlParser; import io.debezium.antlr.AntlrDdlParser;
import io.debezium.antlr.AntlrDdlParserListener; import io.debezium.antlr.AntlrDdlParserListener;
import io.debezium.antlr.DataTypeResolver; import io.debezium.antlr.DataTypeResolver;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.jdbc.BinlogSystemVariables; import io.debezium.connector.binlog.jdbc.BinlogSystemVariables;
import io.debezium.connector.mariadb.antlr.listener.MariaDbAntlrDdlParserListener; import io.debezium.connector.mariadb.antlr.listener.MariaDbAntlrDdlParserListener;
import io.debezium.connector.mariadb.charset.CharsetMappingResolver;
import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters; import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters;
import io.debezium.ddl.parser.mariadb.generated.MariaDBLexer; import io.debezium.ddl.parser.mariadb.generated.MariaDBLexer;
import io.debezium.ddl.parser.mariadb.generated.MariaDBParser; import io.debezium.ddl.parser.mariadb.generated.MariaDBParser;
@ -48,25 +49,30 @@ public class MariaDbAntlrDdlParser extends AntlrDdlParser<MariaDBLexer, MariaDBP
private final ConcurrentHashMap<String, String> charsetNameForDatabase = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, String> charsetNameForDatabase = new ConcurrentHashMap<>();
private final MariaDbValueConverters converters; private final MariaDbValueConverters converters;
private final Tables.TableFilter tableFilter; private final Tables.TableFilter tableFilter;
private final BinlogCharsetRegistry charsetRegistry;
@VisibleForTesting
public MariaDbAntlrDdlParser() { public MariaDbAntlrDdlParser() {
this(null, Tables.TableFilter.includeAll()); this(null, Tables.TableFilter.includeAll());
} }
@VisibleForTesting
public MariaDbAntlrDdlParser(MariaDbValueConverters valueConverters) { public MariaDbAntlrDdlParser(MariaDbValueConverters valueConverters) {
this(valueConverters, Tables.TableFilter.includeAll()); this(valueConverters, Tables.TableFilter.includeAll());
} }
@VisibleForTesting
public MariaDbAntlrDdlParser(MariaDbValueConverters valueConverters, Tables.TableFilter tableFilter) { public MariaDbAntlrDdlParser(MariaDbValueConverters valueConverters, Tables.TableFilter tableFilter) {
this(true, false, true, valueConverters, tableFilter); this(true, false, true, valueConverters, tableFilter, null);
} }
public MariaDbAntlrDdlParser(boolean throwWerrorsFromTreeWalk, boolean includeViews, boolean includeComments, public MariaDbAntlrDdlParser(boolean throwWerrorsFromTreeWalk, boolean includeViews, boolean includeComments,
MariaDbValueConverters valueConverters, Tables.TableFilter tableFilter) { MariaDbValueConverters valueConverters, Tables.TableFilter tableFilter, BinlogCharsetRegistry charsetRegistry) {
super(throwWerrorsFromTreeWalk, includeViews, includeComments); super(throwWerrorsFromTreeWalk, includeViews, includeComments);
systemVariables = new BinlogSystemVariables(); systemVariables = new BinlogSystemVariables();
this.converters = valueConverters; this.converters = valueConverters;
this.tableFilter = tableFilter; this.tableFilter = tableFilter;
this.charsetRegistry = charsetRegistry;
} }
@Override @Override
@ -228,6 +234,15 @@ protected DataTypeResolver initializeDataTypeResolver() {
return dataTypeResolverBuilder.build(); return dataTypeResolverBuilder.build();
} }
/**
* Get the character set registry.
*
* @return the character set registry
*/
public BinlogCharsetRegistry getCharsetRegistry() {
return charsetRegistry;
}
/** /**
* Provides a map of default character sets by database/schema name. * Provides a map of default character sets by database/schema name.
* *
@ -461,9 +476,9 @@ public String extractCharset(CharsetNameContext charsetNode, CollationNameContex
} }
else if (collationNode != null && collationNode.getText() != null) { else if (collationNode != null && collationNode.getText() != null) {
final String collationName = withoutQuotes(collationNode.getText()).toLowerCase(); final String collationName = withoutQuotes(collationNode.getText()).toLowerCase();
for (int index = 0; index < CharsetMappingResolver.getMapSize(); index++) { for (int index = 0; index < charsetRegistry.getCharsetMapSize(); index++) {
if (collationName.equals(CharsetMappingResolver.getStaticCollationNameForCollationIndex(index))) { if (collationName.equals(charsetRegistry.getCollationNameForCollationIndex(index))) {
charsetName = CharsetMappingResolver.getStaticMariaDbCharsetNameForCollationIndex(index); charsetName = charsetRegistry.getCharsetNameForCollationIndex(index);
break; break;
} }
} }

View File

@ -1,48 +0,0 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.connector.mariadb.charset;
import com.mysql.cj.CharsetMapping;
/**
* A simple bridge between the MySQL driver and the MariaDB code to resolve charset mappings.
*
* @author Chris Cranford
*/
public class CharsetMappingResolver {
// todo: replace with our own implementation
public static int getMapSize() {
return CharsetMapping.MAP_SIZE;
}
// todo: replace with our own implementation
public static String getStaticCollationNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticCollationNameForCollationIndex(collationIndex);
}
// todo: replace with our own implementation
public static String getStaticMariaDbCharsetNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticMysqlCharsetNameForCollationIndex(collationIndex);
}
// todo: replace with our own implementation
public static String getJavaEncodingForMariaDbCharSet(String charSetName) {
return CharsetMappingWrapper.getJavaEncodingForMariaDbCharSet(charSetName);
}
private CharsetMappingResolver() {
}
/**
* Helper to gain access to the private method.
*/
private final static class CharsetMappingWrapper extends CharsetMapping {
static String getJavaEncodingForMariaDbCharSet(String charSetName) {
return CharsetMapping.getStaticJavaEncodingForMysqlCharset(charSetName);
}
}
}

View File

@ -0,0 +1,47 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.connector.mariadb.charset;
import com.mysql.cj.CharsetMapping;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
/**
* A registry that stores character set mappings from {@code charset_mappings.json} for MariaDB.
*
* @author Chris Cranford
*/
public class MariaDbCharsetRegistry implements BinlogCharsetRegistry {
@Override
public int getCharsetMapSize() {
return CharsetMapping.MAP_SIZE;
}
@Override
public String getCollationNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticCollationNameForCollationIndex(collationIndex);
}
@Override
public String getCharsetNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticMysqlCharsetNameForCollationIndex(collationIndex);
}
@Override
public String getJavaEncodingForCharSet(String charSetName) {
return CharsetMappingMapper.getJavaEncodingForCharSet(charSetName);
}
/**
* Helper to gain access to protected method
*/
private final static class CharsetMappingMapper extends CharsetMapping {
static String getJavaEncodingForCharSet(String charSetName) {
return CharsetMapping.getStaticJavaEncodingForMysqlCharset(charSetName);
}
}
}

View File

@ -16,7 +16,6 @@
import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection; import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection;
import io.debezium.connector.binlog.jdbc.BinlogFieldReader; import io.debezium.connector.binlog.jdbc.BinlogFieldReader;
import io.debezium.connector.binlog.jdbc.ConnectionConfiguration; import io.debezium.connector.binlog.jdbc.ConnectionConfiguration;
import io.debezium.connector.mariadb.charset.CharsetMappingResolver;
import io.debezium.connector.mariadb.gtid.MariaDbGtidSet; import io.debezium.connector.mariadb.gtid.MariaDbGtidSet;
import io.debezium.connector.mariadb.gtid.MariaDbGtidSet.MariaDbGtid; import io.debezium.connector.mariadb.gtid.MariaDbGtidSet.MariaDbGtid;
@ -104,8 +103,4 @@ public GtidSet filterGtidSet(Predicate<String> gtidSourceFilter, String offsetGt
LOGGER.info("Final merged GTID set to use when connecting to MariaDB: {}", mergedGtidSet); LOGGER.info("Final merged GTID set to use when connecting to MariaDB: {}", mergedGtidSet);
return mergedGtidSet; return mergedGtidSet;
} }
public static String getJavaEncodingForCharSet(String charSetName) {
return CharsetMappingResolver.getJavaEncodingForMariaDbCharSet(charSetName);
}
} }

View File

@ -5,7 +5,6 @@
*/ */
package io.debezium.connector.mariadb.jdbc; package io.debezium.connector.mariadb.jdbc;
import java.io.UnsupportedEncodingException;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Calendar; import java.util.Calendar;
@ -13,7 +12,6 @@
import io.debezium.connector.binlog.jdbc.BinlogFieldReader; import io.debezium.connector.binlog.jdbc.BinlogFieldReader;
import io.debezium.connector.mariadb.MariaDbConnectorConfig; import io.debezium.connector.mariadb.MariaDbConnectorConfig;
import io.debezium.connector.mariadb.charset.CharsetMappingResolver;
import io.debezium.relational.Column; import io.debezium.relational.Column;
import io.debezium.relational.Table; import io.debezium.relational.Table;
@ -29,8 +27,8 @@ public MariaDbFieldReader(MariaDbConnectorConfig connectorConfig) {
} }
@Override @Override
protected String getCharacterSet(Column column) throws UnsupportedEncodingException { protected String getCharacterSet(Column column) {
return CharsetMappingResolver.getJavaEncodingForMariaDbCharSet(column.charsetName()); return getCharsetRegistry().getJavaEncodingForCharSet(column.charsetName());
} }
@Override @Override

View File

@ -11,6 +11,7 @@
import io.debezium.annotation.Immutable; import io.debezium.annotation.Immutable;
import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode; import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode;
import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode; import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.jdbc.BinlogValueConverters; import io.debezium.connector.binlog.jdbc.BinlogValueConverters;
import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser; import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser;
import io.debezium.jdbc.TemporalPrecisionMode; import io.debezium.jdbc.TemporalPrecisionMode;
@ -43,23 +44,20 @@ public class MariaDbValueConverters extends BinlogValueConverters {
* @param binaryHandlingMode how binary columns should be treated * @param binaryHandlingMode how binary columns should be treated
* @param adjuster a temporal adjuster to make a database specific time before conversion * @param adjuster a temporal adjuster to make a database specific time before conversion
* @param eventConvertingFailureHandlingMode how to handle conversion failures * @param eventConvertingFailureHandlingMode how to handle conversion failures
* @param charsetRegistry the character set registry
*/ */
public MariaDbValueConverters(DecimalMode decimalMode, public MariaDbValueConverters(DecimalMode decimalMode,
TemporalPrecisionMode temporalPrecisionMode, TemporalPrecisionMode temporalPrecisionMode,
BigIntUnsignedMode bigIntUnsignedMode, BigIntUnsignedMode bigIntUnsignedMode,
BinaryHandlingMode binaryHandlingMode, BinaryHandlingMode binaryHandlingMode,
TemporalAdjuster adjuster, TemporalAdjuster adjuster,
EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode) { EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode,
super(decimalMode, temporalPrecisionMode, bigIntUnsignedMode, binaryHandlingMode, adjuster, eventConvertingFailureHandlingMode); BinlogCharsetRegistry charsetRegistry) {
super(decimalMode, temporalPrecisionMode, bigIntUnsignedMode, binaryHandlingMode, adjuster, eventConvertingFailureHandlingMode, charsetRegistry);
} }
@Override @Override
protected List<String> extractEnumAndSetOptions(Column column) { protected List<String> extractEnumAndSetOptions(Column column) {
return MariaDbAntlrDdlParser.extractEnumAndSetOptions(column.enumValues()); return MariaDbAntlrDdlParser.extractEnumAndSetOptions(column.enumValues());
} }
@Override
protected String getJavaEncodingForCharSet(String charSetName) {
return MariaDbConnection.getJavaEncodingForCharSet(charSetName);
}
} }

View File

@ -40,7 +40,8 @@ protected MariaDbDatabaseSchema getSchema(Configuration config) {
JdbcValueConverters.BigIntUnsignedMode.LONG, JdbcValueConverters.BigIntUnsignedMode.LONG,
CommonConnectorConfig.BinaryHandlingMode.BYTES, CommonConnectorConfig.BinaryHandlingMode.BYTES,
MariaDbValueConverters::adjustTemporal, MariaDbValueConverters::adjustTemporal,
CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN); CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN,
connectorConfig.getCharsetRegistry());
return new MariaDbDatabaseSchema( return new MariaDbDatabaseSchema(
connectorConfig, connectorConfig,

View File

@ -10,6 +10,7 @@
import io.debezium.connector.binlog.BinlogDefaultValueTest; import io.debezium.connector.binlog.BinlogDefaultValueTest;
import io.debezium.connector.binlog.jdbc.BinlogDefaultValueConverter; import io.debezium.connector.binlog.jdbc.BinlogDefaultValueConverter;
import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser; import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser;
import io.debezium.connector.mariadb.charset.MariaDbCharsetRegistry;
import io.debezium.connector.mariadb.jdbc.MariaDbDefaultValueConverter; import io.debezium.connector.mariadb.jdbc.MariaDbDefaultValueConverter;
import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters; import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters;
import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode; import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode;
@ -36,7 +37,8 @@ protected MariaDbValueConverters getValueConverter(DecimalMode decimalMode,
bigIntUnsignedMode, bigIntUnsignedMode,
binaryHandlingMode, binaryHandlingMode,
x -> x, x -> x,
EventConvertingFailureHandlingMode.WARN); EventConvertingFailureHandlingMode.WARN,
new MariaDbCharsetRegistry());
} }
@Override @Override

View File

@ -10,6 +10,7 @@
import io.debezium.config.CommonConnectorConfig; import io.debezium.config.CommonConnectorConfig;
import io.debezium.connector.binlog.BinlogAntlrDdlParserTest; import io.debezium.connector.binlog.BinlogAntlrDdlParserTest;
import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser; import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser;
import io.debezium.connector.mariadb.charset.MariaDbCharsetRegistry;
import io.debezium.connector.mariadb.jdbc.MariaDbDefaultValueConverter; import io.debezium.connector.mariadb.jdbc.MariaDbDefaultValueConverter;
import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters; import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters;
import io.debezium.jdbc.JdbcValueConverters; import io.debezium.jdbc.JdbcValueConverters;
@ -50,7 +51,8 @@ protected MariaDbValueConverters getValueConverters() {
JdbcValueConverters.BigIntUnsignedMode.PRECISE, JdbcValueConverters.BigIntUnsignedMode.PRECISE,
CommonConnectorConfig.BinaryHandlingMode.BYTES, CommonConnectorConfig.BinaryHandlingMode.BYTES,
x -> x, x -> x,
CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN); CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN,
new MariaDbCharsetRegistry());
} }
@Override @Override
@ -82,7 +84,7 @@ public MariaDbDdlParserWithSimpleTestListener(DdlChanges listener, boolean inclu
public MariaDbDdlParserWithSimpleTestListener(DdlChanges listener, boolean includeViews, boolean includeComments, Tables.TableFilter tableFilter, public MariaDbDdlParserWithSimpleTestListener(DdlChanges listener, boolean includeViews, boolean includeComments, Tables.TableFilter tableFilter,
MariaDbValueConverters converters) { MariaDbValueConverters converters) {
super(false, includeViews, includeComments, converters, tableFilter); super(false, includeViews, includeComments, converters, tableFilter, new MariaDbCharsetRegistry());
this.ddlChanges = listener; this.ddlChanges = listener;
} }
} }

View File

@ -12,6 +12,7 @@
import io.debezium.connector.binlog.BinlogValueConvertersTest; import io.debezium.connector.binlog.BinlogValueConvertersTest;
import io.debezium.connector.binlog.jdbc.BinlogValueConverters; import io.debezium.connector.binlog.jdbc.BinlogValueConverters;
import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser; import io.debezium.connector.mariadb.antlr.MariaDbAntlrDdlParser;
import io.debezium.connector.mariadb.charset.MariaDbCharsetRegistry;
import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters; import io.debezium.connector.mariadb.jdbc.MariaDbValueConverters;
import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode; import io.debezium.jdbc.JdbcValueConverters.BigIntUnsignedMode;
import io.debezium.jdbc.JdbcValueConverters.DecimalMode; import io.debezium.jdbc.JdbcValueConverters.DecimalMode;
@ -35,7 +36,8 @@ protected BinlogValueConverters getValueConverters(DecimalMode decimalMode,
bigIntUnsignedMode, bigIntUnsignedMode,
binaryHandlingMode, binaryHandlingMode,
temporalAdjuster, temporalAdjuster,
eventConvertingFailureHandlingMode); eventConvertingFailureHandlingMode,
new MariaDbCharsetRegistry());
} }
@Override @Override

View File

@ -24,7 +24,9 @@
import io.debezium.connector.AbstractSourceInfo; import io.debezium.connector.AbstractSourceInfo;
import io.debezium.connector.SourceInfoStructMaker; import io.debezium.connector.SourceInfoStructMaker;
import io.debezium.connector.binlog.BinlogConnectorConfig; import io.debezium.connector.binlog.BinlogConnectorConfig;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.gtid.GtidSetFactory; import io.debezium.connector.binlog.gtid.GtidSetFactory;
import io.debezium.connector.mysql.charset.MySqlCharsetRegistry;
import io.debezium.connector.mysql.gtid.MySqlGtidSetFactory; import io.debezium.connector.mysql.gtid.MySqlGtidSetFactory;
import io.debezium.connector.mysql.history.MySqlHistoryRecordComparator; import io.debezium.connector.mysql.history.MySqlHistoryRecordComparator;
import io.debezium.function.Predicates; import io.debezium.function.Predicates;
@ -229,10 +231,12 @@ protected static ConfigDef configDef() {
private final Predicate<String> gtidSourceFilter; private final Predicate<String> gtidSourceFilter;
private final SnapshotLockingMode snapshotLockingMode; private final SnapshotLockingMode snapshotLockingMode;
private final SnapshotLockingStrategy snapshotLockingStrategy; private final SnapshotLockingStrategy snapshotLockingStrategy;
private final MySqlCharsetRegistry charsetRegistry;
public MySqlConnectorConfig(Configuration config) { public MySqlConnectorConfig(Configuration config) {
super(MySqlConnector.class, config, DEFAULT_SNAPSHOT_FETCH_SIZE); super(MySqlConnector.class, config, DEFAULT_SNAPSHOT_FETCH_SIZE);
this.gtidSetFactory = new MySqlGtidSetFactory(); this.gtidSetFactory = new MySqlGtidSetFactory();
this.charsetRegistry = new MySqlCharsetRegistry();
this.snapshotLockingMode = SnapshotLockingMode.parse(config.getString(SNAPSHOT_LOCKING_MODE), SNAPSHOT_LOCKING_MODE.defaultValueAsString()); this.snapshotLockingMode = SnapshotLockingMode.parse(config.getString(SNAPSHOT_LOCKING_MODE), SNAPSHOT_LOCKING_MODE.defaultValueAsString());
this.snapshotLockingStrategy = new MySqlSnapshotLockingStrategy(snapshotLockingMode); this.snapshotLockingStrategy = new MySqlSnapshotLockingStrategy(snapshotLockingMode);
@ -283,6 +287,11 @@ protected HistoryRecordComparator getHistoryRecordComparator() {
return new MySqlHistoryRecordComparator(gtidSourceFilter, getGtidSetFactory()); return new MySqlHistoryRecordComparator(gtidSourceFilter, getGtidSetFactory());
} }
@Override
public BinlogCharsetRegistry getCharsetRegistry() {
return charsetRegistry;
}
/** /**
* Custom {@link io.debezium.connector.binlog.BinlogConnectorConfig.SnapshotLockingStrategy} for MySQL. * Custom {@link io.debezium.connector.binlog.BinlogConnectorConfig.SnapshotLockingStrategy} for MySQL.
*/ */

View File

@ -233,7 +233,8 @@ private MySqlValueConverters getValueConverters(MySqlConnectorConfig configurati
configuration.getBigIntUnsignedHandlingMode().asBigIntUnsignedMode(), configuration.getBigIntUnsignedHandlingMode().asBigIntUnsignedMode(),
configuration.binaryHandlingMode(), configuration.binaryHandlingMode(),
configuration.isTimeAdjustedEnabled() ? MySqlValueConverters::adjustTemporal : x -> x, configuration.isTimeAdjustedEnabled() ? MySqlValueConverters::adjustTemporal : x -> x,
configuration.getEventConvertingFailureHandlingMode()); configuration.getEventConvertingFailureHandlingMode(),
configuration.getCharsetRegistry());
} }
@Override @Override

View File

@ -52,7 +52,8 @@ protected DdlParser createDdlParser(BinlogConnectorConfig connectorConfig, MySql
false, false,
connectorConfig.isSchemaCommentsHistoryEnabled(), connectorConfig.isSchemaCommentsHistoryEnabled(),
valueConverter, valueConverter,
getTableFilter()); getTableFilter(),
connectorConfig.getCharsetRegistry());
} }
} }

View File

@ -19,12 +19,12 @@
import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTree;
import com.mysql.cj.CharsetMapping; import io.debezium.annotation.VisibleForTesting;
import io.debezium.antlr.AntlrDdlParser; import io.debezium.antlr.AntlrDdlParser;
import io.debezium.antlr.AntlrDdlParserListener; import io.debezium.antlr.AntlrDdlParserListener;
import io.debezium.antlr.DataTypeResolver; import io.debezium.antlr.DataTypeResolver;
import io.debezium.antlr.DataTypeResolver.DataTypeEntry; import io.debezium.antlr.DataTypeResolver.DataTypeEntry;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.jdbc.BinlogSystemVariables; import io.debezium.connector.binlog.jdbc.BinlogSystemVariables;
import io.debezium.connector.mysql.antlr.listener.MySqlAntlrDdlParserListener; import io.debezium.connector.mysql.antlr.listener.MySqlAntlrDdlParserListener;
import io.debezium.connector.mysql.jdbc.MySqlValueConverters; import io.debezium.connector.mysql.jdbc.MySqlValueConverters;
@ -51,25 +51,30 @@ public class MySqlAntlrDdlParser extends AntlrDdlParser<MySqlLexer, MySqlParser>
private final ConcurrentMap<String, String> charsetNameForDatabase = new ConcurrentHashMap<>(); private final ConcurrentMap<String, String> charsetNameForDatabase = new ConcurrentHashMap<>();
private final MySqlValueConverters converters; private final MySqlValueConverters converters;
private final TableFilter tableFilter; private final TableFilter tableFilter;
private final BinlogCharsetRegistry charsetRegistry;
@VisibleForTesting
public MySqlAntlrDdlParser() { public MySqlAntlrDdlParser() {
this(null, TableFilter.includeAll()); this(null, TableFilter.includeAll());
} }
@VisibleForTesting
public MySqlAntlrDdlParser(MySqlValueConverters converters) { public MySqlAntlrDdlParser(MySqlValueConverters converters) {
this(converters, TableFilter.includeAll()); this(converters, TableFilter.includeAll());
} }
@VisibleForTesting
public MySqlAntlrDdlParser(MySqlValueConverters converters, TableFilter tableFilter) { public MySqlAntlrDdlParser(MySqlValueConverters converters, TableFilter tableFilter) {
this(true, false, false, converters, tableFilter); this(true, false, false, converters, tableFilter, null);
} }
public MySqlAntlrDdlParser(boolean throwErrorsFromTreeWalk, boolean includeViews, boolean includeComments, public MySqlAntlrDdlParser(boolean throwErrorsFromTreeWalk, boolean includeViews, boolean includeComments,
MySqlValueConverters converters, TableFilter tableFilter) { MySqlValueConverters converters, TableFilter tableFilter, BinlogCharsetRegistry charsetRegistry) {
super(throwErrorsFromTreeWalk, includeViews, includeComments); super(throwErrorsFromTreeWalk, includeViews, includeComments);
systemVariables = new BinlogSystemVariables(); systemVariables = new BinlogSystemVariables();
this.converters = converters; this.converters = converters;
this.tableFilter = tableFilter; this.tableFilter = tableFilter;
this.charsetRegistry = charsetRegistry;
} }
@Override @Override
@ -456,10 +461,9 @@ public String extractCharset(CharsetNameContext charsetNode, CollationNameContex
} }
else if (collationNode != null && collationNode.getText() != null) { else if (collationNode != null && collationNode.getText() != null) {
final String collationName = withoutQuotes(collationNode.getText()).toLowerCase(); final String collationName = withoutQuotes(collationNode.getText()).toLowerCase();
for (int index = 0; index < CharsetMapping.MAP_SIZE; index++) { for (int index = 0; index < charsetRegistry.getCharsetMapSize(); index++) {
if (collationName.equals( if (collationName.equals(charsetRegistry.getCollationNameForCollationIndex(index))) {
CharsetMapping.getStaticCollationNameForCollationIndex(index))) { charsetName = charsetRegistry.getCharsetNameForCollationIndex(index);
charsetName = CharsetMapping.getStaticMysqlCharsetNameForCollationIndex(index);
break; break;
} }
} }

View File

@ -0,0 +1,46 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.connector.mysql.charset;
import com.mysql.cj.CharsetMapping;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
/**
* Character-set registry implementation for MySQL that delegates to the MySQL JDBC driver.
*
* @author Chris Cranford
*/
public class MySqlCharsetRegistry implements BinlogCharsetRegistry {
@Override
public int getCharsetMapSize() {
return CharsetMapping.MAP_SIZE;
}
@Override
public String getCollationNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticCollationNameForCollationIndex(collationIndex);
}
@Override
public String getCharsetNameForCollationIndex(Integer collationIndex) {
return CharsetMapping.getStaticMysqlCharsetNameForCollationIndex(collationIndex);
}
@Override
public String getJavaEncodingForCharSet(String charSetName) {
return CharsetMappingMapper.getJavaEncodingForCharSet(charSetName);
}
/**
* Helper to gain access to protected method
*/
private final static class CharsetMappingMapper extends CharsetMapping {
static String getJavaEncodingForCharSet(String charSetName) {
return CharsetMapping.getStaticJavaEncodingForMysqlCharset(charSetName);
}
}
}

View File

@ -5,8 +5,6 @@
*/ */
package io.debezium.connector.mysql.jdbc; package io.debezium.connector.mysql.jdbc;
import java.io.UnsupportedEncodingException;
import io.debezium.connector.binlog.jdbc.BinlogFieldReader; import io.debezium.connector.binlog.jdbc.BinlogFieldReader;
import io.debezium.connector.mysql.MySqlConnectorConfig; import io.debezium.connector.mysql.MySqlConnectorConfig;
import io.debezium.relational.Column; import io.debezium.relational.Column;
@ -31,7 +29,7 @@ public AbstractFieldReader(MySqlConnectorConfig connectorConfig) {
} }
@Override @Override
protected String getCharacterSet(Column column) throws UnsupportedEncodingException { protected String getCharacterSet(Column column) {
return MySqlConnection.getJavaEncodingForCharSet(column.charsetName()); return getCharsetRegistry().getJavaEncodingForCharSet(column.charsetName());
} }
} }

View File

@ -11,8 +11,6 @@
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.mysql.cj.CharsetMapping;
import io.debezium.DebeziumException; import io.debezium.DebeziumException;
import io.debezium.connector.binlog.gtid.GtidSet; import io.debezium.connector.binlog.gtid.GtidSet;
import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection; import io.debezium.connector.binlog.jdbc.BinlogConnectorConnection;
@ -125,18 +123,4 @@ public GtidSet filterGtidSet(Predicate<String> gtidSourceFilter, String offsetGt
LOGGER.info("Final merged GTID set to use when connecting to MySQL: {}", mergedGtidSet); LOGGER.info("Final merged GTID set to use when connecting to MySQL: {}", mergedGtidSet);
return mergedGtidSet; return mergedGtidSet;
} }
public static String getJavaEncodingForCharSet(String charSetName) {
return CharsetMappingWrapper.getJavaEncodingForMysqlCharSet(charSetName);
}
/**
* Helper to gain access to protected method
*/
private final static class CharsetMappingWrapper extends CharsetMapping {
static String getJavaEncodingForMysqlCharSet(String charSetName) {
return CharsetMapping.getStaticJavaEncodingForMysqlCharset(charSetName);
}
}
} }

View File

@ -15,6 +15,7 @@
import io.debezium.annotation.Immutable; import io.debezium.annotation.Immutable;
import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode; import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode;
import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode; import io.debezium.config.CommonConnectorConfig.EventConvertingFailureHandlingMode;
import io.debezium.connector.binlog.charset.BinlogCharsetRegistry;
import io.debezium.connector.binlog.jdbc.BinlogValueConverters; import io.debezium.connector.binlog.jdbc.BinlogValueConverters;
import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser; import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser;
import io.debezium.jdbc.TemporalPrecisionMode; import io.debezium.jdbc.TemporalPrecisionMode;
@ -49,19 +50,16 @@ public class MySqlValueConverters extends BinlogValueConverters {
* @param binaryMode how binary columns should be represented * @param binaryMode how binary columns should be represented
* @param adjuster a temporal adjuster to make a database specific time modification before conversion * @param adjuster a temporal adjuster to make a database specific time modification before conversion
* @param eventConvertingFailureHandlingMode how handle when converting failure * @param eventConvertingFailureHandlingMode how handle when converting failure
* @param charsetRegistry the binlog character set registry
*/ */
public MySqlValueConverters(DecimalMode decimalMode, public MySqlValueConverters(DecimalMode decimalMode,
TemporalPrecisionMode temporalPrecisionMode, TemporalPrecisionMode temporalPrecisionMode,
BigIntUnsignedMode bigIntUnsignedMode, BigIntUnsignedMode bigIntUnsignedMode,
BinaryHandlingMode binaryMode, BinaryHandlingMode binaryMode,
TemporalAdjuster adjuster, TemporalAdjuster adjuster,
EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode) { EventConvertingFailureHandlingMode eventConvertingFailureHandlingMode,
super(decimalMode, temporalPrecisionMode, bigIntUnsignedMode, binaryMode, adjuster, eventConvertingFailureHandlingMode); BinlogCharsetRegistry charsetRegistry) {
} super(decimalMode, temporalPrecisionMode, bigIntUnsignedMode, binaryMode, adjuster, eventConvertingFailureHandlingMode, charsetRegistry);
@Override
protected String getJavaEncodingForCharSet(String charSetName) {
return MySqlConnection.getJavaEncodingForCharSet(charSetName);
} }
@Override @Override

View File

@ -12,6 +12,7 @@
import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode; import io.debezium.config.CommonConnectorConfig.BinaryHandlingMode;
import io.debezium.connector.binlog.BinlogAntlrDdlParserTest; import io.debezium.connector.binlog.BinlogAntlrDdlParserTest;
import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser; import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser;
import io.debezium.connector.mysql.charset.MySqlCharsetRegistry;
import io.debezium.connector.mysql.jdbc.MySqlDefaultValueConverter; import io.debezium.connector.mysql.jdbc.MySqlDefaultValueConverter;
import io.debezium.connector.mysql.jdbc.MySqlValueConverters; import io.debezium.connector.mysql.jdbc.MySqlValueConverters;
import io.debezium.jdbc.JdbcValueConverters; import io.debezium.jdbc.JdbcValueConverters;
@ -54,7 +55,8 @@ protected MySqlValueConverters getValueConverters() {
JdbcValueConverters.BigIntUnsignedMode.PRECISE, JdbcValueConverters.BigIntUnsignedMode.PRECISE,
BinaryHandlingMode.BYTES, BinaryHandlingMode.BYTES,
x -> x, x -> x,
CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN); CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN,
new MySqlCharsetRegistry());
} }
@Override @Override
@ -86,7 +88,7 @@ public static class MySqlDdlParserWithSimpleTestListener extends MySqlAntlrDdlPa
private MySqlDdlParserWithSimpleTestListener(DdlChanges changesListener, boolean includeViews, boolean includeComments, TableFilter tableFilter, private MySqlDdlParserWithSimpleTestListener(DdlChanges changesListener, boolean includeViews, boolean includeComments, TableFilter tableFilter,
MySqlValueConverters converters) { MySqlValueConverters converters) {
super(false, includeViews, includeComments, converters, tableFilter); super(false, includeViews, includeComments, converters, tableFilter, new MySqlCharsetRegistry());
this.ddlChanges = changesListener; this.ddlChanges = changesListener;
} }
} }

View File

@ -42,7 +42,8 @@ protected MySqlDatabaseSchema getSchema(Configuration config) {
BigIntUnsignedMode.LONG, BigIntUnsignedMode.LONG,
BinaryHandlingMode.BYTES, BinaryHandlingMode.BYTES,
MySqlValueConverters::adjustTemporal, MySqlValueConverters::adjustTemporal,
CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN); CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN,
connectorConfig.getCharsetRegistry());
return new MySqlDatabaseSchema( return new MySqlDatabaseSchema(
connectorConfig, connectorConfig,

View File

@ -10,6 +10,7 @@
import io.debezium.connector.binlog.BinlogDefaultValueTest; import io.debezium.connector.binlog.BinlogDefaultValueTest;
import io.debezium.connector.binlog.jdbc.BinlogDefaultValueConverter; import io.debezium.connector.binlog.jdbc.BinlogDefaultValueConverter;
import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser; import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser;
import io.debezium.connector.mysql.charset.MySqlCharsetRegistry;
import io.debezium.connector.mysql.jdbc.MySqlDefaultValueConverter; import io.debezium.connector.mysql.jdbc.MySqlDefaultValueConverter;
import io.debezium.connector.mysql.jdbc.MySqlValueConverters; import io.debezium.connector.mysql.jdbc.MySqlValueConverters;
import io.debezium.jdbc.JdbcValueConverters; import io.debezium.jdbc.JdbcValueConverters;
@ -35,7 +36,8 @@ protected MySqlValueConverters getValueConverter(JdbcValueConverters.DecimalMode
bigIntUnsignedMode, bigIntUnsignedMode,
binaryHandlingMode, binaryHandlingMode,
x -> x, x -> x,
CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN); CommonConnectorConfig.EventConvertingFailureHandlingMode.WARN,
new MySqlCharsetRegistry());
} }
@Override @Override

View File

@ -12,6 +12,7 @@
import io.debezium.connector.binlog.BinlogValueConvertersTest; import io.debezium.connector.binlog.BinlogValueConvertersTest;
import io.debezium.connector.binlog.jdbc.BinlogValueConverters; import io.debezium.connector.binlog.jdbc.BinlogValueConverters;
import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser; import io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser;
import io.debezium.connector.mysql.charset.MySqlCharsetRegistry;
import io.debezium.connector.mysql.jdbc.MySqlValueConverters; import io.debezium.connector.mysql.jdbc.MySqlValueConverters;
import io.debezium.jdbc.JdbcValueConverters; import io.debezium.jdbc.JdbcValueConverters;
import io.debezium.jdbc.TemporalPrecisionMode; import io.debezium.jdbc.TemporalPrecisionMode;
@ -35,7 +36,8 @@ protected BinlogValueConverters getValueConverters(JdbcValueConverters.DecimalMo
bigIntUnsignedMode, bigIntUnsignedMode,
binaryHandlingMode, binaryHandlingMode,
temporalAdjuster, temporalAdjuster,
eventConvertingFailureHandlingMode); eventConvertingFailureHandlingMode,
new MySqlCharsetRegistry());
} }
@Override @Override