change rename operate

This commit is contained in:
jiawei
2015-07-15 19:20:30 +08:00
parent a743235eae
commit 119af9fca1
2 changed files with 55 additions and 8 deletions

View File

@@ -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();

View File

@@ -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();
} }
} }