Explorar o código

修改logminer解析为sql解析

life hai 1 ano
pai
achega
7b73eee7ba

+ 38 - 36
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/AbstractParser.java

@@ -3,20 +3,19 @@
  */
 package org.dbsyncer.connector.oracle.logminer.parser;
 
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.Function;
+import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
 import net.sf.jsqlparser.schema.Column;
-import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
 import org.dbsyncer.sdk.model.Field;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
 /**
  * @Author AE86
  * @Version 1.0.0
@@ -30,48 +29,51 @@ public abstract class AbstractParser implements Parser {
     protected DatabaseConnectorInstance instance;
 
     public void findColumn(Expression expression) {
+        if (expression instanceof IsNullExpression){
+            IsNullExpression isNullExpression = (IsNullExpression) expression;
+            Column column = (Column) isNullExpression.getLeftExpression();
+            columnMap.put(StringUtil.replace(column.getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY),
+                    null);
+            return;
+        }
+
         BinaryExpression binaryExpression = (BinaryExpression) expression;
         if (binaryExpression.getLeftExpression() instanceof Column) {
             Column column = (Column) binaryExpression.getLeftExpression();
-            String value = binaryExpression.getRightExpression().toString();
-            columnMap.put(StringUtil.replace(column.getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY), value);
+            columnMap.put(StringUtil.replace(column.getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY),
+                    parserValue(binaryExpression.getRightExpression()));
             return;
         }
         findColumn(binaryExpression.getLeftExpression());
         findColumn(binaryExpression.getRightExpression());
     }
 
-    // 从主键解析出来的map装载成sql并运行sql找出对应的数据
-    public List<Object> getColumnsFromDB() {
-        List<Map<String, Object>> rows = instance.execute(databaseTemplate -> databaseTemplate.queryForList(getRowByPk()));
-        List<Object> list = new LinkedList<>();
-        if (!CollectionUtils.isEmpty(rows)) {
-            rows.forEach(map -> {
-                for (String key : map.keySet()) {
-                    list.add(map.get(key));
-                }
-            });
-            return list;
+    public String parserValue(Expression expression){
+        String value = "";
+        if (expression instanceof Function){
+            value = parserFunction((Function) expression);
+        }else{
+            value = expression.toString();
         }
-        return Collections.EMPTY_LIST;
+        return value;
     }
 
-    private String getRowByPk() {
-        StringBuilder sql = new StringBuilder("SELECT * FROM ").append(getTableName()).append(" WHERE ");
-        int pkCount = 0;
-        for (Field field : fields) {
-            if (field.isPk()) {
-                String value = columnMap.get(field.getName());
-                if (StringUtil.isNotBlank(value)) {
-                    if (pkCount > 0) {
-                        sql.append(" AND ");
-                    }
-                    sql.append(field.getName()).append("=").append(value);
-                    pkCount++;
-                }
-            }
+    //解析sql的function,只取到关键的字符串
+    public String parserFunction(Function function){
+        if (function.getMultipartName().get(0).equals("TO_DATE")){
+            return StringUtil.replace(function.getParameters().get(0).toString(),StringUtil.SINGLE_QUOTATION,StringUtil.EMPTY);
+        }
+        return "";
+    }
+
+
+    public List<Object> columnMapToData(){
+        List<Object> data = new LinkedList<>();
+        for (Field field: fields) {
+            Object value = OracleTypeParser.convertToJavaType(field,columnMap.get(field.getName()));
+            data.add(value);
         }
-        return sql.toString();
+        return data;
     }
 
     @Override

+ 34 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/OracleTypeParser.java

@@ -0,0 +1,34 @@
+package org.dbsyncer.connector.oracle.logminer.parser;
+
+import java.math.BigInteger;
+import java.sql.Types;
+import org.dbsyncer.common.util.DateFormatUtil;
+import org.dbsyncer.common.util.StringUtil;
+import org.dbsyncer.sdk.model.Field;
+
+/**
+ * @Description :oracle解析到java类
+ * @Param :
+ * @return :
+ * @author : life
+ * @date : 2023/12/15  11:25
+ */
+public class OracleTypeParser {
+    public static Object convertToJavaType(Field field,String value){
+        if (value == null){
+            return null;
+        }
+        switch (field.getType()) {
+            case Types.DECIMAL:
+                return new BigInteger(
+                        StringUtil.replace(value, StringUtil.SINGLE_QUOTATION, StringUtil.EMPTY));
+            case Types.TIMESTAMP:
+                return DateFormatUtil.stringToTimestamp(StringUtil.replace(value,StringUtil.SINGLE_QUOTATION,StringUtil.EMPTY));
+            default:
+                return value;
+        }
+    }
+
+
+
+}

+ 6 - 5
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/impl/InsertSql.java

@@ -3,14 +3,14 @@
  */
 package org.dbsyncer.connector.oracle.logminer.parser.impl;
 
+import java.util.List;
+import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.statement.insert.Insert;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.oracle.logminer.parser.AbstractParser;
 
-import java.util.List;
-
 /**
  * @Author AE86
  * @Version 1.0.0
@@ -27,11 +27,12 @@ public class InsertSql extends AbstractParser {
     @Override
     public List<Object> parseColumns() {
         List<Column> columns = insert.getColumns();
-        ExpressionList values = insert.getSelect().getValues().getExpressions();
+        ExpressionList<Expression> values = (ExpressionList<Expression>) insert.getSelect().getValues().getExpressions();
         for (int i = 0; i < columns.size(); i++) {
-            columnMap.put(StringUtil.replace(columns.get(i).getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY), values.get(i).toString());
+            columnMap.put(StringUtil.replace(columns.get(i).getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY),
+                    parserValue(values.get(i)));
         }
-        return getColumnsFromDB();
+        return columnMapToData();
     }
 
 }

+ 14 - 1
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/impl/UpdateSql.java

@@ -4,6 +4,8 @@
 package org.dbsyncer.connector.oracle.logminer.parser.impl;
 
 import net.sf.jsqlparser.statement.update.Update;
+import net.sf.jsqlparser.statement.update.UpdateSet;
+import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.oracle.logminer.parser.AbstractParser;
 
 import java.util.List;
@@ -24,7 +26,18 @@ public class UpdateSql extends AbstractParser {
     @Override
     public List<Object> parseColumns() {
         findColumn(update.getWhere());
-        return getColumnsFromDB();
+        passerSet(update.getUpdateSets());
+        return columnMapToData();
+    }
+
+    private void passerSet(List<UpdateSet> updateSets){
+        //解析替换
+        for (UpdateSet updateSet:updateSets) {
+            String columnName = StringUtil.replace(updateSet.getColumn(0).getColumnName(),
+                    StringUtil.DOUBLE_QUOTATION,StringUtil.EMPTY);
+            String value = parserValue(updateSet.getValue(0));
+            columnMap.put(columnName,value);
+        }
     }
 
 }