|
@@ -3,6 +3,7 @@
|
|
*/
|
|
*/
|
|
package org.dbsyncer.connector.oracle.cdc;
|
|
package org.dbsyncer.connector.oracle.cdc;
|
|
|
|
|
|
|
|
+import java.sql.SQLException;
|
|
import net.sf.jsqlparser.JSQLParserException;
|
|
import net.sf.jsqlparser.JSQLParserException;
|
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
|
import net.sf.jsqlparser.schema.Table;
|
|
import net.sf.jsqlparser.schema.Table;
|
|
@@ -14,17 +15,22 @@ import net.sf.jsqlparser.statement.update.Update;
|
|
import org.dbsyncer.common.util.StringUtil;
|
|
import org.dbsyncer.common.util.StringUtil;
|
|
import org.dbsyncer.connector.oracle.OracleException;
|
|
import org.dbsyncer.connector.oracle.OracleException;
|
|
import org.dbsyncer.connector.oracle.logminer.LogMiner;
|
|
import org.dbsyncer.connector.oracle.logminer.LogMiner;
|
|
|
|
+import org.dbsyncer.connector.oracle.logminer.RedoEvent;
|
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.DeleteSql;
|
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.InsertSql;
|
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.Parser;
|
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.UpdateSql;
|
|
import org.dbsyncer.sdk.config.DatabaseConfig;
|
|
import org.dbsyncer.sdk.config.DatabaseConfig;
|
|
|
|
+import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
|
|
import org.dbsyncer.sdk.constant.ConnectorConstant;
|
|
import org.dbsyncer.sdk.constant.ConnectorConstant;
|
|
import org.dbsyncer.sdk.listener.AbstractDatabaseListener;
|
|
import org.dbsyncer.sdk.listener.AbstractDatabaseListener;
|
|
import org.dbsyncer.sdk.listener.event.DDLChangedEvent;
|
|
import org.dbsyncer.sdk.listener.event.DDLChangedEvent;
|
|
|
|
+import org.dbsyncer.sdk.listener.event.RowChangedEvent;
|
|
import org.dbsyncer.sdk.listener.event.SqlChangedEvent;
|
|
import org.dbsyncer.sdk.listener.event.SqlChangedEvent;
|
|
import org.dbsyncer.sdk.model.ChangedOffset;
|
|
import org.dbsyncer.sdk.model.ChangedOffset;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
-import java.sql.SQLException;
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* @Author AE86
|
|
* @Author AE86
|
|
* @Version 1.0.0
|
|
* @Version 1.0.0
|
|
@@ -48,35 +54,17 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
String schema = config.getSchema();
|
|
String schema = config.getSchema();
|
|
boolean containsPos = snapshot.containsKey(REDO_POSITION);
|
|
boolean containsPos = snapshot.containsKey(REDO_POSITION);
|
|
logMiner = new LogMiner(username, password, url, schema, driverClassName);
|
|
logMiner = new LogMiner(username, password, url, schema, driverClassName);
|
|
- logMiner.setStartScn(containsPos ? Long.parseLong(snapshot.get(REDO_POSITION)) : 0);
|
|
|
|
|
|
+ if (!snapshot.get(REDO_POSITION).equals("null")){
|
|
|
|
+ logMiner.setStartScn(containsPos ? Long.parseLong(snapshot.get(REDO_POSITION)) : 0);
|
|
|
|
+ }
|
|
logMiner.registerEventListener((event) -> {
|
|
logMiner.registerEventListener((event) -> {
|
|
|
|
+// sendSql(event);
|
|
try {
|
|
try {
|
|
- Statement statement = CCJSqlParserUtil.parse(event.getRedoSql());
|
|
|
|
- if (statement instanceof Update) {
|
|
|
|
- Update update = (Update) statement;
|
|
|
|
- sendChangedEvent(new SqlChangedEvent(replaceTableName(update.getTable()), ConnectorConstant.OPERTION_UPDATE, event.getRedoSql(), null, event.getScn()));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (statement instanceof Insert) {
|
|
|
|
- Insert insert = (Insert) statement;
|
|
|
|
- sendChangedEvent(new SqlChangedEvent(replaceTableName(insert.getTable()), ConnectorConstant.OPERTION_INSERT, event.getRedoSql(), null, event.getScn()));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (statement instanceof Delete) {
|
|
|
|
- Delete delete = (Delete) statement;
|
|
|
|
- sendChangedEvent(new SqlChangedEvent(replaceTableName(delete.getTable()), ConnectorConstant.OPERTION_DELETE, event.getRedoSql(), null, event.getScn()));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (statement instanceof Alter) {
|
|
|
|
- Alter alter = (Alter) statement;
|
|
|
|
- sendChangedEvent(new DDLChangedEvent("", replaceTableName(alter.getTable()), ConnectorConstant.OPERTION_ALTER, event.getRedoSql(), null, event.getScn()));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ parseSqlToPk(event);
|
|
} catch (JSQLParserException e) {
|
|
} catch (JSQLParserException e) {
|
|
logger.error("不支持sql:" + event.getRedoSql());
|
|
logger.error("不支持sql:" + event.getRedoSql());
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ logger.error(e.getMessage());
|
|
}
|
|
}
|
|
});
|
|
});
|
|
logMiner.start();
|
|
logMiner.start();
|
|
@@ -86,6 +74,75 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ //发送sql解析时间
|
|
|
|
+ private void sendSql(RedoEvent event){
|
|
|
|
+ try {
|
|
|
|
+ Statement statement = CCJSqlParserUtil.parse(event.getRedoSql());
|
|
|
|
+ if (statement instanceof Update) {
|
|
|
|
+ Update update = (Update) statement;
|
|
|
|
+ sendChangedEvent(new SqlChangedEvent(replaceTableName(update.getTable()), ConnectorConstant.OPERTION_UPDATE, event.getRedoSql(), null, event.getScn()));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (statement instanceof Insert) {
|
|
|
|
+ Insert insert = (Insert) statement;
|
|
|
|
+ sendChangedEvent(new SqlChangedEvent(replaceTableName(insert.getTable()), ConnectorConstant.OPERTION_INSERT, event.getRedoSql(), null, event.getScn()));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (statement instanceof Delete) {
|
|
|
|
+ Delete delete = (Delete) statement;
|
|
|
|
+ sendChangedEvent(new SqlChangedEvent(replaceTableName(delete.getTable()), ConnectorConstant.OPERTION_DELETE, event.getRedoSql(), null, event.getScn()));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (statement instanceof Alter) {
|
|
|
|
+ Alter alter = (Alter) statement;
|
|
|
|
+ sendChangedEvent(new DDLChangedEvent("", replaceTableName(alter.getTable()), ConnectorConstant.OPERTION_ALTER, event.getRedoSql(), null, event.getScn()));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ } catch (JSQLParserException e) {
|
|
|
|
+ logger.error("不支持sql:" + event.getRedoSql());
|
|
|
|
+ }catch (Exception e){
|
|
|
|
+ logger.error(e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //解析sql出来主键数据
|
|
|
|
+ private void parseSqlToPk(RedoEvent event) throws Exception {
|
|
|
|
+ Statement statement = CCJSqlParserUtil.parse(event.getRedoSql());
|
|
|
|
+ if (statement instanceof Insert){
|
|
|
|
+ Insert insert = (Insert) statement;
|
|
|
|
+ org.dbsyncer.sdk.model.Table table1 =sourceTable.stream()
|
|
|
|
+ .filter(x->x.getName().equals(replaceTableName(insert.getTable())))
|
|
|
|
+ .findFirst().orElse(null);
|
|
|
|
+ if (table1 != null){
|
|
|
|
+ Parser parser = new InsertSql(insert,table1.getColumn(),(DatabaseConnectorInstance) connectorInstance);
|
|
|
|
+ sendChangedEvent(new RowChangedEvent(replaceTableName(insert.getTable()), ConnectorConstant.OPERTION_INSERT,parser.parseSql() ,null,event.getScn()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }else if (statement instanceof Update){
|
|
|
|
+ Update update = (Update) statement;
|
|
|
|
+ org.dbsyncer.sdk.model.Table table1 =sourceTable.stream()
|
|
|
|
+ .filter(x->x.getName().equals(replaceTableName(update.getTable())))
|
|
|
|
+ .findFirst().orElse(null);
|
|
|
|
+ if (table1 != null){
|
|
|
|
+ Parser parser = new UpdateSql(update,table1.getColumn(),(DatabaseConnectorInstance) connectorInstance);
|
|
|
|
+ sendChangedEvent(new RowChangedEvent(replaceTableName(update.getTable()), ConnectorConstant.OPERTION_UPDATE, parser.parseSql(),null,event.getScn()));
|
|
|
|
+ }
|
|
|
|
+ }else if (statement instanceof Delete){
|
|
|
|
+ Delete delete = (Delete) statement;
|
|
|
|
+ org.dbsyncer.sdk.model.Table table1 =sourceTable.stream()
|
|
|
|
+ .filter(x->x.getName().equals(replaceTableName(delete.getTable())))
|
|
|
|
+ .findFirst().orElse(null);
|
|
|
|
+ if (table1 !=null){
|
|
|
|
+ Parser parser = new DeleteSql(delete,table1.getColumn());
|
|
|
|
+ sendChangedEvent(new RowChangedEvent(replaceTableName(delete.getTable()), ConnectorConstant.OPERTION_DELETE, parser.parseSql(),null,event.getScn()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void close() {
|
|
public void close() {
|
|
try {
|
|
try {
|
|
@@ -109,4 +166,5 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
return StringUtil.replace(table.getName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY);
|
|
return StringUtil.replace(table.getName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
}
|
|
}
|