import com.github.shyiko.mysql.binlog.event.TableMapEventData; //导入方法依赖的package包/类
private void handleTableMap(TableMapEventData data) throws SQLException {
Pair tableUniqueName = new ImmutablePair(data.getDatabase(), data.getTable());
if (databaseNameToTableIdMap.containsKey(tableUniqueName)) {
// delete the id->info mapping
System.out.println("Removing old db info!");
long oldTableId = databaseNameToTableIdMap.get(tableUniqueName);
tableIdToDataMap.remove(oldTableId);
}
tableIdToDataMap.put(data.getTableId(), data);
databaseNameToTableIdMap.put(tableUniqueName, data.getTableId());
if (databaseNameToTableMetadata.containsKey(tableUniqueName)) {
return;
}
// lookup the data
TableMetadata tableMetadata = new TableMetadata();
String dbName = data.getDatabase();
String tableName = data.getTable();
// XXX I should close this connection!
Connection connection;
connection = DriverManager.getConnection(
"jdbc:mysql://" + hostname + ":" + port + "/" + dbName, // notice the dbname is here. mysql's jdbc driver requires it.
username,
password);
DatabaseMetaData databaseMetaData = connection.getMetaData();
// get column names
ResultSet rs = databaseMetaData.getColumns(null, null, tableName, null);
// what about failures to connect to database? Need to make sure that we catch the case where we add an empty list, and then fail (meaning, no column names)
ArrayList columnNames = new ArrayList();
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
// 1 based, but we don't care. We just add them in order. This
// assumes that the columns come in ORDINAL_POSITION order, but the
// docs for getColumns() says they do.
// String position = rs.getString("ORDINAL_POSITION");
columnNames.add(columnName);
}
tableMetadata.setColumnNames(columnNames);
// get primary keys
ResultSet rs2 = databaseMetaData.getPrimaryKeys(null, null, tableName);
List primaryKeyColumns = new ArrayList();
while (rs2.next()) {
primaryKeyColumns.add(rs2.getString("COLUMN_NAME"));
}
if (primaryKeyColumns.isEmpty()) {
throw new RuntimeException(String.format("Table %s.%s does not have a primary key!", data.getDatabase(), data.getTable()));
}
tableMetadata.setPrimaryKeys(primaryKeyColumns);
System.out.println(tableMetadata);
// Only upon successful lookup, with no sql errors, do we save the data.
databaseNameToTableMetadata.put(tableUniqueName, tableMetadata);
}