Skip to content

Commit 3e4d0b3

Browse files
committed
Refactor decodeOptionalMeta
1 parent 41ecfa6 commit 3e4d0b3

File tree

1 file changed

+78
-38
lines changed

1 file changed

+78
-38
lines changed

replication/row_event.go

Lines changed: 78 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type TableMapEvent struct {
4040

4141
SignednessBitmap []byte
4242

43-
// DefaultCharset[0] is the default collation;
43+
// DefaultCharset[0] is the default collation of character columns.
4444
// For character columns that have different charset,
4545
// (character column index, column collation) pairs follows
4646
DefaultCharset []uint64
@@ -206,7 +206,7 @@ func (e *TableMapEvent) decodeMeta(data []byte) error {
206206
return nil
207207
}
208208

209-
func (e *TableMapEvent) decodeOptionalMeta(data []byte) error {
209+
func (e *TableMapEvent) decodeOptionalMeta(data []byte) (err error) {
210210

211211
pos := 0
212212
for pos < len(data) {
@@ -227,53 +227,30 @@ func (e *TableMapEvent) decodeOptionalMeta(data []byte) error {
227227
e.SignednessBitmap = v
228228

229229
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
235233
}
236234

237235
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
243239
}
244240

245241
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
257244
}
258245

259246
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
266249
}
267250

268251
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
277254
}
278255

279256
default:
@@ -285,6 +262,70 @@ func (e *TableMapEvent) decodeOptionalMeta(data []byte) error {
285262
return nil
286263
}
287264

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+
288329
func (e *TableMapEvent) Dump(w io.Writer) {
289330
fmt.Fprintf(w, "TableID: %d\n", e.TableID)
290331
fmt.Fprintf(w, "TableID size: %d\n", e.tableIDSize)
@@ -464,7 +505,6 @@ func (e *TableMapEvent) realType(i int) byte {
464505

465506
case MYSQL_TYPE_DATE:
466507
return MYSQL_TYPE_NEWDATE
467-
468508
}
469509

470510
return typ

0 commit comments

Comments
 (0)