Explorar el Código

支持复制驱动 https://gitee.com/ghi/dbsyncer/issues/I7R9Y4

Signed-off-by: AE86 <836391306@qq.com>
AE86 hace 1 año
padre
commit
c77e45bdb4

+ 7 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/MappingService.java

@@ -19,6 +19,13 @@ public interface MappingService {
      */
     String add(Map<String, String> params);
 
+    /**
+     * 复制驱动
+     *
+     * @param id
+     */
+    String copy(String id);
+
     /**
      * 修改驱动
      *

+ 11 - 11
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/mapping/MappingChecker.java

@@ -113,6 +113,17 @@ public class MappingChecker extends AbstractChecker {
         return mapping;
     }
 
+    public void addMeta(Mapping mapping) {
+        Meta meta = new Meta();
+        meta.setMappingId(mapping.getId());
+
+        // 修改基本配置
+        this.modifyConfigModel(meta, new HashMap<>());
+
+        String id = manager.addConfigModel(meta);
+        mapping.setMetaId(id);
+    }
+
     /**
      * 更新元信息
      *
@@ -199,17 +210,6 @@ public class MappingChecker extends AbstractChecker {
         manager.editConfigModel(meta);
     }
 
-    private void addMeta(Mapping mapping) {
-        Meta meta = new Meta();
-        meta.setMappingId(mapping.getId());
-
-        // 修改基本配置
-        this.modifyConfigModel(meta, new HashMap<>());
-
-        String id = manager.addConfigModel(meta);
-        mapping.setMetaId(id);
-    }
-
     private void getMetaTotal(Meta meta, String model) {
         // 全量同步
         if (ModelEnum.isFull(model)) {

+ 42 - 2
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MappingServiceImpl.java

@@ -8,17 +8,24 @@ import org.dbsyncer.biz.checker.impl.mapping.MappingChecker;
 import org.dbsyncer.biz.vo.ConnectorVo;
 import org.dbsyncer.biz.vo.MappingVo;
 import org.dbsyncer.biz.vo.MetaVo;
+import org.dbsyncer.common.snowflake.SnowflakeIdWorker;
 import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.logger.LogType;
-import org.dbsyncer.parser.model.*;
+import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.TableGroup;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
+import java.time.Instant;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -42,6 +49,9 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
     @Autowired
     private ConnectorService connectorService;
 
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+
     @Override
     public String add(Map<String, String> params) {
         ConfigModel model = mappingChecker.checkAddConfigModel(params);
@@ -58,6 +68,36 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
         return id;
     }
 
+    @Override
+    public String copy(String id) {
+        Mapping mapping = manager.getMapping(id);
+        Assert.notNull(mapping, "The mapping id is invalid.");
+
+        String json = JsonUtil.objToJson(mapping);
+        Mapping newMapping = JsonUtil.jsonToObj(json, Mapping.class);
+        newMapping.setName(mapping.getName() + "(复制)");
+        newMapping.setId(String.valueOf(snowflakeIdWorker.nextId()));
+        newMapping.setUpdateTime(Instant.now().toEpochMilli());
+        mappingChecker.addMeta(newMapping);
+
+        manager.addConfigModel(newMapping);
+        log(LogType.MappingLog.COPY, newMapping);
+
+        // 复制映射表关系
+        List<TableGroup> groupList = manager.getTableGroupAll(mapping.getId());
+        if(!CollectionUtils.isEmpty(groupList)){
+            groupList.forEach(tableGroup -> {
+                String tableGroupJson = JsonUtil.objToJson(tableGroup);
+                TableGroup newTableGroup = JsonUtil.jsonToObj(tableGroupJson, TableGroup.class);
+                newTableGroup.setId(String.valueOf(snowflakeIdWorker.nextId()));
+                newTableGroup.setMappingId(newMapping.getId());
+                manager.addTableGroup(newTableGroup);
+                log(LogType.TableGroupLog.COPY, newTableGroup);
+            });
+        }
+        return String.format("复制成功[%s]", newMapping.getName());
+    }
+
     @Override
     public String edit(Map<String, String> params) {
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
@@ -91,7 +131,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
             // 删除tableGroup
             List<TableGroup> groupList = manager.getTableGroupAll(id);
             if (!CollectionUtils.isEmpty(groupList)) {
-                groupList.forEach(t -> manager.removeConfigModel(t.getId()));
+                groupList.forEach(t -> manager.removeTableGroup(t.getId()));
             }
 
             // 删除驱动

+ 1 - 1
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/TableGroupServiceImpl.java

@@ -96,7 +96,7 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
         Stream.of(StringUtil.split(ids, ",")).parallel().forEach(id -> {
             TableGroup model = manager.getTableGroup(id);
             log(LogType.TableGroupLog.DELETE, model);
-            manager.removeConfigModel(id);
+            manager.removeTableGroup(id);
         });
 
         // 合并驱动公共字段

+ 2 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/es/ESConnectorMapper.java

@@ -17,7 +17,7 @@ public final class ESConnectorMapper implements ConnectorMapper<ESConfig, EasyRe
         this.client = ESUtil.getConnection(config);
         try {
             MainResponse info = client.info(RequestOptions.DEFAULT);
-            client.setVersion(Version.fromString(info.getVersion().getNumber()));;
+            client.setVersion(Version.fromString(info.getVersion().getNumber()));
         } catch (Exception e) {
             throw new ConnectorException(String.format("获取ES版本信息异常 %s, %s", config.getUrl(), e.getMessage()));
         }
@@ -51,4 +51,4 @@ public final class ESConnectorMapper implements ConnectorMapper<ESConfig, EasyRe
     public Object clone() throws CloneNotSupportedException {
         return super.clone();
     }
-}
+}

+ 2 - 0
dbsyncer-manager/src/main/java/org/dbsyncer/manager/Manager.java

@@ -89,6 +89,8 @@ public interface Manager extends Executor {
 
     String editTableGroup(TableGroup model);
 
+    void removeTableGroup(String id);
+
     TableGroup getTableGroup(String tableGroupId);
 
     List<TableGroup> getTableGroupAll(String mappingId);

+ 5 - 0
dbsyncer-manager/src/main/java/org/dbsyncer/manager/ManagerFactory.java

@@ -173,6 +173,11 @@ public class ManagerFactory implements Manager, ApplicationListener<ClosedEvent>
         return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_EDIT, GroupStrategyEnum.TABLE));
     }
 
+    @Override
+    public void removeTableGroup(String id) {
+        operationTemplate.remove(new OperationConfig(id, GroupStrategyEnum.TABLE));
+    }
+
     @Override
     public TableGroup getTableGroup(String tableGroupId) {
         return operationTemplate.queryObject(TableGroup.class, tableGroupId);

+ 5 - 4
dbsyncer-parser/src/main/java/org/dbsyncer/parser/logger/LogType.java

@@ -115,7 +115,8 @@ public interface LogType {
         DELETE("32", "删除"),
         RUNNING("33", "启动"),
         STOP("34", "停止"),
-        CLEAR_DATA("35", "清空同步数据");
+        CLEAR_DATA("35", "清空同步数据"),
+        COPY("36", "复制");
 
         private String type;
         private String message;
@@ -149,7 +150,8 @@ public interface LogType {
         UPDATE("41", "修改"),
         DELETE("42", "删除"),
         INCREMENT_FAILED("43", "增量同步异常"),
-        FULL_FAILED("44", "全量同步异常");
+        FULL_FAILED("44", "全量同步异常"),
+        COPY("45", "复制");
 
         private String type;
         private String message;
@@ -180,8 +182,7 @@ public interface LogType {
      */
     enum MetaLog implements LogType {
         DELETE("50", "删除"),
-        CLEAR("51", "删除数据"),
-        TASK("52", "任务");
+        CLEAR("51", "删除数据");
 
         private String type;
         private String message;

+ 18 - 7
dbsyncer-web/src/main/java/org/dbsyncer/web/controller/index/MappingController.java

@@ -44,6 +44,17 @@ public class MappingController extends BaseController {
         return "mapping/" + page;
     }
 
+    @PostMapping("/copy")
+    @ResponseBody
+    public RestResult add(@RequestParam("id") String id) {
+        try {
+            return RestResult.restSuccess(mappingService.copy(id));
+        } catch (Exception e) {
+            logger.error(e.getLocalizedMessage(), e);
+            return RestResult.restFail(e.getMessage());
+        }
+    }
+
     @PostMapping(value = "/add")
     @ResponseBody
     public RestResult add(HttpServletRequest request) {
@@ -51,7 +62,7 @@ public class MappingController extends BaseController {
             Map<String, String> params = getParams(request);
             return RestResult.restSuccess(mappingService.add(params));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -63,7 +74,7 @@ public class MappingController extends BaseController {
             Map<String, String> params = getParams(request);
             return RestResult.restSuccess(mappingService.edit(params));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -74,7 +85,7 @@ public class MappingController extends BaseController {
         try {
             return RestResult.restSuccess(mappingService.remove(id));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -85,7 +96,7 @@ public class MappingController extends BaseController {
         try {
             return RestResult.restSuccess(mappingService.start(id));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -96,7 +107,7 @@ public class MappingController extends BaseController {
         try {
             return RestResult.restSuccess(mappingService.stop(id));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -107,7 +118,7 @@ public class MappingController extends BaseController {
         try {
             return RestResult.restSuccess(mappingService.getMapping(id));
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }
@@ -118,7 +129,7 @@ public class MappingController extends BaseController {
         try {
             return RestResult.restSuccess(mappingService.getMappingAll());
         } catch (Exception e) {
-            logger.error(e.getLocalizedMessage(), e.getClass());
+            logger.error(e.getLocalizedMessage(), e);
             return RestResult.restFail(e.getMessage());
         }
     }

+ 2 - 1
dbsyncer-web/src/main/resources/public/index/index.html

@@ -192,6 +192,7 @@
                                         <div class="dropdown">
                                             <a data-toggle="dropdown" href="javascript:;"><span class="well-sign-operation"><i class="fa fa-gears fa-2x"></i></span></a>
                                             <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
+                                                <li th:url="'/mapping/copy?id='+${m?.id}"><a href="javascript:;"><i class="fa fa-copy"></i>&nbsp;复制</a></li>
                                                 <!-- 未运行 -->
                                                 <li th:if="${m?.meta?.state ne 1}" th:url="'/mapping/start?id='+${m?.id}"><a href="javascript:;"><i class="fa fa-check-circle-o well-sign-green"></i>&nbsp;&nbsp;启动</a></li>
                                                 <!-- 运行中 -->
@@ -216,4 +217,4 @@
 </div>
 
 <script th:src="@{/js/index/index.js}"></script>
-</html>
+</html>