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