Browse Source

定义标准数据类型

穿云 6 months ago
parent
commit
e7db4a6991

+ 53 - 0
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/MySQLSchemaResolver.java

@@ -0,0 +1,53 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.connector.mysql.schema;
+
+import org.dbsyncer.sdk.SdkException;
+import org.dbsyncer.sdk.enums.DataTypeEnum;
+import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.sdk.schema.DataType;
+import org.dbsyncer.sdk.schema.SchemaResolver;
+import org.dbsyncer.sdk.schema.support.StringType;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * MySQL标准数据类型解析器
+ * <p>https://gitee.com/ghi/dbsyncer/wikis/%E9%A1%B9%E7%9B%AE%E8%AE%BE%E8%AE%A1/%E6%A0%87%E5%87%86%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/MySQL</p>
+ *
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-25 22:08
+ */
+public final class MySQLSchemaResolver implements SchemaResolver {
+
+    private final Map<DataTypeEnum, DataType> STANDARD_TYPES = new LinkedHashMap<>();
+    private final Map<String, DataType> DATA_TYPES = new LinkedHashMap<>();
+
+    private MySQLSchemaResolver() {
+        DATA_TYPES.putIfAbsent("VARCHAR", new StringType());
+        // TODO
+    }
+
+    @Override
+    public Object convert(Object val, Field field) {
+        if (DATA_TYPES.containsKey(field.getTypeName())) {
+            DataType dataType = DATA_TYPES.get(field.getTypeName());
+            if (STANDARD_TYPES.containsKey(dataType.getType())) {
+                return STANDARD_TYPES.get(dataType.getType()).convert(val);
+            }
+        }
+        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 convertValue(Object val, Field field) {
+        if (DATA_TYPES.containsKey(field.getTypeName())) {
+            return DATA_TYPES.get(field.getTypeName()).convert(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));
+    }
+
+}

+ 17 - 8
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractDataType.java

@@ -5,6 +5,7 @@ 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;
 
@@ -15,7 +16,6 @@ import java.lang.reflect.ParameterizedType;
  */
 public abstract class AbstractDataType<T> implements DataType {
 
-    private static final long serialVersionUID = 1L;
     private final Class<T> parameterClazz;
     protected ConnectorInstance connectorInstance;
 
@@ -23,6 +23,15 @@ public abstract class AbstractDataType<T> implements DataType {
         parameterClazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
     }
 
+    /**
+     * 获取默认值
+     *
+     * @return null
+     */
+    protected T getDefaultVal() {
+        return null;
+    }
+
     protected T convertString(Object val) {
         return throwUnsupportedException(val);
     }
@@ -83,13 +92,8 @@ public abstract class AbstractDataType<T> implements DataType {
         throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), getType(), val));
     }
 
-    /**
-     * 获取默认值
-     *
-     * @return null
-     */
-    protected Object getDefaultVal() {
-        return null;
+    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
@@ -138,6 +142,11 @@ public abstract class AbstractDataType<T> implements DataType {
         }
     }
 
+    @Override
+    public T convert(Object val, Field field) {
+        return throwUnsupportedException(val, field);
+    }
+
     public ConnectorInstance getConnectorInstance() {
         return connectorInstance;
     }

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

@@ -4,15 +4,14 @@
 package org.dbsyncer.sdk.schema;
 
 import org.dbsyncer.sdk.enums.DataTypeEnum;
-
-import java.io.Serializable;
+import org.dbsyncer.sdk.model.Field;
 
 /**
  * @Author 穿云
  * @Version 1.0.0
  * @Date 2024-11-23 23:00
  */
-public interface DataType extends Serializable {
+public interface DataType {
 
     /**
      * 转换为标准数据类型
@@ -22,6 +21,15 @@ public interface DataType extends Serializable {
      */
     Object convert(Object val);
 
+    /**
+     * 转换为指定数据类型
+     *
+     * @param val 转换值
+     * @param field 数据类型
+     * @return Object
+     */
+    Object convert(Object val, Field field);
+
     /**
      * 返回数据类型
      *

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

@@ -0,0 +1,33 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.sdk.schema;
+
+import org.dbsyncer.sdk.model.Field;
+
+/**
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-25 22:48
+ */
+public interface SchemaResolver {
+
+    /**
+     * 转换为标准数据类型
+     *
+     * @param val 转换值
+     * @param field 数据类型
+     * @return Object
+     */
+    Object convert(Object val, Field field);
+
+    /**
+     * 转换为指定数据类型
+     *
+     * @param val 转换值
+     * @param field 数据类型
+     * @return Object
+     */
+    Object convertValue(Object val, Field field);
+
+}

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimeStampType.java → dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimestampType.java

@@ -13,7 +13,7 @@ import java.sql.Timestamp;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class TimeStampType extends AbstractDataType<Timestamp> {
+public class TimestampType extends AbstractDataType<Timestamp> {
 
     @Override
     public DataTypeEnum getType() {