diff --git a/build-docker/build_and_push_image.sh b/build-docker/build_and_push_image.sh index 88b55ebe..87084bb7 100644 --- a/build-docker/build_and_push_image.sh +++ b/build-docker/build_and_push_image.sh @@ -2,7 +2,7 @@ set -e -DBSWITCH_VERSION=1.6.8 +DBSWITCH_VERSION=1.6.9 BUILD_DOCKER_DIR="$( cd "$( dirname "$0" )" && pwd )" PROJECT_ROOT_DIR=$( dirname "$BUILD_DOCKER_DIR") DOCKER_DBSWITCH_DIR=$BUILD_DOCKER_DIR/dbswitch diff --git a/build-docker/install/docker-compose.yml b/build-docker/install/docker-compose.yml index 41f3193c..65b05d89 100644 --- a/build-docker/install/docker-compose.yml +++ b/build-docker/install/docker-compose.yml @@ -13,7 +13,7 @@ services: MYSQL_ROOT_HOST: '%' dbswitch: container_name: dbswitch_webui - image: inrgihc/dbswitch:1.6.8 + image: inrgihc/dbswitch:1.6.9 environment: MYSQLDB_HOST: dbswitch_mysqldb MYSQLDB_PORT: 3306 diff --git a/dbswitch-admin/pom.xml b/dbswitch-admin/pom.xml index a8e72a15..1be8e5d6 100644 --- a/dbswitch-admin/pom.xml +++ b/dbswitch-admin/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-admin diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentCreateRequest.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentCreateRequest.java index 69e98f3d..a4d667f1 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentCreateRequest.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentCreateRequest.java @@ -13,9 +13,9 @@ import com.gitee.dbswitch.admin.common.excption.DbswitchException; import com.gitee.dbswitch.admin.common.response.ResultCode; import com.gitee.dbswitch.admin.entity.AssignmentConfigEntity; import com.gitee.dbswitch.admin.entity.AssignmentTaskEntity; -import com.gitee.dbswitch.admin.service.ScheduleService; import com.gitee.dbswitch.admin.type.IncludeExcludeEnum; import com.gitee.dbswitch.admin.type.ScheduleModeEnum; +import com.gitee.dbswitch.admin.util.CronExprUtils; import com.gitee.dbswitch.common.entity.PatternMapper; import java.util.List; import java.util.Objects; @@ -55,11 +55,7 @@ public class AssigmentCreateRequest { assignment.setDescription(description); assignment.setScheduleMode(scheduleMode); if (ScheduleModeEnum.SYSTEM_SCHEDULED == this.getScheduleMode()) { - if (!ScheduleService.checkCronExpressionValid(this.getCronExpression())) { - throw new DbswitchException(ResultCode.ERROR_INVALID_ARGUMENT, - "CRON表达式[" + this.getCronExpression() + "]"); - } - + CronExprUtils.checkCronExpressionValid(this.getCronExpression(), 120); assignment.setCronExpression(this.getCronExpression()); } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentUpdateRequest.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentUpdateRequest.java index 1b566daa..7af39019 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentUpdateRequest.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/model/request/AssigmentUpdateRequest.java @@ -13,9 +13,9 @@ import com.gitee.dbswitch.admin.common.excption.DbswitchException; import com.gitee.dbswitch.admin.common.response.ResultCode; import com.gitee.dbswitch.admin.entity.AssignmentConfigEntity; import com.gitee.dbswitch.admin.entity.AssignmentTaskEntity; -import com.gitee.dbswitch.admin.service.ScheduleService; import com.gitee.dbswitch.admin.type.IncludeExcludeEnum; import com.gitee.dbswitch.admin.type.ScheduleModeEnum; +import com.gitee.dbswitch.admin.util.CronExprUtils; import com.gitee.dbswitch.common.entity.PatternMapper; import java.util.List; import java.util.Objects; @@ -56,11 +56,7 @@ public class AssigmentUpdateRequest { assignment.setDescription(description); assignment.setScheduleMode(scheduleMode); if (ScheduleModeEnum.SYSTEM_SCHEDULED == this.getScheduleMode()) { - if (!ScheduleService.checkCronExpressionValid(this.getCronExpression())) { - throw new DbswitchException(ResultCode.ERROR_INVALID_ARGUMENT, - "CRON表达式[" + this.getCronExpression() + "]"); - } - + CronExprUtils.checkCronExpressionValid(this.getCronExpression(), 120); assignment.setCronExpression(this.getCronExpression()); } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java index 5e1399f8..8bd65258 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java @@ -41,8 +41,11 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import javax.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.quartz.CronExpression; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.quartz.CronExpression; @Service public class AssignmentService { diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/JobExecutorService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/JobExecutorService.java index 4e76ec0f..906be8fa 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/JobExecutorService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/JobExecutorService.java @@ -118,7 +118,10 @@ public class JobExecutorService extends QuartzJobBean implements InterruptableJo try { ReentrantLock lock = mutexes.get(taskId.toString(), ReentrantLock::new); - lock.lock(); + while (!lock.tryLock(1, TimeUnit.SECONDS)) { + TimeUnit.SECONDS.sleep(1); + } + try { log.info("Execute Quartz Job, and task id is : {} , job id is: {}", taskId, assignmentJobEntity.getId()); @@ -141,6 +144,12 @@ public class JobExecutorService extends QuartzJobBean implements InterruptableJo } MigrationService mainService = new MigrationService(properties); + if (interrupted) { + log.info("Quartz task id:{} interrupted", jobDataMap.getLong(TASK_ID)); + return; + } + + // 实际执行JOB mainService.run(); if (assignmentConfigEntity.getFirstFlag()) { @@ -166,7 +175,7 @@ public class JobExecutorService extends QuartzJobBean implements InterruptableJo } finally { lock.unlock(); } - } catch (ExecutionException e) { + } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/PatternMapperService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/PatternMapperService.java index 026d6de4..d0c0e7bf 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/PatternMapperService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/PatternMapperService.java @@ -83,10 +83,18 @@ public class PatternMapperService { dbConn.getUrl(), dbConn.getUsername(), dbConn.getPassword(), request.getSchemaName(), request.getTableName()); for (ColumnDescription cd : tables) { - result.add(PreviewNameMapperResponse.builder() - .originalName(cd.getFieldName()) - .targetName(PatterNameUtils.getFinalName(cd.getFieldName(), request.getNameMapper())) - .build()); + String targetName = PatterNameUtils.getFinalName(cd.getFieldName(), request.getNameMapper()); + if (StringUtils.isNotBlank(targetName)) { + result.add(PreviewNameMapperResponse.builder() + .originalName(cd.getFieldName()) + .targetName(targetName) + .build()); + } else { + result.add(PreviewNameMapperResponse.builder() + .originalName(cd.getFieldName()) + .targetName("") + .build()); + } } return Result.success(result); diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java index 8e0b138a..e38cf3dc 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java @@ -55,16 +55,6 @@ public class ScheduleService { @Resource private AssignmentJobDAO assignmentJobDAO; - public static boolean checkCronExpressionValid(String cronExpression) { - try { - CronScheduleBuilder.cronSchedule(cronExpression); - return true; - } catch (Exception e) { - return false; - } - - } - // public Trigger getQuartzJobDetail(String jobKey) { // Scheduler scheduler = schedulerFactoryBean.getScheduler(); // diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/CronExprUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/CronExprUtils.java new file mode 100644 index 00000000..8301d9a2 --- /dev/null +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/CronExprUtils.java @@ -0,0 +1,54 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.admin.util; + +import com.gitee.dbswitch.admin.common.excption.DbswitchException; +import com.gitee.dbswitch.admin.common.response.ResultCode; +import java.text.ParseException; +import java.util.Date; +import org.apache.commons.lang.StringUtils; +import org.quartz.CronExpression; + +/** + * CRON表达式工具类 + */ +public final class CronExprUtils { + + /** + * 检查CRON表达式的有效性 + * + * @param cronExpression CRON表达式 + * @param minIntervalSeconds 最小间隔时间(单位:秒) + */ + public static void checkCronExpressionValid(String cronExpression, int minIntervalSeconds) { + if (StringUtils.isNotBlank(cronExpression)) { + CronExpression expression; + try { + expression = new CronExpression(cronExpression); + } catch (ParseException e) { + throw new DbswitchException(ResultCode.ERROR_INVALID_ARGUMENT, String.format("正则表达式%s无效")); + } + Date nextDate = expression.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + if (null == nextDate) { + throw new DbswitchException(ResultCode.ERROR_INVALID_ARGUMENT, + String.format("cron表达式[%s]不可以在历史时间运行", cronExpression)); + } + Date calculateDate = expression.getNextValidTimeAfter(new Date(nextDate.getTime() + 1)); + if (null != calculateDate) { + long intervalSeconds = (calculateDate.getTime() - nextDate.getTime()) / 1000; + if (intervalSeconds < minIntervalSeconds) { + throw new DbswitchException(ResultCode.ERROR_INVALID_ARGUMENT, + String.format("cron表达式[%s]运行间隔时间为%d秒, 小于设定的阈值 [%s秒]", + cronExpression, intervalSeconds, minIntervalSeconds)); + } + } + } + } +} diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/JsonUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/JsonUtils.java index f8b14de0..1d96b886 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/JsonUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/JsonUtils.java @@ -17,6 +17,9 @@ import java.util.List; import java.util.Objects; import lombok.extern.slf4j.Slf4j; +/** + * JSON序列化与反序列化工具类 + */ @Slf4j public final class JsonUtils { diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PageUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PageUtils.java index b7cdc429..069d58e7 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PageUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PageUtils.java @@ -16,6 +16,9 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +/** + * 分页工具类 + */ public class PageUtils { public static PageResult getPage(Supplier> method, Integer pageNum, diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PasswordUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PasswordUtils.java index 6cdb6244..364eafed 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PasswordUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/PasswordUtils.java @@ -11,6 +11,9 @@ package com.gitee.dbswitch.admin.util; import cn.hutool.crypto.digest.BCrypt; +/** + * 密码工具类 + */ public final class PasswordUtils { public static String encryptPassword(String password, String credentialsSalt) { diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/ServletUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/ServletUtils.java index 539a6aa7..a9c5135c 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/ServletUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/ServletUtils.java @@ -15,6 +15,9 @@ import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +/** + * 获取Servlet服务器的HTTP参数相关工具类 + */ @Slf4j public class ServletUtils { @@ -74,7 +77,7 @@ public class ServletUtils { ip = request.getRemoteAddr(); } } catch (Exception e) { - log.error("IPUtils ERROR ", e); + log.error("get client IP address error: ", e); } return ip; diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/SpringUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/SpringUtils.java index 88dec89e..30475d31 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/SpringUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/SpringUtils.java @@ -14,6 +14,9 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; +/** + * Spring容器获取BEAN工具类 + */ @Component public class SpringUtils implements ApplicationContextAware { diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/UuidUtils.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/UuidUtils.java index 84a6fb9f..cdb10392 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/UuidUtils.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/util/UuidUtils.java @@ -11,6 +11,9 @@ package com.gitee.dbswitch.admin.util; import java.util.UUID; +/** + * UUID工具类 + */ public class UuidUtils { public static String generateUuid() { diff --git a/dbswitch-common/pom.xml b/dbswitch-common/pom.xml index 9144ce94..e17e6090 100644 --- a/dbswitch-common/pom.xml +++ b/dbswitch-common/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-common diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml index a12f6b4b..7f5b9b7b 100644 --- a/dbswitch-core/pom.xml +++ b/dbswitch-core/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-core diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java index e62aef5c..1024aecb 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java @@ -141,7 +141,7 @@ public class DatabaseDB2Impl extends AbstractDatabase implements IDatabaseInterf retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "CHARACTER(32)"; + retval += "BOOLEAN"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_BIGNUMBER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java index 30bf40e9..e3dd16ad 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java @@ -116,7 +116,7 @@ public class DatabaseDmImpl extends AbstractDatabase implements IDatabaseInterfa retval.append("DATE"); break; case ColumnMetaData.TYPE_BOOLEAN: - retval.append("VARCHAR(32)"); + retval.append("BIT"); break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_BIGNUMBER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java index e68e0ed0..39476862 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java @@ -139,7 +139,7 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "VARCHAR(32)"; + retval += "BOOLEAN"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_INTEGER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java index cc886480..e7dc34bb 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java @@ -118,7 +118,7 @@ public class DatabaseKingbaseImpl extends AbstractDatabase implements IDatabaseI retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "VARCHAR(32)"; + retval += "BOOLEAN"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_INTEGER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java index abcabfe5..304a2bda 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java @@ -180,7 +180,7 @@ public class DatabaseMysqlImpl extends AbstractDatabase implements IDatabaseInte retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "VARCHAR(32)"; + retval += "TINYINT"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_INTEGER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java index 597d11a6..62447d87 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java @@ -185,7 +185,7 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt retval.append("DATE"); break; case ColumnMetaData.TYPE_BOOLEAN: - retval.append("VARCHAR(32)"); + retval.append("NUMBER(1)"); break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_BIGNUMBER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java index 5f888281..faa2f663 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java @@ -154,7 +154,7 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "VARCHAR(32)"; + retval += "BOOLEAN"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_INTEGER: diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java index 5f90f0fe..b192bc5e 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java @@ -238,7 +238,7 @@ public class DatabaseSqlserverImpl extends AbstractDatabase implements IDatabase retval += "DATE"; break; case ColumnMetaData.TYPE_BOOLEAN: - retval += "VARCHAR(32)"; + retval += "BIT"; break; case ColumnMetaData.TYPE_NUMBER: case ColumnMetaData.TYPE_INTEGER: diff --git a/dbswitch-data/pom.xml b/dbswitch-data/pom.xml index c0d2577f..7f26be54 100644 --- a/dbswitch-data/pom.xml +++ b/dbswitch-data/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-data diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java index d33ee093..3f969ca5 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java @@ -34,6 +34,7 @@ import com.gitee.dbswitch.dbwriter.IDatabaseWriter; import com.zaxxer.hikari.HikariDataSource; import java.sql.ResultSet; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.ehcache.sizeof.SizeOf; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.util.StringUtils; /** * 在一个线程内的单表迁移处理逻辑 @@ -153,7 +155,11 @@ public class MigrationHandler implements Supplier { for (int i = 0; i < sourceColumnDescriptions.size(); ++i) { String sourceColumnName = sourceColumnDescriptions.get(i).getFieldName(); String targetColumnName = targetColumnDescriptions.get(i).getFieldName(); - columnMapperPairs.add(String.format("%s --> %s", sourceColumnName, targetColumnName)); + if (StringUtils.hasLength(targetColumnName)) { + columnMapperPairs.add(String.format("%s --> %s", sourceColumnName, targetColumnName)); + } else { + columnMapperPairs.add(String.format("%s --> %s", sourceColumnName, "")); + } mapChecker.put(sourceColumnName, targetColumnName); } log.info("Mapping relation : \ntable mapper :\n\t{} \ncolumn mapper :\n\t{} ", @@ -183,8 +189,15 @@ public class MigrationHandler implements Supplier { // 生成建表语句并创建 String sqlCreateTable = sourceMetaDataService.getDDLCreateTableSQL( - targetProductType, targetColumnDescriptions, targetPrimaryKeys, - targetSchemaName, targetTableName, properties.getTarget().getCreateTableAutoIncrement()); + targetProductType, + targetColumnDescriptions.stream() + .filter(column -> StringUtils.hasLength(column.getFieldName())) + .collect(Collectors.toList()), + targetPrimaryKeys, + targetSchemaName, + targetTableName, + properties.getTarget().getCreateTableAutoIncrement() + ); JdbcTemplate targetJdbcTemplate = new JdbcTemplate(targetDataSource); targetJdbcTemplate.execute(sqlCreateTable); @@ -227,8 +240,26 @@ public class MigrationHandler implements Supplier { private Long doFullCoverSynchronize(IDatabaseWriter writer) { final int BATCH_SIZE = fetchSize; + List sourceFields = sourceColumnDescriptions.stream() + .map(ColumnDescription::getFieldName) + .collect(Collectors.toList()); + List targetFields = targetColumnDescriptions.stream() + .map(ColumnDescription::getFieldName) + .collect(Collectors.toList()); + List deletedFieldIndexes = new ArrayList<>(); + for (int i = 0; i < targetFields.size(); ++i) { + if (StringUtils.isEmpty(targetFields.get(i))) { + deletedFieldIndexes.add(i); + } + } + Collections.reverse(deletedFieldIndexes); + deletedFieldIndexes.forEach(i -> { + sourceFields.remove(sourceFields.get(i)); + targetFields.remove(targetFields.get(i)); + }); + // 准备目的端的数据写入操作 - writer.prepareWrite(targetSchemaName, targetTableName); + writer.prepareWrite(targetSchemaName, targetTableName, targetFields); // 清空目的端表的数据 IDatabaseOperator targetOperator = DatabaseOperatorFactory @@ -240,14 +271,9 @@ public class MigrationHandler implements Supplier { .createDatabaseOperator(sourceDataSource); sourceOperator.setFetchSize(BATCH_SIZE); - List sourceFields = sourceColumnDescriptions.stream() - .map(ColumnDescription::getFieldName) - .collect(Collectors.toList()); - List targetFields = targetColumnDescriptions.stream() - .map(ColumnDescription::getFieldName) - .collect(Collectors.toList()); StatementResultSet srs = sourceOperator.queryTableData( - sourceSchemaName, sourceTableName, sourceFields); + sourceSchemaName, sourceTableName, sourceFields + ); List cache = new LinkedList<>(); long cacheBytes = 0; @@ -312,7 +338,17 @@ public class MigrationHandler implements Supplier { List targetFields = targetColumnDescriptions.stream() .map(ColumnDescription::getFieldName) .collect(Collectors.toList()); - + List deletedFieldIndexes = new ArrayList<>(); + for (int i = 0; i < targetFields.size(); ++i) { + if (StringUtils.isEmpty(targetFields.get(i))) { + deletedFieldIndexes.add(i); + } + } + Collections.reverse(deletedFieldIndexes); + deletedFieldIndexes.forEach(i -> { + sourceFields.remove(sourceFields.get(i)); + targetFields.remove(targetFields.get(i)); + }); Map columnNameMaps = new HashMap<>(); for (int i = 0; i < sourceFields.size(); ++i) { columnNameMaps.put(sourceFields.get(i), targetFields.get(i)); diff --git a/dbswitch-dbchange/pom.xml b/dbswitch-dbchange/pom.xml index 81b06970..5e32307b 100644 --- a/dbswitch-dbchange/pom.xml +++ b/dbswitch-dbchange/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-dbchange diff --git a/dbswitch-dbcommon/pom.xml b/dbswitch-dbcommon/pom.xml index b3500df3..4abe143f 100644 --- a/dbswitch-dbcommon/pom.xml +++ b/dbswitch-dbcommon/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-dbcommon diff --git a/dbswitch-dbsynch/pom.xml b/dbswitch-dbsynch/pom.xml index 8f29acc6..8da778dc 100644 --- a/dbswitch-dbsynch/pom.xml +++ b/dbswitch-dbsynch/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-dbsynch diff --git a/dbswitch-dbwriter/pom.xml b/dbswitch-dbwriter/pom.xml index e05a409c..698e5ef1 100644 --- a/dbswitch-dbwriter/pom.xml +++ b/dbswitch-dbwriter/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-dbwriter diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/AbstractDatabaseWriter.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/AbstractDatabaseWriter.java index 9570026e..f867f332 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/AbstractDatabaseWriter.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/AbstractDatabaseWriter.java @@ -28,6 +28,7 @@ import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.util.CollectionUtils; /** * 数据库写入抽象基类 @@ -57,8 +58,8 @@ public abstract class AbstractDatabaseWriter implements IDatabaseWriter { } @Override - public void prepareWrite(String schemaName, String tableName) { - String sql = this.selectTableMetaDataSqlString(schemaName, tableName); + public void prepareWrite(String schemaName, String tableName, List fieldNames) { + String sql = this.selectTableMetaDataSqlString(schemaName, tableName, fieldNames); Map columnMetaData = new HashMap<>(); jdbcTemplate.execute((Connection conn) -> { try (Statement stmt = conn.createStatement(); @@ -85,8 +86,14 @@ public abstract class AbstractDatabaseWriter implements IDatabaseWriter { } - protected String selectTableMetaDataSqlString(String schemaName, String tableName) { - return String.format("SELECT * FROM \"%s\".\"%s\" WHERE 1=2", schemaName, tableName); + protected String selectTableMetaDataSqlString(String schemaName, String tableName, + List fieldNames) { + if (CollectionUtils.isEmpty(fieldNames)) { + return String.format("SELECT * FROM \"%s\".\"%s\" WHERE 1=2", schemaName, tableName); + } else { + return String.format("SELECT \"%s\" FROM \"%s\".\"%s\" WHERE 1=2", + StringUtils.join(fieldNames, "\",\""), schemaName, tableName); + } } protected abstract String getDatabaseProductName(); diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/IDatabaseWriter.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/IDatabaseWriter.java index f20a47dd..b375cb6a 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/IDatabaseWriter.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/IDatabaseWriter.java @@ -32,7 +32,7 @@ public interface IDatabaseWriter { * @param schemaName schema名称 * @param tableName table名称 */ - void prepareWrite(String schemaName, String tableName); + void prepareWrite(String schemaName, String tableName,List fieldNames); /** * 批量数据写入 diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mssql/SqlServerWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mssql/SqlServerWriterImpl.java index 45f1e42b..d0c4bb72 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mssql/SqlServerWriterImpl.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mssql/SqlServerWriterImpl.java @@ -24,6 +24,7 @@ import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.util.CollectionUtils; /** * SQLServer批量写入实现类 @@ -43,8 +44,14 @@ public class SqlServerWriterImpl extends AbstractDatabaseWriter implements IData } @Override - protected String selectTableMetaDataSqlString(String schemaName, String tableName) { - return String.format("SELECT * FROM [%s].[%s] WHERE 1=2", schemaName, tableName); + protected String selectTableMetaDataSqlString(String schemaName, String tableName, + List fieldNames) { + if (CollectionUtils.isEmpty(fieldNames)) { + return String.format("SELECT * FROM [%s].[%s] WHERE 1=2", schemaName, tableName); + } else { + return String.format("SELECT [%s] FROM [%s].[%s] WHERE 1=2", + StringUtils.join(fieldNames, "],["), schemaName, tableName); + } } @Override diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mysql/MySqlWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mysql/MySqlWriterImpl.java index d823d7b5..e26aa763 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mysql/MySqlWriterImpl.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/mysql/MySqlWriterImpl.java @@ -32,6 +32,7 @@ import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.CollectionUtils; /** * MySQL数据库写入实现类 @@ -58,8 +59,14 @@ public class MySqlWriterImpl extends AbstractDatabaseWriter implements IDatabase } @Override - protected String selectTableMetaDataSqlString(String schemaName, String tableName) { - return String.format("SELECT * FROM `%s`.`%s` WHERE 1=2", schemaName, tableName); + protected String selectTableMetaDataSqlString(String schemaName, String tableName, + List fieldNames) { + if (CollectionUtils.isEmpty(fieldNames)) { + return String.format("SELECT * FROM `%s`.`%s` WHERE 1=2", schemaName, tableName); + } else { + return String.format("SELECT `%s` FROM `%s`.`%s` WHERE 1=2", + StringUtils.join(fieldNames, "`,`"), schemaName, tableName); + } } @Override diff --git a/dbswitch-pgwriter/pom.xml b/dbswitch-pgwriter/pom.xml index 34ee867f..ed757fbb 100644 --- a/dbswitch-pgwriter/pom.xml +++ b/dbswitch-pgwriter/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-pgwriter diff --git a/dbswitch-sql/pom.xml b/dbswitch-sql/pom.xml index 39fced8d..8bcb01fe 100644 --- a/dbswitch-sql/pom.xml +++ b/dbswitch-sql/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 dbswitch-sql diff --git a/package-tool/pom.xml b/package-tool/pom.xml index 9394977f..8cffc3b5 100644 --- a/package-tool/pom.xml +++ b/package-tool/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 package-tool diff --git a/pom.xml b/pom.xml index 6668ac80..49cd9942 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.gitee.dbswitch dbswitch-parent - 1.6.8 + 1.6.9 pom dbswitch database switch project diff --git a/version.cmd b/version.cmd index 5f3caeba..b3c276e8 100644 --- a/version.cmd +++ b/version.cmd @@ -1,6 +1,6 @@ @echo off -set APP_VERSION=1.6.8 +set APP_VERSION=1.6.9 echo "Clean Project ..." call mvn clean -f pom.xml