Bläddra i källkod

!138 merge
Merge pull request !138 from AE86/V_1.0.0_RC

AE86 1 år sedan
förälder
incheckning
8c2f2f59ac

+ 10 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Database.java

@@ -2,6 +2,7 @@ package org.dbsyncer.connector.database;
 
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.ReaderConfig;
+import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.PageSql;
 
 public interface Database {
@@ -42,4 +43,13 @@ public interface Database {
         throw new ConnectorException("Unsupported override method getPageCursorArgs:" + getClass().getName());
     }
 
+    /**
+     * 获取字段名称(可重写实现系统关键字,函数名处理)
+     *
+     * @param field
+     * @return
+     */
+    default String buildFieldName(Field field){
+        return field.getName();
+    }
 }

+ 4 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQuery.java

@@ -30,6 +30,7 @@ public class SqlBuilderQuery extends AbstractSqlBuilder {
         List<Field> fields = config.getFields();
         String quotation = config.getQuotation();
         String queryFilter = config.getQueryFilter();
+        Database database = config.getDatabase();
 
         StringBuilder sql = new StringBuilder();
         int size = fields.size();
@@ -40,7 +41,9 @@ public class SqlBuilderQuery extends AbstractSqlBuilder {
             if (field.isUnmodifiabled()) {
                 sql.append(field.getName());
             } else {
-                sql.append(quotation).append(field.getName()).append(quotation);
+                sql.append(quotation);
+                sql.append(database.buildFieldName(field));
+                sql.append(quotation);
             }
 
             // "USERNAME" as "myName"

+ 7 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/VarBinaryValueMapper.java

@@ -4,6 +4,7 @@ import org.dbsyncer.common.spi.ConnectorMapper;
 import org.dbsyncer.connector.AbstractValueMapper;
 import org.dbsyncer.connector.ConnectorException;
 
+import java.nio.ByteBuffer;
 import java.util.BitSet;
 
 /**
@@ -24,6 +25,12 @@ public class VarBinaryValueMapper extends AbstractValueMapper<byte[]> {
             BitSet bitSet = (BitSet) val;
             return toByteArray(bitSet);
         }
+        if (val instanceof Boolean) {
+            Boolean b = (Boolean) val;
+            ByteBuffer buffer = ByteBuffer.allocate(2);
+            buffer.putShort((short) (b ? 1 : 0));
+            return buffer.array();
+        }
         throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));
     }
 

+ 33 - 7
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java

@@ -9,6 +9,7 @@ import org.dbsyncer.connector.constant.DatabaseConstant;
 import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 import org.dbsyncer.connector.database.DatabaseConnectorMapper;
 import org.dbsyncer.connector.enums.TableTypeEnum;
+import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.PageSql;
 import org.dbsyncer.connector.model.Table;
 
@@ -29,6 +30,11 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
      */
     private final String SYS_EXPRESSION = "(convert\\().+?(\\))|(varchar\\().+?(\\))|(getdate\\(\\))";
 
+    /**
+     * 系统关键字段名
+     */
+    private final String SYS_FIELD_EXPRESSION = "(convert)";
+
     @Override
     public List<Table> getTable(DatabaseConnectorMapper connectorMapper) {
         DatabaseConfig config = connectorMapper.getConfig();
@@ -51,15 +57,20 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
         return new Object[]{(pageIndex - 1) * pageSize + 1, pageIndex * pageSize};
     }
 
+    @Override
+    public String buildFieldName(Field field) {
+        // 处理系统关键字
+        if (containsKeyword(SYS_FIELD_EXPRESSION, field.getName())) {
+            return new StringBuilder("[").append(field.getName()).append("]").toString();
+        }
+        return field.getName();
+    }
+
     @Override
     protected String buildSqlFilterWithQuotation(String value) {
-        if (StringUtil.isNotBlank(value)) {
-            String val = value.toLowerCase();
-            // 支持SqlServer系统函数, Example: (select CONVERT(varchar(10),GETDATE(),120))
-            Matcher matcher = Pattern.compile(SYS_EXPRESSION).matcher(val);
-            if (matcher.find()) {
-                return StringUtil.EMPTY;
-            }
+        // 支持SqlServer系统函数, Example: (select CONVERT(varchar(10),GETDATE(),120))
+        if (containsKeyword(SYS_EXPRESSION, value)) {
+            return StringUtil.EMPTY;
         }
         return super.buildSqlFilterWithQuotation(value);
     }
@@ -84,4 +95,19 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
         }
         return new ArrayList<>();
     }
+
+    /**
+     * 是否包含系统关键字
+     *
+     * @param regex
+     * @param val
+     * @return
+     */
+    private boolean containsKeyword(String regex, String val) {
+        if (StringUtil.isNotBlank(val)) {
+            Matcher matcher = Pattern.compile(regex).matcher(val.toLowerCase());
+            return matcher.find();
+        }
+        return false;
+    }
 }