Example #1
0
  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());
    }
  }
Example #2
0
 public void reset() {
   // do nothing
   binlogFileName = "mysql-bin.000001";
   if (tableMetaCache != null) {
     tableMetaCache.clearTableMeta();
   }
 }
Example #3
0
  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);
    }
  }