private Entry parseRowsEvent(RowsLogEvent event) { try { TableMapLogEvent table = event.getTable(); if (table == null) { // tableId对应的记录不存在 throw new TableIdNotFoundException("not found tableId:" + event.getTableId()); } String fullname = getSchemaNameAndTableName(table); if (nameFilter != null && !nameFilter.filter(fullname)) { // check name filter return null; } Header header = createHeader(binlogFileName, event.getHeader(), table.getDbName(), table.getTableName()); RowChange.Builder rowChangeBuider = RowChange.newBuilder(); rowChangeBuider.setTableId(event.getTableId()); rowChangeBuider.setIsDdl(false); EventType eventType = null; int type = event.getHeader().getType(); if (LogEvent.WRITE_ROWS_EVENT_V1 == type || LogEvent.WRITE_ROWS_EVENT == type) { eventType = EventType.INSERT; } else if (LogEvent.UPDATE_ROWS_EVENT_V1 == type || LogEvent.UPDATE_ROWS_EVENT == type) { eventType = EventType.UPDATE; } else if (LogEvent.DELETE_ROWS_EVENT_V1 == type || LogEvent.DELETE_ROWS_EVENT == type) { eventType = EventType.DELETE; } else { throw new CanalParseException("unsupport event type :" + event.getHeader().getType()); } rowChangeBuider.setEventType(eventType); RowsLogBuffer buffer = event.getRowsBuf(charset.name()); BitSet columns = event.getColumns(); BitSet changeColumns = event.getColumns(); TableMeta tableMeta = null; if (tableMetaCache != null) { // 入错存在table meta cache tableMeta = tableMetaCache.getTableMeta(fullname); if (tableMeta == null) { throw new CanalParseException("not found [" + fullname + "] in db , pls check!"); } } while (buffer.nextOneRow(columns)) { // 处理row记录 RowData.Builder rowDataBuilder = RowData.newBuilder(); if (EventType.INSERT == eventType) { // insert的记录放在before字段中 parseOneRow(rowDataBuilder, event, buffer, columns, true, tableMeta); } else if (EventType.DELETE == eventType) { // delete的记录放在before字段中 parseOneRow(rowDataBuilder, event, buffer, columns, false, tableMeta); } else { // update需要处理before/after parseOneRow(rowDataBuilder, event, buffer, columns, false, tableMeta); if (!buffer.nextOneRow(changeColumns)) { rowChangeBuider.addRowDatas(rowDataBuilder.build()); break; } parseOneRow(rowDataBuilder, event, buffer, event.getChangeColumns(), true, tableMeta); } rowChangeBuider.addRowDatas(rowDataBuilder.build()); } return createEntry(header, EntryType.ROWDATA, rowChangeBuider.build().toByteString()); } catch (Exception e) { throw new CanalParseException("parse row data failed.", e); } }