瀏覽代碼

Merge pull request #1228 from rewerma/master

rdb 关键字转译符过滤 fixed  #1224
rewerma 6 年之前
父節點
當前提交
5fe7ae1613

+ 0 - 5
client-adapter/common/pom.xml

@@ -26,11 +26,6 @@
             <artifactId>druid</artifactId>
             <version>1.1.9</version>
         </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>5.1.40</version>
-        </dependency>
     </dependencies>
 
 </project>

+ 19 - 0
client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/Util.java

@@ -117,4 +117,23 @@ public class Util {
 
         return file;
     }
+
+    public static String cleanColumn(String column) {
+        if (column == null) {
+            return null;
+        }
+        if (column.contains("`")) {
+            column = column.replaceAll("`", "");
+        }
+
+        if (column.contains("'")) {
+            column = column.replaceAll("'", "");
+        }
+
+        if (column.contains("\"")) {
+            column = column.replaceAll("\"", "");
+        }
+
+        return column;
+    }
 }

+ 5 - 0
client-adapter/launcher/pom.xml

@@ -72,6 +72,11 @@
         </dependency>
 
         <!-- jdbc -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.40</version>
+        </dependency>
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>

+ 6 - 0
client-adapter/rdb/pom.xml

@@ -25,6 +25,12 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.40</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>

+ 10 - 7
client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbSyncService.java

@@ -78,6 +78,9 @@ public class RdbSyncService {
                 Map<String, MappingConfig> configMap = mappingConfigCache
                     .get(destination + "." + database + "." + table);
 
+                if (configMap == null) {
+                    continue;
+                }
                 for (MappingConfig config : configMap.values()) {
 
                     if (config.getConcurrent()) {
@@ -177,13 +180,13 @@ public class RdbSyncService {
 
             List<Map<String, ?>> values = new ArrayList<>();
             for (Map.Entry<String, String> entry : columnsMap.entrySet()) {
-                String targetClolumnName = entry.getKey();
+                String targetColumnName = entry.getKey();
                 String srcColumnName = entry.getValue();
                 if (srcColumnName == null) {
-                    srcColumnName = targetClolumnName;
+                    srcColumnName = Util.cleanColumn(targetColumnName);
                 }
 
-                Integer type = ctype.get(targetClolumnName.toLowerCase());
+                Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase());
 
                 Object value = data.get(srcColumnName);
 
@@ -238,7 +241,7 @@ public class RdbSyncService {
 
                     for (String targetColumnName : targetColumnNames) {
                         updateSql.append(targetColumnName).append("=?, ");
-                        Integer type = ctype.get(targetColumnName.toLowerCase());
+                        Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase());
                         BatchExecutor.setValue(values, type, data.get(srcColumnName));
                     }
                 }
@@ -344,10 +347,10 @@ public class RdbSyncService {
             String targetColumnName = entry.getKey();
             String srcColumnName = entry.getValue();
             if (srcColumnName == null) {
-                srcColumnName = targetColumnName;
+                srcColumnName = Util.cleanColumn(targetColumnName);
             }
             sql.append(targetColumnName).append("=? AND ");
-            Integer type = ctype.get(targetColumnName.toLowerCase());
+            Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase());
             // 如果有修改主键的情况
             if (o != null && o.containsKey(srcColumnName)) {
                 BatchExecutor.setValue(values, type, o.get(srcColumnName));
@@ -384,7 +387,7 @@ public class RdbSyncService {
             String targetColumnName = entry.getKey();
             String srcColumnName = entry.getValue();
             if (srcColumnName == null) {
-                srcColumnName = targetColumnName;
+                srcColumnName = Util.cleanColumn(targetColumnName);
             }
             Object value;
             if (o != null && o.containsKey(srcColumnName)) {

+ 5 - 1
client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/support/SyncUtil.java

@@ -74,6 +74,8 @@ public class SyncUtil {
             case Types.LONGVARCHAR:
                 if (value instanceof String) {
                     pstmt.setString(i, (String) value);
+                } else if (value == null) {
+                    pstmt.setNull(i, type);
                 } else {
                     pstmt.setString(i, value.toString());
                 }
@@ -140,8 +142,10 @@ public class SyncUtil {
                     pstmt.setBigDecimal(i, new BigDecimal((float) value));
                 } else if (value instanceof Double) {
                     pstmt.setBigDecimal(i, new BigDecimal((double) value));
-                } else {
+                } else if (value != null) {
                     pstmt.setBigDecimal(i, new BigDecimal(value.toString()));
+                } else {
+                    pstmt.setNull(i, type);
                 }
                 break;
             case Types.REAL: