1
0
AE86 3 жил өмнө
parent
commit
367efdb6e6

+ 2 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/ConnectorMapper.java

@@ -23,9 +23,7 @@ public interface ConnectorMapper<K, V> {
 
     K getConfig();
 
-    default V getConnection() throws Exception {
-        throw new ConnectorException("Unsupported method.");
-    }
+    V getConnection() throws Exception;
 
-    default void close() {}
+    void close();
 }

+ 35 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/FileConfig.java

@@ -0,0 +1,35 @@
+package org.dbsyncer.connector.config;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/5/5 23:19
+ */
+public class FileConfig extends ConnectorConfig {
+
+    /**
+     * 文件目录
+     */
+    private String fileDir;
+
+    /**
+     * 文件描述信息
+     */
+    private String schema;
+
+    public String getFileDir() {
+        return fileDir;
+    }
+
+    public void setFileDir(String fileDir) {
+        this.fileDir = fileDir;
+    }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public void setSchema(String schema) {
+        this.schema = schema;
+    }
+}

+ 6 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/ConnectorEnum.java

@@ -5,8 +5,10 @@ import org.dbsyncer.connector.Connector;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.config.ESConfig;
+import org.dbsyncer.connector.config.FileConfig;
 import org.dbsyncer.connector.config.KafkaConfig;
 import org.dbsyncer.connector.es.ESConnector;
+import org.dbsyncer.connector.file.FileConnector;
 import org.dbsyncer.connector.kafka.KafkaConnector;
 import org.dbsyncer.connector.mysql.MysqlConnector;
 import org.dbsyncer.connector.oracle.OracleConnector;
@@ -50,6 +52,10 @@ public enum ConnectorEnum {
      * Kafka 连接器
      */
     KAFKA("Kafka", new KafkaConnector(), KafkaConfig.class),
+    /**
+     * File 连接器
+     */
+    FILE("File", new FileConnector(), FileConfig.class),
     /**
      * DqlMysql 连接器
      */

+ 86 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/file/FileConnector.java

@@ -0,0 +1,86 @@
+package org.dbsyncer.connector.file;
+
+import org.dbsyncer.common.model.Result;
+import org.dbsyncer.connector.AbstractConnector;
+import org.dbsyncer.connector.Connector;
+import org.dbsyncer.connector.ConnectorMapper;
+import org.dbsyncer.connector.config.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/5/5 23:19
+ */
+public final class FileConnector extends AbstractConnector implements Connector<FileConnectorMapper, FileConfig> {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public ConnectorMapper connect(FileConfig config) {
+        return new FileConnectorMapper(config);
+    }
+
+    @Override
+    public void disconnect(FileConnectorMapper connectorMapper) {
+
+    }
+
+    @Override
+    public boolean isAlive(FileConnectorMapper connectorMapper) {
+        return false;
+    }
+
+    @Override
+    public String getConnectorMapperCacheKey(FileConfig config) {
+        String localIP;
+        try {
+            localIP = InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            logger.error(e.getMessage());
+            localIP = "127.0.0.1";
+        }
+        return String.format("%s-%s", config.getConnectorType(), localIP, config.getFileDir());
+    }
+
+    @Override
+    public List<Table> getTable(FileConnectorMapper connectorMapper) {
+        return null;
+    }
+
+    @Override
+    public MetaInfo getMetaInfo(FileConnectorMapper connectorMapper, String tableName) {
+        return null;
+    }
+
+    @Override
+    public long getCount(FileConnectorMapper connectorMapper, Map<String, String> command) {
+        return 0;
+    }
+
+    @Override
+    public Result reader(FileConnectorMapper connectorMapper, ReaderConfig config) {
+        return null;
+    }
+
+    @Override
+    public Result writer(FileConnectorMapper connectorMapper, WriterBatchConfig config) {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getSourceCommand(CommandConfig commandConfig) {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getTargetCommand(CommandConfig commandConfig) {
+        return null;
+    }
+}

+ 35 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/file/FileConnectorMapper.java

@@ -0,0 +1,35 @@
+package org.dbsyncer.connector.file;
+
+import org.dbsyncer.connector.ConnectorMapper;
+import org.dbsyncer.connector.config.FileConfig;
+
+import java.io.File;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2022/5/5 23:19
+ */
+public final class FileConnectorMapper implements ConnectorMapper<FileConfig, File> {
+    private FileConfig config;
+    private File file;
+
+    public FileConnectorMapper(FileConfig config) {
+        this.config = config;
+        file = new File(config.getFileDir());
+    }
+
+    public FileConfig getConfig() {
+        return config;
+    }
+
+    @Override
+    public File getConnection() {
+        return file;
+    }
+
+    @Override
+    public void close() {
+
+    }
+}

+ 61 - 0
dbsyncer-web/src/main/resources/public/connector/addFile.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
+
+<div th:fragment="content">
+    <div class="form-group">
+        <label class="col-sm-2 control-label">监听路径<i class="fa fa-question-circle fa_gray" aria-hidden="true"
+                                                     title="监听的文件路径"></i> <strong
+                class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-4">
+            <input class="form-control" name="fileDir" type="text" maxlength="512" dbsyncer-valid="require"
+                   th:value="${connector?.config?.fileDir}?:'/soft'"/>
+        </div>
+        <div class="col-sm-6"></div>
+    </div>
+
+    <div class="form-group">
+        <label class="col-sm-2 control-label">schema <i class="fa fa-question-circle fa_gray" aria-hidden="true"
+                                                        title="支持11种字段类型。name字段名, typeName类型名称, type类型编码, pk是否为主键"></i><strong
+                class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-9">
+            <textarea id="schema" name="schema" class="form-control dbsyncer_textarea_resize_none" maxlength="4096"
+                      dbsyncer-valid="require" rows="20" th:text="${connector?.config?.schema}"></textarea>
+        </div>
+        <div class="col-sm-1">
+            <button type="button" class="btn btn-default" onclick="format()">
+                <span class="fa fa-magic"></span>美化
+            </button>
+        </div>
+    </div>
+
+    <script type="text/javascript">
+        function format() {
+            const $text = $("#schema");
+            if ("" == $text.text()) {
+                const data = [
+                    {"name": "id", "typeName": "String", "type": 12, "pk": true},
+                    {"name": "age", "typeName": "Integer", "type": 4},
+                    {"name": "count", "typeName": "Long", "type": -5},
+                    {"name": "type", "typeName": "Short", "type": 5},
+                    {"name": "money", "typeName": "Float", "type": 6},
+                    {"name": "score", "typeName": "Double", "type": 8},
+                    {"name": "status", "typeName": "Boolean", "type": -7},
+                    // {"name":"photo","typeName":"byte[]","type":-2},
+                    {"name": "create_date", "typeName": "Date", "type": 91},
+                    {"name": "time", "typeName": "Time", "type": 92},
+                    {"name": "update_time", "typeName": "Timestamp", "type": 93}
+                ];
+                $text.val(JSON.stringify(data, null, 4));
+                return;
+            }
+            $text.val(JSON.stringify(JSON.parse($text.text()), null, 4));
+        }
+
+        $(function () {
+            format();
+        })
+    </script>
+</div>
+
+</html>