private void processTableMapEvent(Event event) { TableMapEventData data = event.getData(); String dbName = data.getDatabase(); String tableName = data.getTable(); Long tableId = data.getTableId(); Table table = schema.getTable(dbName, tableName); tableMap.put(tableId, table); }
" (e.g. from WRITE_ROWS and not proceeding TABLE_MAP"); byte[] types = tableMapEvent.getColumnTypes(); int[] metadata = tableMapEvent.getColumnMetadata(); Serializable[] result = new Serializable[numberOfBitsSet(includedColumns)]; BitSet nullColumns = inputStream.readBitSet(result.length, true);
@Override public TableMapEventData deserialize(ByteArrayInputStream inputStream) throws IOException { TableMapEventData eventData = new TableMapEventData(); eventData.setTableId(inputStream.readLong(6)); inputStream.skip(3); // 2 bytes reserved for future use + 1 for the length of database name eventData.setDatabase(inputStream.readZeroTerminatedString()); inputStream.skip(1); // table name eventData.setTable(inputStream.readZeroTerminatedString()); int numberOfColumns = inputStream.readPackedInteger(); eventData.setColumnTypes(inputStream.read(numberOfColumns)); inputStream.readPackedInteger(); // metadata length eventData.setColumnMetadata(readMetadata(inputStream, eventData.getColumnTypes())); eventData.setColumnNullability(inputStream.readBitSet(numberOfColumns, true)); return eventData; }
case TABLE_MAP: { TableMapEventData tableMapEvent = event.getData(); if (tableMapEvent.getTable().equalsIgnoreCase(sourceTableName)) { tableMapEventByTableId.put(tableMapEvent.getTableId(), tableMapEvent);
public EventData deserializeTableMapEventData(ByteArrayInputStream inputStream, EventHeader eventHeader) throws IOException { EventDataDeserializer eventDataDeserializer = tableMapEventDataDeserializer != null ? tableMapEventDataDeserializer : getEventDataDeserializer(EventType.TABLE_MAP); EventData eventData = deserializeEventData(inputStream, eventHeader, eventDataDeserializer); TableMapEventData tableMapEvent; if (eventData instanceof EventDataWrapper) { EventDataWrapper eventDataWrapper = (EventDataWrapper) eventData; tableMapEvent = (TableMapEventData) eventDataWrapper.getInternal(); if (tableMapEventDataDeserializer != null) { eventData = eventDataWrapper.getExternal(); } } else { tableMapEvent = (TableMapEventData) eventData; } tableMapEventByTableId.put(tableMapEvent.getTableId(), tableMapEvent); return eventData; }
public Long getTableID() { EventData data = event.getData(); switch ( event.getHeader().getEventType() ) { case EXT_WRITE_ROWS: case WRITE_ROWS: return ((WriteRowsEventData) data).getTableId(); case EXT_UPDATE_ROWS: case UPDATE_ROWS: return ((UpdateRowsEventData) data).getTableId(); case EXT_DELETE_ROWS: case DELETE_ROWS: return ((DeleteRowsEventData) data).getTableId(); case TABLE_MAP: return ((TableMapEventData) data).getTableId(); } return null; }
/** * Handle a change in the table metadata. * <p> * This method should be called whenever we consume a TABLE_MAP event, and every transaction in the log should include one * of these for each table affected by the transaction. Each table map event includes a monotonically-increasing numeric * identifier, and this identifier is used within subsequent events within the same transaction. This table identifier can * change when: * <ol> * <li>the table structure is modified (e.g., via an {@code ALTER TABLE ...} command); or</li> * <li>MySQL rotates to a new binary log file, even if the table structure does not change.</li> * </ol> * * @param event the update event; never null */ protected void handleUpdateTableMetadata(Event event) { TableMapEventData metadata = unwrapData(event); long tableNumber = metadata.getTableId(); String databaseName = metadata.getDatabase(); String tableName = metadata.getTable(); TableId tableId = new TableId(databaseName, null, tableName); if (recordMakers.assign(tableNumber, tableId)) { logger.debug("Received update table metadata event: {}", event); } else { informAboutUnknownTableIfRequired(event, tableId, "update table metadata"); } }
@Override public Event nextEvent(ByteArrayInputStream inputStream) throws IOException { try { // Delegate to the superclass ... Event event = super.nextEvent(inputStream); // We have to record the most recent TableMapEventData for each table number for our custom deserializers ... if (event.getHeader().getEventType() == EventType.TABLE_MAP) { TableMapEventData tableMapEvent = event.getData(); tableMapEventByTableId.put(tableMapEvent.getTableId(), tableMapEvent); } return event; } // DBZ-217 In case an event couldn't be read we create a pseudo-event for the sake of logging catch(EventDataDeserializationException edde) { EventHeaderV4 header = new EventHeaderV4(); header.setEventType(EventType.INCIDENT); header.setTimestamp(edde.getEventHeader().getTimestamp()); header.setServerId(edde.getEventHeader().getServerId()); if(edde.getEventHeader() instanceof EventHeaderV4) { header.setEventLength(((EventHeaderV4)edde.getEventHeader()).getEventLength()); header.setNextPosition(((EventHeaderV4)edde.getEventHeader()).getNextPosition()); header.setFlags(((EventHeaderV4)edde.getEventHeader()).getFlags()); } EventData data = new EventDataDeserializationExceptionData(edde); return new Event(header, data); } } };
protected Serializable[] deserializeRow(long tableId, BitSet includedColumns, ByteArrayInputStream inputStream) throws IOException { TableMapEventData tableMapEvent = tableMapEventByTableId.get(tableId); byte[] types = tableMapEvent.getColumnTypes(); int[] metadata = tableMapEvent.getColumnMetadata(); BitSet nullColumns = inputStream.readBitSet(types.length, true); Serializable[] result = new Serializable[numberOfBitsSet(includedColumns)];
skipTable = (databaseNamePattern != null && !databaseNamePattern.matcher(data.getDatabase()).matches()) || (tableNamePattern != null && !tableNamePattern.matcher(data.getTable()).matches()); TableInfoCacheKey key = new TableInfoCacheKey(this.getIdentifier(), data.getDatabase(), data.getTable(), data.getTableId()); if (cacheClient != null) { try {
case TABLE_MAP: TableMapEventData data = event.tableMapData(); tableCache.processEvent(getSchema(), this.filter, data.getTableId(), data.getDatabase(), data.getTable()); break; case ROWS_QUERY:
case TABLE_MAP: TableMapEventData data = event.tableMapData(); tableCache.processEvent(getSchema(), this.filter, data.getTableId(), data.getDatabase(), data.getTable()); break; case QUERY:
TableMapEventData tableMapEventData = (TableMapEventData) eventData; if (tableMapEventData.getDatabase().equals(databaseName) && tableMapEventData.getTable().equalsIgnoreCase(recordTableName)) { recordTableId = tableMapEventData.getTableId(); LOGGER.debug("Table ID: {}", recordTableId);
LOGGER.info("[{}] event type isn't valid!", eventType); if (tableMapEventData.getTableId() == tableId) { events.add(event); if (((TableMapEventData) eventData).getDatabase().equals(catalog) && ((TableMapEventData) eventData).getTable().equalsIgnoreCase(SqlDatabase.RECORD_TABLE)) { tableMapEventData = (TableMapEventData) eventData;
case TABLE_MAP: { TableMapEventData tableMapEvent = event.getData(); if (tableMapEvent.getTable().equalsIgnoreCase(sourceTableName) && tableMapEvent.getDatabase().equalsIgnoreCase(sourceDatabase.getEventuateDatabaseSchema())) { tableMapEventByTableId.put(tableMapEvent.getTableId(), tableMapEvent);
skipTable = (databaseNamePattern != null && !databaseNamePattern.matcher(data.getDatabase()).matches()) || (tableNamePattern != null && !tableNamePattern.matcher(data.getTable()).matches()); TableInfoCacheKey key = new TableInfoCacheKey(this.getIdentifier(), data.getDatabase(), data.getTable(), data.getTableId()); if (cacheClient != null) { try {