mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
change rename operate
This commit is contained in:
@@ -215,6 +215,15 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar
|
|||||||
// 更新下table meta cache
|
// 更新下table meta cache
|
||||||
if (tableMetaCache != null
|
if (tableMetaCache != null
|
||||||
&& (result.getType() == EventType.ALTER || result.getType() == EventType.ERASE || result.getType() == EventType.RENAME)) {
|
&& (result.getType() == EventType.ALTER || result.getType() == EventType.ERASE || result.getType() == EventType.RENAME)) {
|
||||||
|
|
||||||
|
for( ;result!=null; result = result.getRenameTableResult()) {
|
||||||
|
schemaName = event.getDbName();
|
||||||
|
if (StringUtils.isNotEmpty(result.getSchemaName())) {
|
||||||
|
schemaName = result.getSchemaName();
|
||||||
|
}
|
||||||
|
|
||||||
|
tableName = result.getTableName();
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(tableName)) {
|
if (StringUtils.isNotEmpty(tableName)) {
|
||||||
// 如果解析到了正确的表信息,则根据全名进行清除
|
// 如果解析到了正确的表信息,则根据全名进行清除
|
||||||
tableMetaCache.clearTableMeta(schemaName, tableName);
|
tableMetaCache.clearTableMeta(schemaName, tableName);
|
||||||
@@ -223,6 +232,7 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar
|
|||||||
tableMetaCache.clearTableMetaWithSchemaName(schemaName);
|
tableMetaCache.clearTableMetaWithSchemaName(schemaName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Header header = createHeader(binlogFileName, event.getHeader(), schemaName, tableName, type);
|
Header header = createHeader(binlogFileName, event.getHeader(), schemaName, tableName, type);
|
||||||
RowChange.Builder rowChangeBuider = RowChange.newBuilder();
|
RowChange.Builder rowChangeBuider = RowChange.newBuilder();
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public class SimpleDdlParser {
|
|||||||
public static final String UPDATE_PATTERN = "^\\s*UPDATE(.*)$";
|
public static final String UPDATE_PATTERN = "^\\s*UPDATE(.*)$";
|
||||||
public static final String DELETE_PATTERN = "^\\s*DELETE(.*)$";
|
public static final String DELETE_PATTERN = "^\\s*DELETE(.*)$";
|
||||||
public static final String RENAME_PATTERN = "^\\s*RENAME\\s*TABLE\\s*(.*?)\\s*TO\\s*(.*?)$";
|
public static final String RENAME_PATTERN = "^\\s*RENAME\\s*TABLE\\s*(.*?)\\s*TO\\s*(.*?)$";
|
||||||
|
public static final String RENAME_REMNANT_PATTERN = "^\\s*(.*?)\\s*TO\\s*(.*?)$";
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
* CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
|
* CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
|
||||||
@@ -74,6 +75,18 @@ public class SimpleDdlParser {
|
|||||||
result = parseRename(queryString, schmeaName, RENAME_PATTERN);
|
result = parseRename(queryString, schmeaName, RENAME_PATTERN);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
result.setType(EventType.RENAME);
|
result.setType(EventType.RENAME);
|
||||||
|
|
||||||
|
String[] renameStrings = queryString.split(",");
|
||||||
|
if (renameStrings.length > 1){
|
||||||
|
DdlResult lastResult = result;
|
||||||
|
for (int i=1; i<renameStrings.length; i++){
|
||||||
|
DdlResult ddlResult = parseRename(renameStrings[i], schmeaName, RENAME_REMNANT_PATTERN);
|
||||||
|
ddlResult.setType(EventType.RENAME);
|
||||||
|
lastResult.setRenameTableResult(ddlResult);
|
||||||
|
lastResult = ddlResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +218,14 @@ public class SimpleDdlParser {
|
|||||||
private String oriSchemaName; // rename ddl中的源表
|
private String oriSchemaName; // rename ddl中的源表
|
||||||
private String oriTableName; // rename ddl中的目标表
|
private String oriTableName; // rename ddl中的目标表
|
||||||
private EventType type;
|
private EventType type;
|
||||||
|
private DdlResult renameTableResult; // 多个rename table的存储
|
||||||
|
|
||||||
|
/*
|
||||||
|
RENAME TABLE tbl_name TO new_tbl_name
|
||||||
|
[, tbl_name2 TO new_tbl_name2] ...
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
public DdlResult(){
|
public DdlResult(){
|
||||||
}
|
}
|
||||||
@@ -265,10 +286,26 @@ public class SimpleDdlParser {
|
|||||||
this.oriTableName = oriTableName;
|
this.oriTableName = oriTableName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DdlResult getRenameTableResult() {
|
||||||
|
return renameTableResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRenameTableResult(DdlResult renameTableResult) {
|
||||||
|
this.renameTableResult = renameTableResult;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "DdlResult [schemaName=" + schemaName + ", tableName=" + tableName + ", oriSchemaName="
|
DdlResult ddlResult = this;
|
||||||
+ oriSchemaName + ", oriTableName=" + oriTableName + ", type=" + type + "]";
|
StringBuffer sb = new StringBuffer();
|
||||||
|
do{
|
||||||
|
String.format("DdlResult [schemaName=%s , tableName=%s , oriSchemaName=%s , oriTableName=%s , type=%s ;",
|
||||||
|
ddlResult.schemaName, ddlResult.tableName, ddlResult.oriSchemaName, ddlResult.oriTableName, ddlResult.type);
|
||||||
|
ddlResult = ddlResult.renameTableResult;
|
||||||
|
}while (ddlResult.renameTableResult!=null);
|
||||||
|
sb.append("]");
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user