/** * Get the name of the JDBC catalog. * * @return the catalog name, or null if the table does not belong to a catalog */ public String catalog() { return tableId.catalog(); }
public ChangeTable(TableId sourceTableId, String captureInstance, int changeTableObjectId, Lsn startLsn, Lsn stopLsn) { super(); this.sourceTableId = sourceTableId; this.captureInstance = captureInstance; this.changeTableObjectId = changeTableObjectId; this.startLsn = startLsn; this.stopLsn = stopLsn; this.changeTableId = sourceTableId != null ? new TableId(sourceTableId.catalog(), CDC_SCHEMA, captureInstance + "_CT") : null; }
private Predicate<TableId> buildStartingFromDbFilter(Predicate<String> dbFilter, Predicate<String> schemaFilter, Predicate<TableId> tableFilter) { assert dbFilter != null; if (schemaFilter != null) { if (tableFilter != null) { return (id) -> dbFilter.test(id.catalog()) && schemaFilter.test(id.schema()) && tableFilter.test(id); } else { return (id) -> schemaFilter.test(id.schema()); } } else if (tableFilter != null) { return (id) -> dbFilter.test(id.catalog()) && tableFilter.test(id); } else { return (id) -> dbFilter.test(id.catalog()); } } }
protected static boolean isBuiltInTable(TableId id ) { return isBuiltInDatabase(id.catalog()); }
protected List<String> readPrimaryKeyNames(DatabaseMetaData metadata, TableId id) throws SQLException { final List<String> pkColumnNames = new ArrayList<>(); try (ResultSet rs = metadata.getPrimaryKeys(id.catalog(), id.schema(), id.table())) { while (rs.next()) { String columnName = rs.getString(4); int columnIndex = rs.getInt(5); Collect.set(pkColumnNames, columnIndex - 1, columnName, null); } } return pkColumnNames; }
public void removeTablesForDatabase(String catalogName, String schemaName) { lock.write(() -> { tablesByTableId.entrySet().removeIf(tableIdTableEntry -> { TableId tableId = tableIdTableEntry.getKey(); boolean equalCatalog = Objects.equals(catalogName, tableId.catalog()); boolean equalSchema = Objects.equals(schemaName, tableId.schema()); return equalSchema && equalCatalog; }); }); }
/** * Get the default topic selector logic, which uses a '.' delimiter character when needed. * * @param prefix the name of the prefix to be used for all topics; may not be null and must not terminate in the * {@code delimiter} * @param heartbeatPrefix the name of the prefix to be used for all heartbeat topics; may not be null and must not terminate in the * {@code delimiter} * @return the topic selector; never null */ static TopicSelector<TableId> defaultSelector(String prefix, String heartbeatPrefix) { return TopicSelector.defaultSelector(prefix, heartbeatPrefix, ".", (t, pref, delimiter) -> String.join(delimiter, pref, t.catalog(), t.table())); } }
protected String getDatabase(Event event) { switch (event.type()) { case CREATE_TABLE: case ALTER_TABLE: case DROP_TABLE: case TRUNCATE_TABLE: TableEvent tableEvent = (TableEvent) event; return tableEvent.tableId().catalog(); case CREATE_INDEX: case DROP_INDEX: TableIndexEvent tableIndexEvent = (TableIndexEvent) event; return tableIndexEvent.tableId().catalog(); case CREATE_DATABASE: case ALTER_DATABASE: case DROP_DATABASE: DatabaseEvent dbEvent = (DatabaseEvent) event; return dbEvent.databaseName(); case SET_VARIABLE: return ""; } assert false : "Should never happen"; return null; }
protected String quote(TableId id) { return quote(id.catalog()) + "." + quote(id.table()); }
protected static TableId parse(String table) { TableId tableId = TableId.parse(table, false); if (tableId == null) { return null; } return tableId.schema() == null ? new TableId(tableId.catalog(), PUBLIC_SCHEMA_NAME, tableId.table()) : tableId; }
protected void assertNoTablesExistForDatabase(String dbName) { assertThat(mysql.tableIds().stream().filter(id->id.catalog().equals(dbName)).count()).isEqualTo(0); } protected void assertTablesExistForDatabase(String dbName) {
protected void assertTablesExistForDatabase(String dbName) { assertThat(mysql.tableIds().stream().filter(id->id.catalog().equals(dbName)).count()).isGreaterThan(0); }
/** * Returns a {@link ColumnEditor} representing the current record of the given result set of column metadata, if * included in the column whitelist. */ protected Optional<ColumnEditor> readTableColumn(ResultSet columnMetadata, TableId tableId, ColumnNameFilter columnFilter) throws SQLException { final String columnName = columnMetadata.getString(4); if (columnFilter == null || columnFilter.matches(tableId.catalog(), tableId.schema(), tableId.table(), columnName)) { final ColumnEditor column = Column.editor().name(columnName); column.jdbcType(columnMetadata.getInt(5)); column.type(columnMetadata.getString(6)); column.length(columnMetadata.getInt(7)); if (columnMetadata.getObject(9) != null) { column.scale(columnMetadata.getInt(9)); } column.optional(isNullable(columnMetadata.getInt(11))); column.position(columnMetadata.getInt(17)); column.autoIncremented("YES".equalsIgnoreCase(columnMetadata.getString(23))); String autogenerated = null; try { autogenerated = columnMetadata.getString(24); } catch (SQLException e) { // ignore, some drivers don't have this index - e.g. Postgres } column.generated("YES".equalsIgnoreCase(autogenerated)); column.nativeType(resolveNativeType(column.typeName())); return Optional.of(column); } return Optional.empty(); }
protected static TableId tableIdFromInsertStmt(String statement) { Matcher matcher = INSERT_TABLE_MATCHING_PATTERN.matcher(statement); assertTrue("Extraction of table name from insert statement failed: " + statement, matcher.matches()); TableId id = TableId.parse(matcher.group(1), false); if (id.schema() == null) { id = new TableId(id.catalog(), "public", id.table()); } return id; }
/** * Returns the type schema name for the given table. */ private String tableSchemaName(TableId tableId) { if (Strings.isNullOrEmpty(tableId.catalog())) { if (Strings.isNullOrEmpty(tableId.schema())) { return tableId.table(); } else { return tableId.schema() + "." + tableId.table(); } } else if (Strings.isNullOrEmpty(tableId.schema())) { return tableId.catalog() + "." + tableId.table(); } // When both catalog and schema is present then only schema is used else { return tableId.schema() + "." + tableId.table(); } }
@Override public void emitSchemaChangeEvent(Receiver receiver) throws InterruptedException { final SchemaChangeEvent event = new SchemaChangeEvent( offsetContext.getPartition(), offsetContext.getOffset(), changeTable.getSourceTableId().catalog(), changeTable.getSourceTableId().schema(), "N/A", tableSchema, SchemaChangeEventType.CREATE, false ); receiver.schemaChangeEvent(event); } }
result.put(DB_NAME_KEY, tableId.catalog()); result.put(TABLE_NAME_KEY, tableId.table());
protected List<String> readPrimaryKeyNames(DatabaseMetaData metadata, TableId id) throws SQLException { final List<String> pkColumnNames = new ArrayList<>(); try (ResultSet rs = metadata.getPrimaryKeys(id.catalog(), id.schema(), id.table())) { while (rs.next()) { String columnName = rs.getString(4); int columnIndex = rs.getInt(5); Collect.set(pkColumnNames, columnIndex - 1, columnName, null); } } return pkColumnNames; }
protected static TableId parse(String table) { TableId tableId = TableId.parse(table, false); if (tableId == null) { return null; } return tableId.schema() == null ? new TableId(tableId.catalog(), PUBLIC_SCHEMA_NAME, tableId.table()) : tableId; }
protected static TableId tableIdFromInsertStmt(String statement) { Matcher matcher = INSERT_TABLE_MATCHING_PATTERN.matcher(statement); assertTrue("Extraction of table name from insert statement failed: " + statement, matcher.matches()); TableId id = TableId.parse(matcher.group(1), false); if (id.schema() == null) { id = new TableId(id.catalog(), "public", id.table()); } return id; }