private Entry parserQueryEvent(QueryLogEvent event) { String queryString = event.getQuery(); if (StringUtils.endsWithIgnoreCase(queryString, BEGIN)) { TransactionBegin transactionBegin = createTransactionBegin(event.getExecTime()); Header header = createHeader(binlogFileName, event.getHeader(), "", ""); return createEntry(header, EntryType.TRANSACTIONBEGIN, transactionBegin.toByteString()); } else if (StringUtils.endsWithIgnoreCase(queryString, COMMIT)) { TransactionEnd transactionEnd = createTransactionEnd(0L, event.getWhen()); // MyISAM可能不会有xid事件 Header header = createHeader(binlogFileName, event.getHeader(), "", ""); return createEntry(header, EntryType.TRANSACTIONEND, transactionEnd.toByteString()); } else { // DDL语句处理 DdlResult result = SimpleDdlParser.parse(queryString, event.getDbName()); if (result == null) { logger.warn( "WARN ## sql = {} , position = {}:{} is not create table/alter table/drop table ddl sql,so will ignore", new Object[] { queryString, binlogFileName, event.getHeader().getLogPos() - event.getHeader().getEventLen() }); return null; } String schemaName = event.getDbName(); if (StringUtils.isEmpty(schemaName) && StringUtils.isNotEmpty(result.getSchemaName())) { schemaName = result.getSchemaName(); } String tableName = result.getTableName(); if (tableMetaCache != null && (result.getType() == EventType.ALTER || result.getType() == EventType.ERASE)) { if (StringUtils.isNotEmpty(tableName)) { // 如果解析到了正确的表信息,则根据全名进行清除 tableMetaCache.clearTableMetaWithFullName(schemaName + "." + tableName); } else { // 如果无法解析正确的表信息,则根据schema进行清除 tableMetaCache.clearTableMetaWithSchemaName(schemaName); } } Header header = createHeader(binlogFileName, event.getHeader(), schemaName, tableName); RowChange.Builder rowChangeBuider = RowChange.newBuilder(); rowChangeBuider.setIsDdl(true); rowChangeBuider.setSql(queryString); rowChangeBuider.setEventType(result.getType()); return createEntry(header, EntryType.ROWDATA, rowChangeBuider.build().toByteString()); } }
public void reset() { // do nothing binlogFileName = "mysql-bin.000001"; if (tableMetaCache != null) { tableMetaCache.clearTableMeta(); } }
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); } }