Răsfoiți Sursa

add module dbsyncer-connector-postgresql

AE86 1 an în urmă
părinte
comite
996a31788b
24 a modificat fișierele cu 248 adăugiri și 142 ștergeri
  1. 9 15
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/ConnectorChecker.java
  2. 46 0
      dbsyncer-connector/dbsyncer-connector-postgresql/pom.xml
  3. 17 7
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/DQLPostgreSQLConnector.java
  4. 18 5
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLConnector.java
  5. 30 0
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLException.java
  6. 7 4
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/cdc/DqlPostgreSQLListener.java
  7. 14 10
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/cdc/PostgreSQLListener.java
  8. 13 10
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/column/PgColumnValue.java
  9. 7 4
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/AbstractMessageDecoder.java
  10. 7 4
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/MessageDecoder.java
  11. 11 8
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/impl/PgOutputMessageDecoder.java
  12. 8 5
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/impl/TestDecodingMessageDecoder.java
  13. 11 8
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageDecoderEnum.java
  14. 3 0
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageTypeEnum.java
  15. 9 6
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/schema/PostgreSQLBitValueMapper.java
  16. 9 6
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/schema/PostgreSQLOtherValueMapper.java
  17. 1 3
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/validator/DqlPostgreSQLConfigValidator.java
  18. 1 3
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/validator/PostgreSQLConfigValidator.java
  19. 2 0
      dbsyncer-connector/dbsyncer-connector-postgresql/src/main/resources/META-INF/services/org.dbsyncer.sdk.spi.ConnectorService
  20. 0 0
      dbsyncer-connector/dbsyncer-connector-postgresql/src/test/java/PGReplicationTest.java
  21. 7 43
      dbsyncer-connector/pom.xml
  22. 6 0
      dbsyncer-parser/pom.xml
  23. 0 1
      dbsyncer-sdk/pom.xml
  24. 12 0
      dbsyncer-storage/pom.xml

+ 9 - 15
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/ConnectorChecker.java

@@ -5,12 +5,11 @@ package org.dbsyncer.biz.checker.impl.connector;
 
 import org.dbsyncer.biz.BizException;
 import org.dbsyncer.biz.checker.AbstractChecker;
-import org.dbsyncer.sdk.connector.ConfigValidator;
-import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.ConnectorFactory;
 import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.sdk.connector.ConfigValidator;
 import org.dbsyncer.sdk.connector.ConnectorInstance;
 import org.dbsyncer.sdk.model.ConnectorConfig;
 import org.dbsyncer.sdk.spi.ConnectorService;
@@ -39,9 +38,6 @@ public class ConnectorChecker extends AbstractChecker {
     @Resource
     private ConnectorFactory connectorFactory;
 
-    @Resource
-    private Map<String, ConfigValidator> map;
-
     @Override
     public ConfigModel checkAddConfigModel(Map<String, String> params) {
         printParams(params);
@@ -55,11 +51,10 @@ public class ConnectorChecker extends AbstractChecker {
         ConnectorConfig config = getConfig(connectorType);
         connector.setConfig(config);
 
-        // 配置连接器配置
-        String type = StringUtil.toLowerCaseFirstOne(connectorType).concat("ConfigChecker");
-        ConfigValidator checker = map.get(type);
-        Assert.notNull(checker, "Checker can not be null.");
-        checker.modify(config, params);
+        // 连接器配置校验
+        ConfigValidator configValidator = connectorFactory.getConnectorService(connectorType).getConfigValidator();
+        Assert.notNull(configValidator, "ConfigValidator can not be null.");
+        configValidator.modify(config, params);
 
         // 获取表
         ConnectorInstance connectorInstance = connectorFactory.connect(connector.getConfig());
@@ -84,11 +79,10 @@ public class ConnectorChecker extends AbstractChecker {
         // 修改基本配置
         this.modifyConfigModel(connector, params);
 
-        // 配置连接器配置
-        String type = StringUtil.toLowerCaseFirstOne(config.getConnectorType()).concat("ConfigChecker");
-        ConfigValidator checker = map.get(type);
-        Assert.notNull(checker, "Checker can not be null.");
-        checker.modify(config, params);
+        // 连接器配置校验
+        ConfigValidator configValidator = connectorFactory.getConnectorService(config.getConnectorType()).getConfigValidator();
+        Assert.notNull(configValidator, "ConfigValidator can not be null.");
+        configValidator.modify(config, params);
 
         // 获取表
         ConnectorInstance connectorInstance = connectorFactory.connect(config);

+ 46 - 0
dbsyncer-connector/dbsyncer-connector-postgresql/pom.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>dbsyncer-connector</artifactId>
+        <groupId>org.ghi</groupId>
+        <version>2.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dbsyncer-connector-postgresql</artifactId>
+
+    <dependencies>
+        <!-- sdk -->
+        <dependency>
+            <groupId>org.ghi</groupId>
+            <artifactId>dbsyncer-sdk</artifactId>
+            <version>${project.parent.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- postgresql -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.postgis</groupId>
+            <artifactId>postgis-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+</project>

+ 17 - 7
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLPostgreSQLConnector.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/DQLPostgreSQLConnector.java

@@ -1,20 +1,30 @@
-package org.dbsyncer.connector.sql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql;
 
-import org.dbsyncer.connector.postgresql.DqlPostgreSQLListener;
-import org.dbsyncer.sdk.connector.ConfigValidator;
-import org.dbsyncer.sdk.listener.DatabaseQuartzListener;
+import org.dbsyncer.connector.postgresql.cdc.DqlPostgreSQLListener;
+import org.dbsyncer.connector.postgresql.validator.DqlPostgreSQLConfigValidator;
 import org.dbsyncer.sdk.config.ReaderConfig;
+import org.dbsyncer.sdk.connector.ConfigValidator;
 import org.dbsyncer.sdk.connector.database.AbstractDQLConnector;
 import org.dbsyncer.sdk.constant.DatabaseConstant;
 import org.dbsyncer.sdk.enums.ListenerTypeEnum;
+import org.dbsyncer.sdk.listener.DatabaseQuartzListener;
 import org.dbsyncer.sdk.listener.Listener;
 import org.dbsyncer.sdk.model.PageSql;
-import org.springframework.stereotype.Component;
 
-@Component
+/**
+ * DQLSqlServer连接器实现
+ *
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-05-22 22:56
+ */
 public final class DQLPostgreSQLConnector extends AbstractDQLConnector {
 
     private final String TYPE = "DqlPostgreSQL";
+    private final DqlPostgreSQLConfigValidator configValidator = new DqlPostgreSQLConfigValidator();
 
     @Override
     public String getConnectorType() {
@@ -23,7 +33,7 @@ public final class DQLPostgreSQLConnector extends AbstractDQLConnector {
 
     @Override
     public ConfigValidator getConfigValidator() {
-        return null;
+        return configValidator;
     }
 
     @Override

+ 18 - 5
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLConnector.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLConnector.java

@@ -1,33 +1,46 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
 package org.dbsyncer.connector.postgresql;
 
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.sdk.connector.ConfigValidator;
-import org.dbsyncer.sdk.listener.DatabaseQuartzListener;
+import org.dbsyncer.connector.postgresql.cdc.PostgreSQLListener;
+import org.dbsyncer.connector.postgresql.schema.PostgreSQLBitValueMapper;
+import org.dbsyncer.connector.postgresql.schema.PostgreSQLOtherValueMapper;
+import org.dbsyncer.connector.postgresql.validator.PostgreSQLConfigValidator;
 import org.dbsyncer.sdk.config.CommandConfig;
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.sdk.config.ReaderConfig;
+import org.dbsyncer.sdk.connector.ConfigValidator;
 import org.dbsyncer.sdk.connector.database.AbstractDatabaseConnector;
 import org.dbsyncer.sdk.constant.DatabaseConstant;
 import org.dbsyncer.sdk.enums.ListenerTypeEnum;
 import org.dbsyncer.sdk.enums.TableTypeEnum;
+import org.dbsyncer.sdk.listener.DatabaseQuartzListener;
 import org.dbsyncer.sdk.listener.Listener;
 import org.dbsyncer.sdk.model.PageSql;
 import org.dbsyncer.sdk.model.Table;
 import org.dbsyncer.sdk.util.PrimaryKeyUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import java.sql.Types;
 import java.util.List;
 
-@Component
+/**
+ * SqlServer连接器实现
+ *
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-05-22 22:56
+ */
 public final class PostgreSQLConnector extends AbstractDatabaseConnector {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     private final String TYPE = "PostgreSQL";
+    private final PostgreSQLConfigValidator configValidator = new PostgreSQLConfigValidator();
 
     @Override
     public String getConnectorType() {
@@ -36,7 +49,7 @@ public final class PostgreSQLConnector extends AbstractDatabaseConnector {
 
     @Override
     public ConfigValidator getConfigValidator() {
-        return null;
+        return configValidator;
     }
 
     @Override

+ 30 - 0
dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLException.java

@@ -0,0 +1,30 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql;
+
+/**
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-05-18 20:17
+ */
+public class PostgreSQLException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	public PostgreSQLException(String message) {
+        super(message);
+    }
+
+    public PostgreSQLException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public PostgreSQLException(Throwable cause) {
+        super(cause);
+    }
+
+    protected PostgreSQLException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 7 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/DqlPostgreSQLListener.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/cdc/DqlPostgreSQLListener.java

@@ -1,11 +1,14 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.cdc;
 
 import org.dbsyncer.sdk.listener.ChangedEvent;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/5/29 22:44
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-05-18 20:17
  */
 public class DqlPostgreSQLListener extends PostgreSQLListener {
 

+ 14 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLListener.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/cdc/PostgreSQLListener.java

@@ -1,8 +1,12 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.cdc;
 
 import org.dbsyncer.common.util.BooleanUtil;
+import org.dbsyncer.connector.postgresql.decoder.MessageDecoder;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
 import org.dbsyncer.sdk.listener.AbstractDatabaseListener;
-import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.postgresql.enums.MessageDecoderEnum;
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
@@ -32,9 +36,9 @@ import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/10 22:36
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public class PostgreSQLListener extends AbstractDatabaseListener {
 
@@ -75,7 +79,7 @@ public class PostgreSQLListener extends AbstractDatabaseListener {
 
             final String walLevel = instance.execute(databaseTemplate -> databaseTemplate.queryForObject(GET_WAL_LEVEL, String.class));
             if (!DEFAULT_WAL_LEVEL.equals(walLevel)) {
-                throw new ConnectorException(String.format("Postgres server wal_level property must be \"%s\" but is: %s", DEFAULT_WAL_LEVEL, walLevel));
+                throw new PostgreSQLException(String.format("Postgres server wal_level property must be \"%s\" but is: %s", DEFAULT_WAL_LEVEL, walLevel));
             }
 
             final boolean hasAuth = instance.execute(databaseTemplate -> {
@@ -88,7 +92,7 @@ public class PostgreSQLListener extends AbstractDatabaseListener {
                 return login && (replication || superuser || admin || repAdmin);
             });
             if (!hasAuth) {
-                throw new ConnectorException(String.format("Postgres roles LOGIN and REPLICATION are not assigned to user: %s", config.getUsername()));
+                throw new PostgreSQLException(String.format("Postgres roles LOGIN and REPLICATION are not assigned to user: %s", config.getUsername()));
             }
 
             database = instance.execute(databaseTemplate -> databaseTemplate.queryForObject(GET_DATABASE, String.class));
@@ -109,7 +113,7 @@ public class PostgreSQLListener extends AbstractDatabaseListener {
             logger.error("启动失败:{}", e.getMessage());
             DatabaseUtil.close(stream);
             DatabaseUtil.close(connection);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         } finally {
             connectLock.unlock();
         }
@@ -186,7 +190,7 @@ public class PostgreSQLListener extends AbstractDatabaseListener {
         if (!snapshot.containsKey(LSN_POSITION)) {
             LogSequenceNumber lsn = instance.execute(databaseTemplate -> LogSequenceNumber.valueOf(databaseTemplate.queryForObject(GET_RESTART_LSN, new Object[]{database, slotName, plugin}, String.class)));
             if (null == lsn || lsn.asLong() == 0) {
-                throw new ConnectorException("No maximum LSN recorded in the database");
+                throw new PostgreSQLException("No maximum LSN recorded in the database");
             }
             snapshot.put(LSN_POSITION, lsn.asString());
             super.forceFlushEvent();
@@ -289,7 +293,7 @@ public class PostgreSQLListener extends AbstractDatabaseListener {
                     stream.setAppliedLSN(lsn);
                     stream.setFlushedLSN(lsn);
                     stream.forceUpdateStatus();
-                } catch (IllegalStateException | ConnectorException e) {
+                } catch (IllegalStateException | PostgreSQLException e) {
                     logger.error(e.getMessage());
                 } catch (Exception e) {
                     logger.error(e.getMessage(), e);

+ 13 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/column/PgColumnValue.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/column/PgColumnValue.java

@@ -1,9 +1,12 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
 package org.dbsyncer.connector.postgresql.column;
 
 import org.dbsyncer.common.column.AbstractColumnValue;
 import org.dbsyncer.common.util.DateFormatUtil;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
 import org.postgresql.PGStatement;
 import org.postgresql.geometric.PGbox;
 import org.postgresql.geometric.PGcircle;
@@ -126,7 +129,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGbox(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -135,7 +138,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGcircle(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse circle {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -144,7 +147,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGInterval(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -153,7 +156,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGline(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -162,7 +165,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGlseg(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -176,7 +179,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGmoney(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse money {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -185,7 +188,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGpath(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -194,7 +197,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGpoint(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 
@@ -203,7 +206,7 @@ public final class PgColumnValue extends AbstractColumnValue<String> {
             return new PGpolygon(asString());
         } catch (final SQLException e) {
             logger.error("Failed to parse point {}, {}", asString(), e);
-            throw new ConnectorException(e);
+            throw new PostgreSQLException(e);
         }
     }
 

+ 7 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/AbstractMessageDecoder.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/AbstractMessageDecoder.java

@@ -1,4 +1,7 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.decoder;
 
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.connector.postgresql.column.PgColumnValue;
@@ -9,9 +12,9 @@ import org.postgresql.util.PGmoney;
 import java.nio.ByteBuffer;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/17 23:04
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public abstract class AbstractMessageDecoder implements MessageDecoder {
 

+ 7 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/MessageDecoder.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/MessageDecoder.java

@@ -1,4 +1,7 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.decoder;
 
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
@@ -10,9 +13,9 @@ import org.postgresql.replication.fluent.logical.ChainedLogicalStreamBuilder;
 import java.nio.ByteBuffer;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/17 22:59
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public interface MessageDecoder {
 

+ 11 - 8
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/decoder/PgOutputMessageDecoder.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/impl/PgOutputMessageDecoder.java

@@ -1,8 +1,11 @@
-package org.dbsyncer.connector.postgresql.decoder;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.decoder.impl;
 
 import org.dbsyncer.common.util.CollectionUtils;
-import org.dbsyncer.connector.ConnectorException;
-import org.dbsyncer.connector.postgresql.AbstractMessageDecoder;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
+import org.dbsyncer.connector.postgresql.decoder.AbstractMessageDecoder;
 import org.dbsyncer.connector.postgresql.enums.MessageDecoderEnum;
 import org.dbsyncer.connector.postgresql.enums.MessageTypeEnum;
 import org.dbsyncer.sdk.connector.database.DatabaseConnectorInstance;
@@ -23,9 +26,9 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/17 23:00
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public class PgOutputMessageDecoder extends AbstractMessageDecoder {
 
@@ -112,7 +115,7 @@ public class PgOutputMessageDecoder extends AbstractMessageDecoder {
                 return true;
             });
         } catch (Exception e) {
-            throw new ConnectorException(e.getCause());
+            throw new PostgreSQLException(e.getCause());
         }
     }
 
@@ -158,7 +161,7 @@ public class PgOutputMessageDecoder extends AbstractMessageDecoder {
             // The table schema has been changed, we should be get a new table schema from db.
             MetaInfo metaInfo = connectorService.getMetaInfo(connectorInstance, tableId.tableName);
             if (CollectionUtils.isEmpty(metaInfo.getColumn())) {
-                throw new ConnectorException(String.format("The table column for '%s' is empty.", tableId.tableName));
+                throw new PostgreSQLException(String.format("The table column for '%s' is empty.", tableId.tableName));
             }
             tableId.fields = metaInfo.getColumn();
             return;

+ 8 - 5
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/decoder/TestDecodingMessageDecoder.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/decoder/impl/TestDecodingMessageDecoder.java

@@ -1,7 +1,10 @@
-package org.dbsyncer.connector.postgresql.decoder;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.decoder.impl;
 
 import org.dbsyncer.common.column.Lexer;
-import org.dbsyncer.connector.postgresql.AbstractMessageDecoder;
+import org.dbsyncer.connector.postgresql.decoder.AbstractMessageDecoder;
 import org.dbsyncer.connector.postgresql.enums.MessageDecoderEnum;
 import org.dbsyncer.connector.postgresql.enums.MessageTypeEnum;
 import org.dbsyncer.sdk.constant.ConnectorConstant;
@@ -15,9 +18,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/17 23:00
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public class TestDecodingMessageDecoder extends AbstractMessageDecoder {
 

+ 11 - 8
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageDecoderEnum.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageDecoderEnum.java

@@ -1,15 +1,18 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
 package org.dbsyncer.connector.postgresql.enums;
 
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.connector.ConnectorException;
-import org.dbsyncer.connector.postgresql.MessageDecoder;
-import org.dbsyncer.connector.postgresql.decoder.PgOutputMessageDecoder;
-import org.dbsyncer.connector.postgresql.decoder.TestDecodingMessageDecoder;
+import org.dbsyncer.connector.postgresql.decoder.MessageDecoder;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
+import org.dbsyncer.connector.postgresql.decoder.impl.PgOutputMessageDecoder;
+import org.dbsyncer.connector.postgresql.decoder.impl.TestDecodingMessageDecoder;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/4/17 23:05
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public enum MessageDecoderEnum {
 
@@ -31,7 +34,7 @@ public enum MessageDecoderEnum {
         this.clazz = clazz;
     }
 
-    public static MessageDecoder getMessageDecoder(String type) throws ConnectorException, IllegalAccessException, InstantiationException {
+    public static MessageDecoder getMessageDecoder(String type) throws PostgreSQLException, IllegalAccessException, InstantiationException {
         for (MessageDecoderEnum e : MessageDecoderEnum.values()) {
             if (StringUtil.equals(type, e.getType())) {
                 return (MessageDecoder) e.getClazz().newInstance();

+ 3 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageTypeEnum.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/enums/MessageTypeEnum.java

@@ -1,3 +1,6 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
 package org.dbsyncer.connector.postgresql.enums;
 
 public enum MessageTypeEnum {

+ 9 - 6
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLBitValueMapper.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/schema/PostgreSQLBitValueMapper.java

@@ -1,13 +1,16 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.schema;
 
-import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
 import org.dbsyncer.sdk.connector.AbstractValueMapper;
 import org.dbsyncer.sdk.connector.ConnectorInstance;
 
 /**
- * @author AE86
- * @version 1.0.0
- * @date 2022/8/25 0:07
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-04-10 22:36
  */
 public class PostgreSQLBitValueMapper extends AbstractValueMapper<Boolean> {
 
@@ -22,7 +25,7 @@ public class PostgreSQLBitValueMapper extends AbstractValueMapper<Boolean> {
             return s == 1;
         }
 
-        throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
+        throw new PostgreSQLException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
     }
 
 }

+ 9 - 6
dbsyncer-connector/src/main/java/org/dbsyncer/connector/postgresql/PostgreSQLOtherValueMapper.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/schema/PostgreSQLOtherValueMapper.java

@@ -1,6 +1,9 @@
-package org.dbsyncer.connector.postgresql;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.connector.postgresql.schema;
 
-import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.postgresql.PostgreSQLException;
 import org.dbsyncer.sdk.connector.AbstractValueMapper;
 import org.dbsyncer.sdk.connector.ConnectorInstance;
 import org.postgis.Geometry;
@@ -26,9 +29,9 @@ import org.postgresql.geometric.PGpoint;
  * <li>varbit</li>
  * </ol>
  *
- * @author AE86
- * @version 1.0.0
- * @date 2022/12/22 22:59
+ * @Author AE86
+ * @Version 1.0.0
+ * @Date 2022-12-22 22:59
  */
 public final class PostgreSQLOtherValueMapper extends AbstractValueMapper<byte[]> {
 
@@ -45,6 +48,6 @@ public final class PostgreSQLOtherValueMapper extends AbstractValueMapper<byte[]
             BinaryWriter bw = new BinaryWriter();
             return bw.writeBinary(geo);
         }
-        throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
+        throw new PostgreSQLException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
     }
 }

+ 1 - 3
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DqlPostgreSQLConfigValidator.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/validator/DqlPostgreSQLConfigValidator.java

@@ -1,12 +1,11 @@
 /**
  * DBSyncer Copyright 2020-2023 All Rights Reserved.
  */
-package org.dbsyncer.biz.checker.impl.connector;
+package org.dbsyncer.connector.postgresql.validator;
 
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.sdk.connector.AbstractDataBaseConfigValidator;
-import org.springframework.stereotype.Component;
 
 import java.util.Map;
 
@@ -15,7 +14,6 @@ import java.util.Map;
  * @Version 1.0.0
  * @Date 2022-04-05 22:14
  */
-@Component
 public class DqlPostgreSQLConfigValidator extends AbstractDataBaseConfigValidator {
 
     @Override

+ 1 - 3
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/PostgreSQLConfigValidator.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/main/java/org/dbsyncer/connector/postgresql/validator/PostgreSQLConfigValidator.java

@@ -1,12 +1,11 @@
 /**
  * DBSyncer Copyright 2020-2023 All Rights Reserved.
  */
-package org.dbsyncer.biz.checker.impl.connector;
+package org.dbsyncer.connector.postgresql.validator;
 
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.sdk.config.DatabaseConfig;
 import org.dbsyncer.sdk.connector.AbstractDataBaseConfigValidator;
-import org.springframework.stereotype.Component;
 
 import java.util.Map;
 
@@ -15,7 +14,6 @@ import java.util.Map;
  * @Version 1.0.0
  * @Date 2022-04-05 22:14
  */
-@Component
 public class PostgreSQLConfigValidator extends AbstractDataBaseConfigValidator {
     @Override
     public void modify(DatabaseConfig connectorConfig, Map<String, String> params) {

+ 2 - 0
dbsyncer-connector/dbsyncer-connector-postgresql/src/main/resources/META-INF/services/org.dbsyncer.sdk.spi.ConnectorService

@@ -0,0 +1,2 @@
+org.dbsyncer.connector.postgresql.PostgreSQLConnector
+org.dbsyncer.connector.postgresql.DQLPostgreSQLConnector

+ 0 - 0
dbsyncer-connector/src/main/test/PGReplicationTest.java → dbsyncer-connector/dbsyncer-connector-postgresql/src/test/java/PGReplicationTest.java


+ 7 - 43
dbsyncer-connector/pom.xml

@@ -17,6 +17,7 @@
         <module>dbsyncer-connector-mysql</module>
         <module>dbsyncer-connector-oracle</module>
         <module>dbsyncer-connector-sqlserver</module>
+        <module>dbsyncer-connector-postgresql</module>
     </modules>
 
     <dependencies>
@@ -62,55 +63,18 @@
             <version>${project.parent.version}</version>
         </dependency> -->
 
-        <!-- dbsyncer-connector-sqlserver -->
+        <!-- dbsyncer-connector-sqlserver
         <dependency>
             <groupId>org.ghi</groupId>
             <artifactId>dbsyncer-connector-sqlserver</artifactId>
             <version>${project.parent.version}</version>
-        </dependency>
-
-        <!-- Spring-JDBC -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-jdbc</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>antlr4-runtime</artifactId>
-        </dependency>
-
-        <!-- postgresql -->
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>net.postgis</groupId>
-            <artifactId>postgis-jdbc</artifactId>
-        </dependency>
-
-        <!-- smartcn中文分词器 -->
-        <dependency>
-            <groupId>org.apache.lucene</groupId>
-            <artifactId>lucene-analyzers-smartcn</artifactId>
-        </dependency>
-
-        <!-- elasticsearch -->
-        <dependency>
-            <groupId>org.elasticsearch.client</groupId>
-            <artifactId>elasticsearch-rest-high-level-client</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-log4j2</artifactId>
-        </dependency>
+        </dependency> -->
 
+        <!-- dbsyncer-connector-postgresql -->
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>provided</scope>
+            <groupId>org.ghi</groupId>
+            <artifactId>dbsyncer-connector-postgresql</artifactId>
+            <version>${project.parent.version}</version>
         </dependency>
 
     </dependencies>

+ 6 - 0
dbsyncer-parser/pom.xml

@@ -30,6 +30,12 @@
             <artifactId>jsqlparser</artifactId>
         </dependency>
 
+        <!-- antlr4-runtime -->
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>antlr4-runtime</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

+ 0 - 1
dbsyncer-sdk/pom.xml

@@ -22,7 +22,6 @@
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
-            <scope>provided</scope>
         </dependency>
 
         <!-- oracle-driver -->

+ 12 - 0
dbsyncer-storage/pom.xml

@@ -30,6 +30,18 @@
             <artifactId>ojdbc6</artifactId>
         </dependency>
 
+        <!-- smartcn中文分词器 -->
+        <dependency>
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-analyzers-smartcn</artifactId>
+        </dependency>
+
+        <!-- elasticsearch -->
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-log4j2</artifactId>