@@ -56,16 +56,18 @@ public class MySqlRecordConsumer implements Consumer<SourceRecord> {
5656 private final MySqlValueConverters mySqlValueConverters ;
5757 private final Tables tables ;
5858 private final Map <String , SourceTable > sourceTableMap ;
59+ private int schemaHistoryIndex ;
5960
6061 public MySqlRecordConsumer (DeltaSourceContext context , EventEmitter emitter ,
6162 DdlParser ddlParser , MySqlValueConverters mySqlValueConverters ,
62- Tables tables , Map <String , SourceTable > sourceTableMap ) {
63+ Tables tables , Map <String , SourceTable > sourceTableMap , int schemaHistoryIndex ) {
6364 this .context = context ;
6465 this .emitter = emitter ;
6566 this .ddlParser = ddlParser ;
6667 this .mySqlValueConverters = mySqlValueConverters ;
6768 this .tables = tables ;
6869 this .sourceTableMap = sourceTableMap ;
70+ this .schemaHistoryIndex = schemaHistoryIndex ;
6971 }
7072
7173 @ Override
@@ -116,11 +118,8 @@ public void accept(SourceRecord sourceRecord) {
116118 return ;
117119 }
118120
119- Map <String , String > deltaOffset = generateCdapOffsets (sourceRecord );
120- Offset recordOffset = new Offset (deltaOffset );
121121
122122 StructuredRecord val = Records .convert ((Struct ) sourceRecord .value ());
123- String ddl = val .get ("ddl" );
124123 StructuredRecord source = val .get ("source" );
125124 if (source == null ) {
126125 // This should not happen, 'source' is a mandatory field in sourceRecord from debezium
@@ -130,9 +129,11 @@ public void accept(SourceRecord sourceRecord) {
130129 // If the map is empty, we should read all DDL/DML events and columns of all tables
131130 boolean readAllTables = sourceTableMap .isEmpty ();
132131
132+ String ddl = val .get ("ddl" );
133+ Map <String , String > deltaOffset = generateCdapOffsets (sourceRecord );
133134 try {
134135 if (ddl != null ) {
135- handleDDL (ddl , recordOffset , isSnapshot , readAllTables );
136+ handleDDL (ddl , deltaOffset , isSnapshot , readAllTables );
136137 return ;
137138 }
138139
@@ -143,15 +144,16 @@ public void accept(SourceRecord sourceRecord) {
143144 return ;
144145 }
145146
146- handleDML (source , val , recordOffset , isSnapshot , readAllTables );
147+ handleDML (source , val , deltaOffset , isSnapshot , readAllTables );
147148 } catch (InterruptedException e ) {
148149 // happens when the event reader is stopped. throwing this exception tells Debezium to stop right away
149150 throw new StopConnectorException ("Interrupted while emitting event." );
150151 }
151152 }
152153
153- private void handleDML (StructuredRecord source , StructuredRecord val , Offset recordOffset ,
154+ private void handleDML (StructuredRecord source , StructuredRecord val , Map < String , String > deltaOffset ,
154155 boolean isSnapshot , boolean readAllTables ) throws InterruptedException {
156+ deltaOffset .put (MySqlEventReader .SCHEMA_HISTORY_INDEX , String .valueOf (schemaHistoryIndex ));
155157 String databaseName = source .get ("db" );
156158 String tableName = source .get ("table" );
157159 SourceTable sourceTable = getSourceTable (databaseName , tableName );
@@ -198,7 +200,7 @@ private void handleDML(StructuredRecord source, StructuredRecord val, Offset rec
198200
199201 Long ingestTime = val .get ("ts_ms" );
200202 DMLEvent .Builder builder = DMLEvent .builder ()
201- .setOffset (recordOffset )
203+ .setOffset (new Offset ( deltaOffset ) )
202204 .setOperationType (op )
203205 .setDatabaseName (databaseName )
204206 .setTableName (tableName )
@@ -216,8 +218,9 @@ private void handleDML(StructuredRecord source, StructuredRecord val, Offset rec
216218 }
217219 }
218220
219- private void handleDDL (String ddlStatement , Offset recordOffset ,
221+ private void handleDDL (String ddlStatement , Map < String , String > deltaOffset ,
220222 boolean isSnapshot , boolean readAllTables ) throws InterruptedException {
223+ deltaOffset .put (MySqlEventReader .SCHEMA_HISTORY_INDEX , String .valueOf (++schemaHistoryIndex ));
221224 ddlParser .getDdlChanges ().reset ();
222225 ddlParser .parse (ddlStatement , tables );
223226 AtomicReference <InterruptedException > interrupted = new AtomicReference <>();
@@ -227,7 +230,7 @@ private void handleDDL(String ddlStatement, Offset recordOffset,
227230 }
228231 for (DdlParserListener .Event event : events ) {
229232 DDLEvent .Builder builder = DDLEvent .builder ()
230- .setOffset (recordOffset )
233+ .setOffset (new Offset ( deltaOffset ) )
231234 .setDatabaseName (databaseName )
232235 .setSnapshot (isSnapshot );
233236 DDLEvent ddlEvent = null ;
0 commit comments