Ver código fonte

修复Geometry默认值

AE86 2 anos atrás
pai
commit
eb0511ad05

+ 28 - 38
dbsyncer-connector/src/main/java/org/dbsyncer/connector/AbstractConnector.java

@@ -14,49 +14,40 @@ import java.util.Map;
 
 public abstract class AbstractConnector {
 
-    private static final Map<Integer, ValueMapper> values = new LinkedHashMap<>();
+    protected static final Map<Integer, ValueMapper> valueMappers = new LinkedHashMap<>();
 
     static {
         // 常用类型
-        values.putIfAbsent(Types.VARCHAR, new VarcharValueMapper());
-        values.putIfAbsent(Types.INTEGER, new IntegerValueMapper());
-        values.putIfAbsent(Types.BIGINT, new BigintValueMapper());
-        values.putIfAbsent(Types.TIMESTAMP, new TimestampValueMapper());
-        values.putIfAbsent(Types.DATE, new DateValueMapper());
+        valueMappers.putIfAbsent(Types.VARCHAR, new VarcharValueMapper());
+        valueMappers.putIfAbsent(Types.INTEGER, new IntegerValueMapper());
+        valueMappers.putIfAbsent(Types.BIGINT, new BigintValueMapper());
+        valueMappers.putIfAbsent(Types.TIMESTAMP, new TimestampValueMapper());
+        valueMappers.putIfAbsent(Types.DATE, new DateValueMapper());
 
         // 较少使用
-        values.putIfAbsent(Types.CHAR, new CharValueMapper());
-        values.putIfAbsent(Types.NCHAR, new NCharValueMapper());
-        values.putIfAbsent(Types.NVARCHAR, new NVarcharValueMapper());
-        values.putIfAbsent(Types.LONGVARCHAR, new LongVarcharValueMapper());
-        values.putIfAbsent(Types.NUMERIC, new NumberValueMapper());
-        values.putIfAbsent(Types.BINARY, new BinaryValueMapper());
+        valueMappers.putIfAbsent(Types.CHAR, new CharValueMapper());
+        valueMappers.putIfAbsent(Types.NCHAR, new NCharValueMapper());
+        valueMappers.putIfAbsent(Types.NVARCHAR, new NVarcharValueMapper());
+        valueMappers.putIfAbsent(Types.LONGVARCHAR, new LongVarcharValueMapper());
+        valueMappers.putIfAbsent(Types.NUMERIC, new NumberValueMapper());
+        valueMappers.putIfAbsent(Types.BINARY, new BinaryValueMapper());
 
         // 很少使用
-        values.putIfAbsent(Types.SMALLINT, new SmallintValueMapper());
-        values.putIfAbsent(Types.TINYINT, new TinyintValueMapper());
-        values.putIfAbsent(Types.TIME, new TimeValueMapper());
-        values.putIfAbsent(Types.DECIMAL, new DecimalValueMapper());
-        values.putIfAbsent(Types.DOUBLE, new DoubleValueMapper());
-        values.putIfAbsent(Types.FLOAT, new FloatValueMapper());
-        values.putIfAbsent(Types.BIT, new BitValueMapper());
-        values.putIfAbsent(Types.BLOB, new BlobValueMapper());
-        values.putIfAbsent(Types.CLOB, new ClobValueMapper());
-        values.putIfAbsent(Types.NCLOB, new NClobValueMapper());
-        values.putIfAbsent(Types.ROWID, new RowIdValueMapper());
-        values.putIfAbsent(Types.REAL, new RealValueMapper());
-        values.putIfAbsent(Types.VARBINARY, new VarBinaryValueMapper());
-        values.putIfAbsent(Types.LONGVARBINARY, new LongVarBinaryValueMapper());
-        values.putIfAbsent(Types.OTHER, new OtherValueMapper());
-    }
-
-    /**
-     * 获取值转换配置
-     *
-     * @return
-     */
-    protected Map<Integer, ValueMapper> getValueMapper() {
-        return values;
+        valueMappers.putIfAbsent(Types.SMALLINT, new SmallintValueMapper());
+        valueMappers.putIfAbsent(Types.TINYINT, new TinyintValueMapper());
+        valueMappers.putIfAbsent(Types.TIME, new TimeValueMapper());
+        valueMappers.putIfAbsent(Types.DECIMAL, new DecimalValueMapper());
+        valueMappers.putIfAbsent(Types.DOUBLE, new DoubleValueMapper());
+        valueMappers.putIfAbsent(Types.FLOAT, new FloatValueMapper());
+        valueMappers.putIfAbsent(Types.BIT, new BitValueMapper());
+        valueMappers.putIfAbsent(Types.BLOB, new BlobValueMapper());
+        valueMappers.putIfAbsent(Types.CLOB, new ClobValueMapper());
+        valueMappers.putIfAbsent(Types.NCLOB, new NClobValueMapper());
+        valueMappers.putIfAbsent(Types.ROWID, new RowIdValueMapper());
+        valueMappers.putIfAbsent(Types.REAL, new RealValueMapper());
+        valueMappers.putIfAbsent(Types.VARBINARY, new VarBinaryValueMapper());
+        valueMappers.putIfAbsent(Types.LONGVARBINARY, new LongVarBinaryValueMapper());
+        valueMappers.putIfAbsent(Types.OTHER, new OtherValueMapper());
     }
 
     /**
@@ -71,7 +62,6 @@ public abstract class AbstractConnector {
         }
 
         // 获取字段映射规则
-        final Map<Integer, ValueMapper> mappers = getValueMapper();
         for (Map row : config.getData()) {
             // 根据目标字段类型转换值
             for (Field f : config.getFields()) {
@@ -79,7 +69,7 @@ public abstract class AbstractConnector {
                     continue;
                 }
                 // 根据字段类型转换值
-                final ValueMapper valueMapper = mappers.get(f.getType());
+                final ValueMapper valueMapper = valueMappers.get(f.getType());
                 if (null != valueMapper) {
                     // 当数据类型不同时,转换值类型
                     row.put(f.getName(), valueMapper.convertValue(connectorMapper, row.get(f.getName())));

+ 11 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/AbstractValueMapper.java

@@ -22,9 +22,19 @@ public abstract class AbstractValueMapper<T> implements ValueMapper {
      */
     protected abstract T convert(ConnectorMapper connectorMapper, Object val) throws Exception;
 
+    /**
+     * 获取默认值
+     *
+     * @param val
+     * @return
+     */
+    protected Object getDefaultVal(Object val) throws Exception {
+        return val;
+    }
+
     @Override
     public Object convertValue(ConnectorMapper connectorMapper, Object val) throws Exception {
         // 当数据类型不同时,返回转换值
-        return null != val && !val.getClass().equals(parameterClazz) ? convert(connectorMapper, val) : val;
+        return null != val && !val.getClass().equals(parameterClazz) ? convert(connectorMapper, val) : getDefaultVal(val);
     }
 }

+ 5 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/BinaryValueMapper.java

@@ -11,6 +11,11 @@ import org.dbsyncer.connector.ConnectorMapper;
  */
 public class BinaryValueMapper extends AbstractValueMapper<byte[]> {
 
+    @Override
+    protected Object getDefaultVal(Object val) {
+        return null != val ? val : new byte[0];
+    }
+
     @Override
     protected byte[] convert(ConnectorMapper connectorMapper, Object val) {
         if(val instanceof String){

+ 28 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/GeometryValueMapper.java

@@ -0,0 +1,28 @@
+package org.dbsyncer.connector.schema;
+
+import com.microsoft.sqlserver.jdbc.Geometry;
+import com.microsoft.sqlserver.jdbc.SQLServerException;
+import org.dbsyncer.connector.AbstractValueMapper;
+import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.ConnectorMapper;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/8/24 23:43
+ */
+public class GeometryValueMapper extends AbstractValueMapper<Geometry> {
+
+    @Override
+    protected Object getDefaultVal(Object val) throws SQLServerException {
+        return null != val ? val : Geometry.point(0, 0, 0);
+    }
+
+    @Override
+    protected Geometry convert(ConnectorMapper connectorMapper, Object val) throws SQLServerException {
+        if (val instanceof byte[]) {
+            return Geometry.deserialize((byte[]) val);
+        }
+        throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
+    }
+}

+ 5 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/LongVarBinaryValueMapper.java

@@ -11,6 +11,11 @@ import org.dbsyncer.connector.ConnectorMapper;
  */
 public class LongVarBinaryValueMapper extends AbstractValueMapper<byte[]> {
 
+    @Override
+    protected Object getDefaultVal(Object val) {
+        return null != val ? val : new byte[0];
+    }
+
     @Override
     protected byte[] convert(ConnectorMapper connectorMapper, Object val) {
         throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));

+ 5 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/VarBinaryValueMapper.java

@@ -11,6 +11,11 @@ import org.dbsyncer.connector.ConnectorMapper;
  */
 public class VarBinaryValueMapper extends AbstractValueMapper<byte[]> {
 
+    @Override
+    protected Object getDefaultVal(Object val) {
+        return null != val ? val : new byte[0];
+    }
+
     @Override
     protected byte[] convert(ConnectorMapper connectorMapper, Object val) {
         throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));

+ 6 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java

@@ -11,7 +11,9 @@ import org.dbsyncer.connector.database.DatabaseConnectorMapper;
 import org.dbsyncer.connector.enums.TableTypeEnum;
 import org.dbsyncer.connector.model.PageSql;
 import org.dbsyncer.connector.model.Table;
+import org.dbsyncer.connector.schema.GeometryValueMapper;
 
+import java.sql.Types;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -22,6 +24,10 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
 
     private static final String QUERY_TABLE = "select name from sys.tables where schema_id = schema_id('%s') and is_ms_shipped = 0";
 
+    static {
+        valueMappers.put(Types.VARBINARY, new GeometryValueMapper());
+    }
+
     @Override
     public List<Table> getTable(DatabaseConnectorMapper connectorMapper) {
         DatabaseConfig config = connectorMapper.getConfig();