@@ -40,7 +40,7 @@ type TableMapEvent struct {
40
40
41
41
SignednessBitmap []byte
42
42
43
- // DefaultCharset[0] is the default collation;
43
+ // DefaultCharset[0] is the default collation of character columns.
44
44
// For character columns that have different charset,
45
45
// (character column index, column collation) pairs follows
46
46
DefaultCharset []uint64
@@ -206,7 +206,7 @@ func (e *TableMapEvent) decodeMeta(data []byte) error {
206
206
return nil
207
207
}
208
208
209
- func (e * TableMapEvent ) decodeOptionalMeta (data []byte ) error {
209
+ func (e * TableMapEvent ) decodeOptionalMeta (data []byte ) ( err error ) {
210
210
211
211
pos := 0
212
212
for pos < len (data ) {
@@ -227,53 +227,30 @@ func (e *TableMapEvent) decodeOptionalMeta(data []byte) error {
227
227
e .SignednessBitmap = v
228
228
229
229
case TABLE_MAP_OPT_META_DEFAULT_CHARSET :
230
- p := 0
231
- for p < len (v ) {
232
- c , _ , n := LengthEncodedInt (v [p :])
233
- p += n
234
- e .DefaultCharset = append (e .DefaultCharset , c )
230
+ e .DefaultCharset , err = e .decodeDefaultCharset (v )
231
+ if err != nil {
232
+ return err
235
233
}
236
234
237
235
case TABLE_MAP_OPT_META_COLUMN_CHARSET :
238
- p := 0
239
- for p < len (v ) {
240
- c , _ , n := LengthEncodedInt (v [p :])
241
- p += n
242
- e .ColumnCharset = append (e .ColumnCharset , c )
236
+ e .ColumnCharset , err = e .decodeColumnCharset (v )
237
+ if err != nil {
238
+ return err
243
239
}
244
240
245
241
case TABLE_MAP_OPT_META_COLUMN_NAME :
246
- p := 0
247
- e .ColumnName = make ([][]byte , 0 , e .ColumnCount )
248
- for p < len (v ) {
249
- n := int (v [p ])
250
- p ++
251
- e .ColumnName = append (e .ColumnName , v [p :p + n ])
252
- p += n
253
- }
254
-
255
- if len (e .ColumnName ) != int (e .ColumnCount ) {
256
- return errors .Errorf ("Expect %d column names but got %d" , e .ColumnCount , len (e .ColumnName ))
242
+ if err = e .decodeColumnNames (v ); err != nil {
243
+ return err
257
244
}
258
245
259
246
case TABLE_MAP_OPT_META_SIMPLE_PRIMARY_KEY :
260
- p := 0
261
- for p < len (v ) {
262
- i , _ , n := LengthEncodedInt (v [p :])
263
- e .PrimaryKey = append (e .PrimaryKey , i )
264
- e .PrimaryKeyPrefix = append (e .PrimaryKeyPrefix , 0 )
265
- p += n
247
+ if err = e .decodeSimplePrimaryKey (v ); err != nil {
248
+ return err
266
249
}
267
250
268
251
case TABLE_MAP_OPT_META_PRIMARY_KEY_WITH_PREFIX :
269
- p := 0
270
- for p < len (v ) {
271
- i , _ , n := LengthEncodedInt (v [p :])
272
- e .PrimaryKey = append (e .PrimaryKey , i )
273
- p += n
274
- i , _ , n = LengthEncodedInt (v [p :])
275
- e .PrimaryKeyPrefix = append (e .PrimaryKeyPrefix , i )
276
- p += n
252
+ if err = e .decodePrimaryKeyWithPrefix (v ); err != nil {
253
+ return err
277
254
}
278
255
279
256
default :
@@ -285,6 +262,70 @@ func (e *TableMapEvent) decodeOptionalMeta(data []byte) error {
285
262
return nil
286
263
}
287
264
265
+ func (e * TableMapEvent ) decodeDefaultCharset (v []byte ) (ret []uint64 , err error ) {
266
+ p := 0
267
+ for p < len (v ) {
268
+ c , _ , n := LengthEncodedInt (v [p :])
269
+ p += n
270
+ ret = append (ret , c )
271
+ }
272
+
273
+ if len (ret )% 2 != 1 {
274
+ return nil , errors .Errorf ("Expect odd item in DefaultCharset but got %d" , len (ret ))
275
+ }
276
+ return
277
+ }
278
+
279
+ func (e * TableMapEvent ) decodeColumnCharset (v []byte ) (ret []uint64 , err error ) {
280
+ p := 0
281
+ for p < len (v ) {
282
+ c , _ , n := LengthEncodedInt (v [p :])
283
+ p += n
284
+ ret = append (ret , c )
285
+ }
286
+ return
287
+ }
288
+
289
+ func (e * TableMapEvent ) decodeColumnNames (v []byte ) error {
290
+ p := 0
291
+ e .ColumnName = make ([][]byte , 0 , e .ColumnCount )
292
+ for p < len (v ) {
293
+ n := int (v [p ])
294
+ p ++
295
+ e .ColumnName = append (e .ColumnName , v [p :p + n ])
296
+ p += n
297
+ }
298
+
299
+ if len (e .ColumnName ) != int (e .ColumnCount ) {
300
+ return errors .Errorf ("Expect %d column names but got %d" , e .ColumnCount , len (e .ColumnName ))
301
+ }
302
+ return nil
303
+ }
304
+
305
+ func (e * TableMapEvent ) decodeSimplePrimaryKey (v []byte ) error {
306
+ p := 0
307
+ for p < len (v ) {
308
+ i , _ , n := LengthEncodedInt (v [p :])
309
+ e .PrimaryKey = append (e .PrimaryKey , i )
310
+ e .PrimaryKeyPrefix = append (e .PrimaryKeyPrefix , 0 )
311
+ p += n
312
+ }
313
+ return nil
314
+ }
315
+
316
+ func (e * TableMapEvent ) decodePrimaryKeyWithPrefix (v []byte ) error {
317
+ p := 0
318
+ for p < len (v ) {
319
+ i , _ , n := LengthEncodedInt (v [p :])
320
+ e .PrimaryKey = append (e .PrimaryKey , i )
321
+ p += n
322
+ i , _ , n = LengthEncodedInt (v [p :])
323
+ e .PrimaryKeyPrefix = append (e .PrimaryKeyPrefix , i )
324
+ p += n
325
+ }
326
+ return nil
327
+ }
328
+
288
329
func (e * TableMapEvent ) Dump (w io.Writer ) {
289
330
fmt .Fprintf (w , "TableID: %d\n " , e .TableID )
290
331
fmt .Fprintf (w , "TableID size: %d\n " , e .tableIDSize )
@@ -464,7 +505,6 @@ func (e *TableMapEvent) realType(i int) byte {
464
505
465
506
case MYSQL_TYPE_DATE :
466
507
return MYSQL_TYPE_NEWDATE
467
-
468
508
}
469
509
470
510
return typ
0 commit comments