Ver Fonte

定义标准数据类型

穿云 há 6 meses atrás
pai
commit
9ce7e73e85

+ 9 - 4
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/MySQLSchemaResolver.java

@@ -3,11 +3,14 @@
  */
 package org.dbsyncer.connector.mysql.schema;
 
+import org.dbsyncer.connector.mysql.schema.support.MySQLByteType;
+import org.dbsyncer.connector.mysql.schema.support.MySQLShortType;
 import org.dbsyncer.connector.mysql.schema.support.MySQLStringType;
 import org.dbsyncer.sdk.schema.AbstractSchemaResolver;
 import org.dbsyncer.sdk.schema.DataType;
 
 import java.util.Map;
+import java.util.stream.Stream;
 
 /**
  * MySQL标准数据类型解析器
@@ -19,11 +22,13 @@ import java.util.Map;
  */
 public final class MySQLSchemaResolver extends AbstractSchemaResolver {
 
-    @Override
-    protected void initDataTypes(Map<String, DataType> map) {
-        map.put("VARCHAR", new MySQLStringType());
-        // TODO
+    private final MySQLStringType stringType = new MySQLStringType();
+    private final MySQLByteType byteType = new MySQLByteType();
+    private final MySQLShortType shortType = new MySQLShortType();
 
+    @Override
+    protected void initDataTypes(Map<String, DataType> mapping) {
+        Stream.of(shortType, stringType, byteType).forEach(t -> t.postProcessBeforeInitialization(mapping));
     }
 
 }

+ 42 - 0
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/support/MySQLByteType.java

@@ -0,0 +1,42 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.connector.mysql.schema.support;
+
+import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.sdk.schema.DataType;
+import org.dbsyncer.sdk.schema.support.ByteType;
+
+import java.util.Map;
+
+/**
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-26 22:59
+ */
+public class MySQLByteType extends ByteType {
+    @Override
+    protected Byte merge(Object val, Field field) {
+        return 0;
+    }
+
+    @Override
+    protected Byte getDefaultMergedVal() {
+        return 0;
+    }
+
+    @Override
+    protected Object convert(Object val, Field field) {
+        return null;
+    }
+
+    @Override
+    protected Object getDefaultConvertedVal() {
+        return null;
+    }
+
+    @Override
+    public void postProcessBeforeInitialization(Map<String, DataType> mapping) {
+        mapping.put("TINYINT", this);
+    }
+}

+ 45 - 0
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/support/MySQLShortType.java

@@ -0,0 +1,45 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.connector.mysql.schema.support;
+
+import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.sdk.schema.DataType;
+import org.dbsyncer.sdk.schema.support.ShortType;
+
+import java.util.Map;
+
+/**
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-26 22:59
+ */
+public class MySQLShortType extends ShortType {
+
+    @Override
+    protected Short merge(Object val, Field field) {
+        return 0;
+    }
+
+    @Override
+    protected Short getDefaultMergedVal() {
+        return 0;
+    }
+
+    @Override
+    protected Object convert(Object val, Field field) {
+        return null;
+    }
+
+    @Override
+    protected Object getDefaultConvertedVal() {
+        return null;
+    }
+
+    @Override
+    public void postProcessBeforeInitialization(Map<String, DataType> mapping) {
+        mapping.put("TINYINT UNSIGNED", this);
+        mapping.put("TINYINT UNSIGNED ZEROFILL", this);
+        mapping.put("SMALLINT", this);
+    }
+}

+ 26 - 4
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/support/MySQLStringType.java

@@ -4,8 +4,11 @@
 package org.dbsyncer.connector.mysql.schema.support;
 
 import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.sdk.schema.DataType;
 import org.dbsyncer.sdk.schema.support.StringType;
 
+import java.util.Map;
+
 /**
  * @Author 穿云
  * @Version 1.0.0
@@ -18,13 +21,13 @@ public class MySQLStringType extends StringType {
     }
 
     @Override
-    protected String convert(Object val, Field field) {
-        return throwUnsupportedException(val, field);
+    protected String getDefaultMergedVal() {
+        return "";
     }
 
     @Override
-    protected String getDefaultMergedVal() {
-        return "";
+    protected Object convert(Object val, Field field) {
+        return null;
     }
 
     @Override
@@ -32,4 +35,23 @@ public class MySQLStringType extends StringType {
         return null;
     }
 
+    @Override
+    public void postProcessBeforeInitialization(Map<String, DataType> mapping) {
+        mapping.put("CHAR", this); // 固定长度,最多255个字符
+        mapping.put("VARCHAR", this); // 固定长度,最多65535个字符,64K
+        mapping.put("TINYTEXT", this); // 可变长度,最多255字符
+        mapping.put("TEXT", this); // 可变长度,最多65535个字符,64K
+        mapping.put("MEDIUMTEXT", this); // 可变长度,最多2的24次方-1个字符,16M
+        mapping.put("LONGTEXT", this); // 可变长度,最多2的32次方-1个字符,4GB
+        mapping.put("ENUM", this); // 2字节,最大可达65535个不同的枚举值
+        mapping.put("JSON", this);
+        mapping.put("GEOMETRY", this);
+        mapping.put("POINT", this);
+        mapping.put("LINESTRING", this);
+        mapping.put("POLYGON", this);
+        mapping.put("MULTIPOINT", this);
+        mapping.put("MULTILINESTRING", this);
+        mapping.put("MULTIPOLYGON", this);
+        mapping.put("GEOMETRYCOLLECTION", this);
+    }
 }

+ 15 - 16
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractDataType.java

@@ -4,7 +4,6 @@
 package org.dbsyncer.sdk.schema;
 
 import org.dbsyncer.sdk.SdkException;
-import org.dbsyncer.sdk.connector.ConnectorInstance;
 import org.dbsyncer.sdk.model.Field;
 
 import java.lang.reflect.ParameterizedType;
@@ -17,7 +16,7 @@ import java.lang.reflect.ParameterizedType;
 public abstract class AbstractDataType<T> implements DataType {
 
     private final Class<T> parameterClazz;
-    protected ConnectorInstance connectorInstance;
+    protected SchemaResolver schemaResolver;
 
     public AbstractDataType() {
         parameterClazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
@@ -33,20 +32,20 @@ public abstract class AbstractDataType<T> implements DataType {
     protected abstract T merge(Object val, Field field);
 
     /**
-     * 转换为指定数据类型
+     * 获取默认合并值
      *
-     * @param val
-     * @param field
      * @return
      */
-    protected abstract T convert(Object val, Field field);
+    protected abstract T getDefaultMergedVal();
 
     /**
-     * 获取默认合并值
+     * 转换为指定数据类型
      *
+     * @param val
+     * @param field
      * @return
      */
-    protected abstract T getDefaultMergedVal();
+    protected abstract Object convert(Object val, Field field);
 
     /**
      * 获取默认转换值
@@ -55,10 +54,6 @@ public abstract class AbstractDataType<T> implements DataType {
      */
     protected abstract Object getDefaultConvertedVal();
 
-    protected T throwUnsupportedException(Object val, Field field) {
-        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
-    }
-
     @Override
     public Object mergeValue(Object val, Field field) {
         if (val == null || field == null) {
@@ -81,11 +76,15 @@ public abstract class AbstractDataType<T> implements DataType {
         return convert(val, field);
     }
 
-    public ConnectorInstance getConnectorInstance() {
-        return connectorInstance;
+    protected T throwUnsupportedException(Object val, Field field) {
+        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
+    }
+
+    public SchemaResolver getSchemaResolver() {
+        return schemaResolver;
     }
 
-    public void setConnectorInstance(ConnectorInstance connectorInstance) {
-        this.connectorInstance = connectorInstance;
+    public void setSchemaResolver(SchemaResolver schemaResolver) {
+        this.schemaResolver = schemaResolver;
     }
 }

+ 18 - 8
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractSchemaResolver.java

@@ -4,6 +4,7 @@
 package org.dbsyncer.sdk.schema;
 
 import org.dbsyncer.sdk.SdkException;
+import org.dbsyncer.sdk.connector.ConnectorInstance;
 import org.dbsyncer.sdk.model.Field;
 import org.springframework.util.Assert;
 
@@ -17,28 +18,37 @@ import java.util.Map;
  */
 public abstract class AbstractSchemaResolver implements SchemaResolver {
 
-    private final Map<String, DataType> map = new LinkedHashMap<>();
+    private final Map<String, DataType> mapping = new LinkedHashMap<>();
+    private ConnectorInstance connectorInstance;
 
     public AbstractSchemaResolver() {
-        initDataTypes(map);
-        Assert.notEmpty(map, "At least one data type is required.");
+        initDataTypes(mapping);
+        Assert.notEmpty(mapping, "At least one data type is required.");
     }
 
-    protected abstract void initDataTypes(Map<String, DataType> map);
+    protected abstract void initDataTypes(Map<String, DataType> mapping);
 
     @Override
     public Object merge(Object val, Field field) {
-        if (map.containsKey(field.getTypeName())) {
-            return map.get(field.getTypeName()).mergeValue(val, field);
+        if (mapping.containsKey(field.getTypeName())) {
+            return mapping.get(field.getTypeName()).mergeValue(val, field);
         }
         throw new SdkException(String.format("%s does not support type [%s] merge into [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
     }
 
     @Override
     public Object convert(Object val, Field field) {
-        if (map.containsKey(field.getTypeName())) {
-            return map.get(field.getTypeName()).convertValue(val, field);
+        if (mapping.containsKey(field.getTypeName())) {
+            return mapping.get(field.getTypeName()).convertValue(val, field);
         }
         throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
     }
+
+    public ConnectorInstance getConnectorInstance() {
+        return connectorInstance;
+    }
+
+    public void setConnectorInstance(ConnectorInstance connectorInstance) {
+        this.connectorInstance = connectorInstance;
+    }
 }

+ 12 - 3
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/DataType.java

@@ -6,6 +6,8 @@ package org.dbsyncer.sdk.schema;
 import org.dbsyncer.sdk.enums.DataTypeEnum;
 import org.dbsyncer.sdk.model.Field;
 
+import java.util.Map;
+
 /**
  * @Author 穿云
  * @Version 1.0.0
@@ -13,10 +15,17 @@ import org.dbsyncer.sdk.model.Field;
  */
 public interface DataType {
 
+    /**
+     * 初始化
+     *
+     * @param mapping 数据类型映射关系
+     */
+    void postProcessBeforeInitialization(Map<String, DataType> mapping);
+
     /**
      * 转换为标准数据类型
      *
-     * @param val 转换值
+     * @param val   转换值
      * @param field 数据类型
      * @return Object
      */
@@ -25,14 +34,14 @@ public interface DataType {
     /**
      * 转换为指定数据类型
      *
-     * @param val 转换值
+     * @param val   转换值
      * @param field 数据类型
      * @return Object
      */
     Object convertValue(Object val, Field field);
 
     /**
-     * 返回数据类型
+     * 获取数据类型
      *
      * @return
      */

+ 2 - 2
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/SchemaResolver.java

@@ -17,7 +17,7 @@ public interface SchemaResolver {
     /**
      * 转换为标准数据类型
      *
-     * @param val 转换值
+     * @param val   转换值
      * @param field 数据类型
      * @return Object
      */
@@ -26,7 +26,7 @@ public interface SchemaResolver {
     /**
      * 转换为指定数据类型
      *
-     * @param val 转换值
+     * @param val   转换值
      * @param field 数据类型
      * @return Object
      */