浏览代码

修正解析

life 1 年之前
父节点
当前提交
b2846ffb55

+ 5 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/column/ColumnValue.java

@@ -4,6 +4,7 @@
 package org.dbsyncer.common.column;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.sql.Date;
 import java.sql.Time;
 import java.sql.Timestamp;
@@ -40,4 +41,8 @@ public interface ColumnValue {
     Timestamp asTimestamp();
 
     Time asTime();
+
+    default BigInteger asBigInteger(){
+        return null;
+    }
 }

+ 23 - 67
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/AbstractParser.java

@@ -3,27 +3,20 @@
  */
 package org.dbsyncer.connector.oracle.logminer.parser;
 
+import java.sql.Types;
+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.NullValue;
-import net.sf.jsqlparser.expression.StringValue;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
 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.DateFormatUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.sdk.model.Field;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
 /**
  * @Author AE86
  * @Version 1.0.0
@@ -32,7 +25,7 @@ import java.util.Objects;
 public abstract class AbstractParser implements Parser {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
-    protected Map<String, Object> columnMap = new HashMap<>();
+    protected Map<String, Expression> columnMap = new HashMap<>();
     protected List<Field> fields;
 
     public void findColumn(Expression expression) {
@@ -46,73 +39,36 @@ public abstract class AbstractParser implements Parser {
         BinaryExpression binaryExpression = (BinaryExpression) expression;
         if (binaryExpression.getLeftExpression() instanceof Column) {
             Column column = (Column) binaryExpression.getLeftExpression();
-            columnMap.put(StringUtil.replace(column.getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY), parserValue(binaryExpression.getRightExpression()));
+            columnMap.put(StringUtil.replace(column.getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY), binaryExpression.getRightExpression());
             return;
         }
         findColumn(binaryExpression.getLeftExpression());
         findColumn(binaryExpression.getRightExpression());
     }
 
-    public Object parserValue(Expression expression) {
-        if (expression instanceof NullValue) {
-            return null;
-        }
-        // 解析sql的function,只取到关键的字符串
-        if (expression instanceof Function) {
-            return parseFunction((Function) expression);
-        }
-        if (expression instanceof StringValue) {
-            StringValue val = (StringValue) expression;
-            return val.getValue();
-        }
-        return null;
-    }
-
     public List<Object> columnMapToData() {
         List<Object> data = new LinkedList<>();
+        //需要进行数据库类型
         for (Field field : fields) {
-            data.add(columnMap.get(field.getName()));
-        }
-        return data;
-    }
-
-    private Object parseFunction(Function function) {
-        List<String> multipartName = function.getMultipartName();
-        ExpressionList parameters = function.getParameters();
-        if (CollectionUtils.isEmpty(multipartName) || CollectionUtils.isEmpty(parameters)) {
-            return null;
-        }
-
-        String nameType = Objects.toString(multipartName.get(0));
-        Object value = parameters.get(0);
-        if (nameType == null || value == null) {
-            return null;
-        }
-
-        if (value instanceof StringValue) {
-            StringValue val = (StringValue) value;
-            value = val.getValue();
-        }
-        try {
-            switch (nameType) {
-                case "TO_DATE":
-                    return toDate(value);
-                case "TO_TIMESTAMP":
-                    return toTimestamp(value);
+           OracleColumnValue oracleColumnValue = new OracleColumnValue(columnMap.get(field.getName()));
+            switch (field.getType()){
+                case Types.BIGINT:
+                    data.add(oracleColumnValue.asBigInteger());
+                    break;
+                case Types.DECIMAL:
+                    data.add(oracleColumnValue.asBigDecimal());
+                    break;
+                case Types.TIME:
+                case Types.TIMESTAMP:
+                    data.add(oracleColumnValue.asTime());
+                    break;
+                default:
+                    data.add(oracleColumnValue.asString());
             }
-        } catch (Exception e) {
-            logger.error(e.getMessage(), e);
         }
-        return value;
-    }
-
-    private Object toDate(Object value) {
-        return DateFormatUtil.stringToTimestamp(Objects.toString(value));
+        return data;
     }
 
-    private Object toTimestamp(Object value) {
-        return DateFormatUtil.stringToTimestamp(StringUtil.replace(Objects.toString(value), StringUtil.POINT, StringUtil.EMPTY));
-    }
 
     public void setFields(List<Field> fields) {
         this.fields = fields;

+ 138 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/OracleColumnValue.java

@@ -0,0 +1,138 @@
+package org.dbsyncer.connector.oracle.logminer.parser;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Objects;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.Function;
+import net.sf.jsqlparser.expression.NullValue;
+import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
+import org.dbsyncer.common.column.AbstractColumnValue;
+import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.common.util.DateFormatUtil;
+import org.dbsyncer.common.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OracleColumnValue extends AbstractColumnValue<Expression> {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    public OracleColumnValue(Expression value) {
+        setValue(value);
+    }
+
+
+    @Override
+    public String asString() {
+        if (getValue() instanceof NullValue){
+            return null;
+        }
+        if (getValue() instanceof StringValue){
+            return StringUtil.replace(((StringValue) getValue()).getValue(),StringUtil.DOUBLE_QUOTATION,StringUtil.EMPTY);
+        }
+        return getValue().toString();
+    }
+
+    @Override
+    public byte[] asByteArray() {
+        return new byte[0];
+    }
+
+    @Override
+    public Short asShort() {
+        return Short.valueOf(asString());
+    }
+
+    @Override
+    public Integer asInteger() {
+       return Integer.valueOf(asString());
+    }
+
+    @Override
+    public Long asLong() {
+        return Long.valueOf(asString());
+    }
+
+    @Override
+    public Float asFloat() {
+        return Float.valueOf(asString());
+    }
+
+    @Override
+    public Double asDouble() {
+        return Double.valueOf(asString());
+    }
+
+    @Override
+    public Boolean asBoolean() {
+        return null;
+    }
+
+    @Override
+    public BigDecimal asBigDecimal() {
+        return new BigDecimal(asString());
+    }
+
+    @Override
+    public Date asDate() {
+        return null;
+    }
+
+    @Override
+    public Timestamp asTimestamp() {
+        Function function = (Function) getValue();
+        List<String> multipartName = function.getMultipartName();
+        ExpressionList parameters = function.getParameters();
+        if (CollectionUtils.isEmpty(multipartName) || CollectionUtils.isEmpty(parameters)) {
+            return null;
+        }
+
+        String nameType = Objects.toString(multipartName.get(0));
+        Object value = parameters.get(0);
+        if (nameType == null || value == null) {
+            return null;
+        }
+
+        if (value instanceof StringValue) {
+            StringValue val = (StringValue) value;
+            value = val.getValue();
+        }
+
+        try {
+            switch (nameType) {
+                case "TO_DATE":
+                    return toDate(value);
+                case "TO_TIMESTAMP":
+                    return toTimestamp(value);
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    @Override
+    public Time asTime() {
+        return null;
+    }
+
+    @Override
+    public BigInteger asBigInteger() {
+        return new BigInteger(asString());
+    }
+
+    private Timestamp toDate(Object value) {
+        return DateFormatUtil.stringToTimestamp(Objects.toString(value));
+    }
+
+    private Timestamp toTimestamp(Object value) {
+        return DateFormatUtil.stringToTimestamp(StringUtil.replace(Objects.toString(value), StringUtil.POINT, StringUtil.EMPTY));
+    }
+}

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

@@ -32,7 +32,7 @@ public class InsertSql extends AbstractParser {
         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),
-                    parserValue(values.get(i)));
+                    values.get(i));
         }
         return columnMapToData();
     }

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

@@ -35,7 +35,7 @@ public class UpdateSql extends AbstractParser {
     private void passerSet(List<UpdateSet> updateSets) {
         for (UpdateSet updateSet : updateSets) {
             String columnName = StringUtil.replace(updateSet.getColumn(0).getColumnName(), StringUtil.DOUBLE_QUOTATION, StringUtil.EMPTY);
-            columnMap.put(columnName, parserValue(updateSet.getValue(0)));
+            columnMap.put(columnName, updateSet.getValue(0));
         }
     }