package me.xcoding.opencdc.binlog.event.row; import me.xcoding.opencdc.binlog.EventContext; import me.xcoding.opencdc.binlog.event.RowsEvent; import me.xcoding.opencdc.binlog.parser.EventParser; import me.xcoding.opencdc.mysql.BinLogEventType; import me.xcoding.opencdc.mysql.protocol.BasicReader; import me.xcoding.opencdc.mysql.protocol.column.Column; import me.xcoding.opencdc.mysql.protocol.column.ColumnDef; import me.xcoding.opencdc.mysql.protocol.column.ColumnValueParser; /** * * <b> Update Rows Event Version 1 </b> * </br> * As much date as needed to identify a row + the data to change * * </br></br> * Written from MySQL 5.1.15 to 5.6.x * * @author Teny Zh(zh.Teny.1@gmail.com) * @see http://dev.mysql.com/doc/internals/en/rows-event.html * */ public class UpdateRowsEventV1 extends RowsEvent implements EventParser { @Override public UpdateRowsEventV1 parser(EventContext context, BasicReader reader) { if(context.getHeaderLen(BinLogEventType.WRITE_ROWS_EVENTv1) == 6) { tableId = reader.readFixedIntT4(); } else { tableId = reader.readFixedIntT6(); } flags = reader.readFixedIntT2(); // extraDataLength = reader.readFixedIntT2(); // extraData = reader.readBytesVarLen(extraDataLength - 2); // FIXME Zh主观认为columns不会大于 Integer.MaxValue,Haha. numberOfColumns = (int) reader.readLenEncInt(); columnsPresent = reader.readBytesVarLen((numberOfColumns + 7 ) / 8); columnsPresent2 = reader.readBytesVarLen((numberOfColumns + 7 ) / 8); nullBitmap = reader.readBytesVarLen((numberOfColumns + 7 ) / 8); columns1 = context.getAfterColumns().init(columnsPresent, nullBitmap); while(columns1.hasNext()) { ColumnDef def = columns1.next(); Object v = null; if(!columns1.isNull()) { v = ColumnValueParser.valueOf(def.getType(), def.getMeta(), reader); } columns1.add(new Column(def.getType(), v)); } columns2 = context.getBeforeColumns().init(columnsPresent2, nullBitmap); while(columns2.hasNext()) { ColumnDef def = columns2.next(); Object v = null; if(!columns2.isNull()) { v = ColumnValueParser.valueOf(def.getType(), def.getMeta(), reader); } columns2.add(new Column(def.getType(), v)); } return this; } }