소스 검색

支持mysql year数据类型

穿云 4 달 전
부모
커밋
b4f9e86c14

+ 7 - 2
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/MySQLConnector.java

@@ -5,6 +5,7 @@ package org.dbsyncer.connector.mysql;
 
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.mysql.cdc.MySQLListener;
+import org.dbsyncer.connector.mysql.schema.MySQLDateValueMapper;
 import org.dbsyncer.connector.mysql.storage.MySQLStorageService;
 import org.dbsyncer.connector.mysql.validator.MySQLConfigValidator;
 import org.dbsyncer.sdk.connector.ConfigValidator;
@@ -20,6 +21,7 @@ import org.dbsyncer.sdk.util.PrimaryKeyUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.sql.Types;
 import java.util.List;
 
 /**
@@ -33,12 +35,15 @@ public final class MySQLConnector extends AbstractDatabaseConnector {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    private final String TYPE = "MySQL";
     private final MySQLConfigValidator configValidator = new MySQLConfigValidator();
 
+    public MySQLConnector() {
+        VALUE_MAPPERS.put(Types.DATE, new MySQLDateValueMapper());
+    }
+
     @Override
     public String getConnectorType() {
-        return TYPE;
+        return "MySQL";
     }
 
     @Override

+ 52 - 0
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/MySQLDateValueMapper.java

@@ -0,0 +1,52 @@
+/**
+ * DBSyncer Copyright 2020-2025 All Rights Reserved.
+ */
+package org.dbsyncer.connector.mysql.schema;
+
+import org.dbsyncer.common.util.DateFormatUtil;
+import org.dbsyncer.common.util.StringUtil;
+import org.dbsyncer.sdk.SdkException;
+import org.dbsyncer.sdk.connector.AbstractValueMapper;
+import org.dbsyncer.sdk.connector.ConnectorInstance;
+
+import java.sql.Date;
+import java.sql.Timestamp;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/8/25 0:07
+ */
+public final class MySQLDateValueMapper extends AbstractValueMapper<Date> {
+
+    @Override
+    protected boolean skipConvert(Object val) {
+        if (val instanceof String) {
+            return StringUtil.equals((CharSequence) val, "0000-00-00");
+        }
+
+        // 兼容MySQL年份
+        if (val instanceof Integer) {
+            return true;
+        }
+        return super.skipConvert(val);
+    }
+
+    @Override
+    protected Date convert(ConnectorInstance connectorInstance, Object val) {
+        if (val instanceof Timestamp) {
+            Timestamp timestamp = (Timestamp) val;
+            return Date.valueOf(timestamp.toLocalDateTime().toLocalDate());
+        }
+
+        if (val instanceof String) {
+            String s = (String) val;
+            Timestamp timestamp = DateFormatUtil.stringToTimestamp(s);
+            if (null != timestamp) {
+                return Date.valueOf(timestamp.toLocalDateTime().toLocalDate());
+            }
+        }
+
+        throw new SdkException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
+    }
+}

+ 1 - 1
dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/FieldPicker.java

@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
 
 public class FieldPicker {
 
-    private TableGroup tableGroup;
+    private final TableGroup tableGroup;
     private List<Node> index;
     private int indexSize;
     private boolean enabledFilter;