ソースを参照

过滤条件支持sqlserver系统函数

Signed-off-by: AE86 <836391306@qq.com>
AE86 1 年間 前
コミット
bd7956166e

+ 10 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/OracleConnector.java

@@ -15,11 +15,18 @@ import org.slf4j.LoggerFactory;
 
 import java.sql.Types;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public final class OracleConnector extends AbstractDatabaseConnector {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
+    /**
+     * 系统函数表达式to_char/to_date/to_timestamp/to_number
+     */
+    private final String SYS_EXPRESSION = "(to_char\\().+?(\\))|(to_date\\().+?(\\))|(to_timestamp\\().+?(\\))|(to_number\\().+?(\\))";
+
     public OracleConnector() {
         VALUE_MAPPERS.put(Types.OTHER, new OracleOtherValueMapper());
     }
@@ -96,9 +103,10 @@ public final class OracleConnector extends AbstractDatabaseConnector {
     @Override
     protected String buildSqlFilterWithQuotation(String value) {
         if (StringUtil.isNotBlank(value)) {
-            // 支持Oracle系统函数(to_char/to_date/to_timestamp/to_number)
             String val = value.toLowerCase();
-            if (StringUtil.startsWith(val, "to_") && StringUtil.endsWith(val, ")")) {
+            // 支持Oracle系统函数, Example: to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS')
+            Matcher matcher = Pattern.compile(SYS_EXPRESSION).matcher(val);
+            if (matcher.find()) {
                 return StringUtil.EMPTY;
             }
         }

+ 10 - 3
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java

@@ -11,10 +11,11 @@ import org.dbsyncer.connector.database.DatabaseConnectorMapper;
 import org.dbsyncer.connector.enums.TableTypeEnum;
 import org.dbsyncer.connector.model.PageSql;
 import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.connector.util.PrimaryKeyUtil;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public final class SqlServerConnector extends AbstractDatabaseConnector {
@@ -23,6 +24,11 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
 
     private static final String QUERY_TABLE = "select name from sys.tables where schema_id = schema_id('%s') and is_ms_shipped = 0";
 
+    /**
+     * 系统函数表达式convert/varchar/getdate
+     */
+    private final String SYS_EXPRESSION = "(convert\\().+?(\\))|(varchar\\().+?(\\))|(getdate\\(\\))";
+
     @Override
     public List<Table> getTable(DatabaseConnectorMapper connectorMapper) {
         DatabaseConfig config = connectorMapper.getConfig();
@@ -48,9 +54,10 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
     @Override
     protected String buildSqlFilterWithQuotation(String value) {
         if (StringUtil.isNotBlank(value)) {
-            // 支持SqlServer系统函数(convert/varchar/getdate)
             String val = value.toLowerCase();
-            if (StringUtil.contains(val, "convert") || StringUtil.contains(val, "varchar") || StringUtil.contains(val, "getdate")) {
+            // 支持SqlServer系统函数, Example: (select CONVERT(varchar(10),GETDATE(),120))
+            Matcher matcher = Pattern.compile(SYS_EXPRESSION).matcher(val);
+            if (matcher.find()) {
                 return StringUtil.EMPTY;
             }
         }