|
@@ -3,34 +3,35 @@
|
|
|
*/
|
|
|
package org.dbsyncer.connector.oracle.cdc;
|
|
|
|
|
|
-import java.sql.SQLException;
|
|
|
import net.sf.jsqlparser.JSQLParserException;
|
|
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
|
|
import net.sf.jsqlparser.schema.Table;
|
|
|
import net.sf.jsqlparser.statement.Statement;
|
|
|
-import net.sf.jsqlparser.statement.alter.Alter;
|
|
|
import net.sf.jsqlparser.statement.delete.Delete;
|
|
|
import net.sf.jsqlparser.statement.insert.Insert;
|
|
|
import net.sf.jsqlparser.statement.update.Update;
|
|
|
import org.dbsyncer.common.util.StringUtil;
|
|
|
import org.dbsyncer.connector.oracle.OracleException;
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.AbstractParser;
|
|
|
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.connector.oracle.logminer.parser.impl.DeleteSql;
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.impl.InsertSql;
|
|
|
+import org.dbsyncer.connector.oracle.logminer.parser.impl.UpdateSql;
|
|
|
import org.dbsyncer.sdk.config.DatabaseConfig;
|
|
|
-import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
|
|
|
import org.dbsyncer.sdk.constant.ConnectorConstant;
|
|
|
import org.dbsyncer.sdk.listener.AbstractDatabaseListener;
|
|
|
-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.model.ChangedOffset;
|
|
|
+import org.dbsyncer.sdk.model.Field;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import java.sql.SQLException;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+
|
|
|
/**
|
|
|
* @Author AE86
|
|
|
* @Version 1.0.0
|
|
@@ -40,9 +41,14 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
|
|
|
|
private final Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
private final String REDO_POSITION = "position";
|
|
|
-
|
|
|
+ private final Map<String, List<Field>> tableFiledMap = new ConcurrentHashMap<>();
|
|
|
private LogMiner logMiner;
|
|
|
|
|
|
+ @Override
|
|
|
+ public void init() {
|
|
|
+ sourceTable.forEach(table -> tableFiledMap.put(table.getName(), table.getColumn()));
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void start() {
|
|
|
try {
|
|
@@ -56,13 +62,12 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
|
logMiner = new LogMiner(username, password, url, schema, driverClassName);
|
|
|
logMiner.setStartScn(containsPos ? Long.parseLong(snapshot.get(REDO_POSITION)) : 0);
|
|
|
logMiner.registerEventListener((event) -> {
|
|
|
-// sendSql(event);
|
|
|
try {
|
|
|
- parseSqlToPk(event);
|
|
|
+ parseEvent(event);
|
|
|
} catch (JSQLParserException e) {
|
|
|
- logger.error("不支持sql:" + event.getRedoSql());
|
|
|
+ logger.error("不支持sql:{}", event.getRedoSql());
|
|
|
} catch (Exception e) {
|
|
|
- logger.error(e.getMessage());
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
}
|
|
|
});
|
|
|
logMiner.start();
|
|
@@ -72,89 +77,39 @@ 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());
|
|
|
+ /**
|
|
|
+ * 解析时间
|
|
|
+ *
|
|
|
+ * @param event
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private void parseEvent(RedoEvent event) throws Exception {
|
|
|
+ // TODO life 注意拦截子查询, 或修改主键值情况
|
|
|
+ Statement statement = CCJSqlParserUtil.parse(event.getRedoSql());
|
|
|
+ if (statement instanceof Update) {
|
|
|
+ Update update = (Update) statement;
|
|
|
+ UpdateSql parser = new UpdateSql(update);
|
|
|
+ setTable(parser, update.getTable());
|
|
|
+ sendChangedEvent(new RowChangedEvent(parser.getTableName(), ConnectorConstant.OPERTION_UPDATE, parser.parseColumns(), null, event.getScn()));
|
|
|
+ return;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- //解析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()));
|
|
|
- }
|
|
|
+ InsertSql parser = new InsertSql(insert);
|
|
|
+ setTable(parser, insert.getTable());
|
|
|
+ sendChangedEvent(new RowChangedEvent(parser.getTableName(), ConnectorConstant.OPERTION_INSERT, parser.parseColumns(), null, event.getScn()));
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- } 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) {
|
|
|
+ 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()));
|
|
|
- }
|
|
|
+ DeleteSql parser = new DeleteSql(delete);
|
|
|
+ setTable(parser, delete.getTable());
|
|
|
+ sendChangedEvent(new RowChangedEvent(parser.getTableName(), ConnectorConstant.OPERTION_DELETE, parser.parseColumns(), null, event.getScn()));
|
|
|
}
|
|
|
|
|
|
+ // TODO ddl
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -173,12 +128,11 @@ public class OracleListener extends AbstractDatabaseListener {
|
|
|
snapshot.put(REDO_POSITION, String.valueOf(offset.getPosition()));
|
|
|
}
|
|
|
|
|
|
- private String replaceTableName(Table table) {
|
|
|
- if (table == null) {
|
|
|
- return StringUtil.EMPTY;
|
|
|
- }
|
|
|
- return StringUtil.replace(table.getName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY);
|
|
|
+ private AbstractParser setTable(AbstractParser parser, Table table) {
|
|
|
+ parser.setTableName(table == null ? StringUtil.EMPTY : StringUtil.replace(table.getName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY));
|
|
|
+ parser.setFields(tableFiledMap.get(parser.getTableName()));
|
|
|
+ parser.setInstance(getConnectorInstance());
|
|
|
+ return parser;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
}
|