Просмотр исходного кода

Merge remote-tracking branch 'origin/v_2.0' into v_2.0

AE86 1 год назад
Родитель
Сommit
09a221e191

+ 32 - 8
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/AbstractParser.java

@@ -3,20 +3,22 @@
  */
 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.operators.relational.IsNullExpression;
 import net.sf.jsqlparser.schema.Column;
+import oracle.jdbc.OracleTypes;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.sdk.model.Field;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.sql.Types;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
 /**
  * @Author AE86
  * @Version 1.0.0
@@ -55,15 +57,19 @@ public abstract class AbstractParser implements Parser {
             OracleColumnValue oracleColumnValue = new OracleColumnValue(
                     columnMap.get(field.getName()));
             switch (field.getType()) {
-                case Types.BIGINT:
-                    data.add(oracleColumnValue.asBigInteger());
+                case Types.NUMERIC:
+                    data.add(convertNumber(oracleColumnValue,field));
                     break;
                 case Types.DECIMAL:
                     data.add(oracleColumnValue.asBigDecimal());
                     break;
                 case Types.TIME:
                 case Types.TIMESTAMP:
-                    data.add(oracleColumnValue.asTime());
+                    data.add(oracleColumnValue.asTimestamp());
+                    break;
+                //timezone
+                case OracleTypes.TIMESTAMPTZ:
+                    data.add(oracleColumnValue.asTimestamp());
                     break;
                 default:
                     data.add(oracleColumnValue.asString());
@@ -72,6 +78,24 @@ public abstract class AbstractParser implements Parser {
         return data;
     }
 
+    private Object convertNumber(OracleColumnValue oracleColumnValue,Field field) {
+        if (field.getRatio() <=0){
+            int result =field.getColumnSize() - field.getRatio();
+            if ( result <10){
+                return oracleColumnValue.asInteger();
+            }
+            if (result <19){
+                return oracleColumnValue.asBigInteger();
+            }
+            if (result <39){
+                return oracleColumnValue.asBigDecimal();
+            }
+            return oracleColumnValue.asString();
+        }else{
+            return oracleColumnValue.asBigDecimal();
+        }
+    }
+
 
     public void setFields(List<Field> fields) {
         this.fields = fields;

+ 34 - 8
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/OracleColumnValue.java

@@ -1,17 +1,11 @@
 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 net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
 import org.dbsyncer.common.column.AbstractColumnValue;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.DateFormatUtil;
@@ -19,6 +13,14 @@ import org.dbsyncer.common.util.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+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;
+
 public class OracleColumnValue extends AbstractColumnValue<Expression> {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -52,6 +54,9 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
 
     @Override
     public Integer asInteger() {
+        if (asString() == null){
+            return null;
+        }
        return Integer.valueOf(asString());
     }
 
@@ -77,6 +82,9 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
 
     @Override
     public BigDecimal asBigDecimal() {
+        if (asString() == null){
+            return null;
+        }
         return new BigDecimal(asString());
     }
 
@@ -87,6 +95,12 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
 
     @Override
     public Timestamp asTimestamp() {
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
+        if (getValue() instanceof NullValue){
+            return null;
+        }
         Function function = (Function) getValue();
         List<String> multipartName = function.getMultipartName();
         ExpressionList parameters = function.getParameters();
@@ -111,6 +125,7 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
                     return toDate(value);
                 case "TO_TIMESTAMP":
                     return toTimestamp(value);
+
             }
         } catch (Exception e) {
             logger.error(e.getMessage(), e);
@@ -125,7 +140,17 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
 
     @Override
     public BigInteger asBigInteger() {
-        return new BigInteger(asString());
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
+        if (getValue() instanceof NullValue){
+            return null;
+        }
+        Object ob = asString();
+        if (ob == null){
+            return null;
+        }
+        return new BigInteger(ob.toString());
     }
 
     private Timestamp toDate(Object value) {
@@ -135,4 +160,5 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
     private Timestamp toTimestamp(Object value) {
         return DateFormatUtil.stringToTimestamp(StringUtil.replace(Objects.toString(value), StringUtil.POINT, StringUtil.EMPTY));
     }
+
 }

+ 3 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/connector/database/AbstractDatabaseConnector.java

@@ -126,7 +126,9 @@ public abstract class AbstractDatabaseConnector extends AbstractConnector implem
                 String columnName = columnMetadata.getString(4);
                 int columnType = columnMetadata.getInt(5);
                 String typeName = columnMetadata.getString(6);
-                fields.add(new Field(columnName, typeName, columnType, primaryKeys.contains(columnName)));
+                int columnSize = columnMetadata.getInt(7);
+                int ratio = columnMetadata.getInt(9);
+                fields.add(new Field(columnName, typeName, columnType, primaryKeys.contains(columnName),columnSize,ratio));
             }
             return fields;
         });

+ 35 - 0
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/model/Field.java

@@ -41,6 +41,16 @@ public class Field {
      */
     private boolean unmodifiabled;
 
+    /**
+     * 字段大小
+     */
+    private int columnSize;
+
+    /**
+     * 字段比例
+     */
+    private int ratio;
+
     public Field() {
     }
 
@@ -57,6 +67,15 @@ public class Field {
         this.pk = pk;
     }
 
+    public Field(String name, String typeName, int type, boolean pk,int columnSize,int ratio) {
+        this.name = name;
+        this.typeName = typeName;
+        this.type = type;
+        this.pk = pk;
+        this.columnSize = columnSize;
+        this.ratio = ratio;
+    }
+
     public Field(String name, String typeName, int type, boolean pk, String labelName, boolean unmodifiabled) {
         this.name = name;
         this.typeName = typeName;
@@ -116,6 +135,22 @@ public class Field {
         return this;
     }
 
+    public int getColumnSize() {
+        return columnSize;
+    }
+
+    public void setColumnSize(int columnSize) {
+        this.columnSize = columnSize;
+    }
+
+    public int getRatio() {
+        return ratio;
+    }
+
+    public void setRatio(int ratio) {
+        this.ratio = ratio;
+    }
+
     @Override
     public String toString() {
         return JsonUtil.objToJson(this);

+ 1 - 1
dbsyncer-web/src/main/assembly/bin/startup.bat

@@ -30,7 +30,7 @@ if exist %ENCRYPT_FILE% (
 set SERVER_OPTS=%SERVER_OPTS% -agentpath:%ENCRYPT_FILE%
 )
 
-set SERVER_OPTS=%SERVER_OPTS% -Djava.ext.dirs=%DBS_HOME%lib
+set SERVER_OPTS=%SERVER_OPTS% -Djava.ext.dirs="%JAVA_HOME%\jre\lib\ext;%DBS_HOME%lib"
 set SERVER_OPTS=%SERVER_OPTS% -Dspring.config.location=%DBS_HOME%conf\application.properties
 echo %SERVER_OPTS%
 java %SERVER_OPTS% -Dfile.encoding=GBK org.dbsyncer.web.Application

+ 1 - 1
pom.xml

@@ -38,7 +38,7 @@
         <commons-fileupload.version>1.4</commons-fileupload.version>
         <commons-io.version>2.5</commons-io.version>
         <lucene-analyzers-smartcn.version>8.8.0</lucene-analyzers-smartcn.version>
-        <ojdbc8.version>23.3.0.23.09</ojdbc8.version>
+        <ojdbc8.version>21.6.0.0</ojdbc8.version>
         <!--<mysql.version>5.1.40</mysql.version>-->
         <mysql.version>8.0.21</mysql.version>
         <mysql-binlog.version>0.27.0</mysql-binlog.version>