From 97112d80217fb6d1dd6afb4ff273664f42d1b408 Mon Sep 17 00:00:00 2001 From: chunlin <3049478157@qq.com> Date: Tue, 10 Jun 2025 10:09:11 +0800 Subject: [PATCH 1/2] feat: sqlserver 2 oracle delete --- .../SQLServerToOracleDeleteTransform.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/SQLServerToOracleDeleteTransform.java diff --git a/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/SQLServerToOracleDeleteTransform.java b/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/SQLServerToOracleDeleteTransform.java new file mode 100644 index 0000000..14c872a --- /dev/null +++ b/data-transform/src/main/java/com/clougence/cloudcanal/dataprocess/datatransform/SQLServerToOracleDeleteTransform.java @@ -0,0 +1,108 @@ +package com.clougence.cloudcanal.dataprocess.datatransform; + +import com.clougence.cloudcanal.sdk.api.CloudCanalProcessorV2; +import com.clougence.cloudcanal.sdk.api.ProcessorContext; +import com.clougence.cloudcanal.sdk.api.modelv2.*; +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * @author chunlin create time is 2025/6/3 + */ +public class SQLServerToOracleDeleteTransform implements CloudCanalProcessorV2 { + + private Map> tableCols = new HashMap<>(); + + private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); + private final static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private final static DateTimeFormatter tf = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"); + private final static DateTimeFormatter dtfz = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSZZZZZ"); + + @Override + public void start(ProcessorContext processorContext) { + // src TimeZone + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + + tableCols.put(new SchemaInfo("Test", "dbo", "timetest"), + new HashSet<>(Arrays.asList("d", "dto", "dt2", "smdt", "dt", "t"))); + } + + @Override + public List process(CustomData customData) { + List result = new ArrayList<>(); + + if (customData.getEventType() == EventTypeInSdk.DELETE) { + SchemaInfo schemaInfo = customData.getSchemaInfo(); + Set columns = tableCols.get(schemaInfo); + if (columns == null) { + return Collections.singletonList(customData); + } + List newRecords = new ArrayList<>(); + for (CustomRecordV2 record : customData.getRecords()) { + LinkedHashMap beforeColumnMap = record.getBeforeColumnMap(); + LinkedHashMap afterColumnMap = new LinkedHashMap<>(); + for (String column : beforeColumnMap.keySet()) { + CustomFieldV2 field = beforeColumnMap.get(column); + if (field == null) { + continue; + } + CustomFieldV2 afterField = new CustomFieldV2(); + afterField.setUpdated(false); + afterField.setValue(field.getValue()); + afterField.setFieldName(field.getFieldName()); + afterField.setDbType(field.getDbType()); + afterField.setSqlType(field.getSqlType()); + afterField.setKey(field.isKey()); + afterField.setNull(field.isNull()); + afterColumnMap.put(column, afterField); + + if (!columns.contains(column)) { + continue; + } + String dbType = field.getDbType(); + if (StringUtils.isBlank(dbType)) { + continue; + } + LocalDateTime nowDateTime = LocalDateTime.now(); + if ("DATETIME".equals(dbType) || "DATETIME2".equals(dbType) || "SMALLDATETIME".equals(dbType)) { + afterField.setValue(nowDateTime.format(dtf)); + afterField.setUpdated(true); + } else if ("DATE".equals(dbType)) { + afterField.setValue(nowDateTime.format(df)); + afterField.setUpdated(true); + } else if ("TIME".equals(dbType)) { + afterField.setValue(nowDateTime.format(tf)); + afterField.setUpdated(true); + } else if ("DATETIMEOFFSET".equals(dbType)) { + afterField.setValue(ZonedDateTime.now().format(dtfz)); + afterField.setUpdated(true); + } else { + afterField.setValue(field.getValue()); + afterField.setUpdated(true); + } + } + + CustomRecordV2 newRecord = new CustomRecordV2(); + newRecord.setBeforeColumnMap(beforeColumnMap); + newRecord.setAfterColumnMap(afterColumnMap); + newRecord.setBeforeKeyColumnMap(record.getBeforeKeyColumnMap()); + newRecord.setAfterKeyColumnMap(record.getAfterKeyColumnMap()); + newRecords.add(newRecord); + } + CustomData newData = new CustomData(schemaInfo, EventTypeInSdk.UPDATE, newRecords); + result.add(newData); + } else { + result.add(customData); + } + return result; + } + + @Override + public void stop() { + + } +} -- Gitee From 79abf63a60e4a2a0410b4cba09aec36c31719b90 Mon Sep 17 00:00:00 2001 From: chunlin <3049478157@qq.com> Date: Tue, 10 Jun 2025 10:12:26 +0800 Subject: [PATCH 2/2] feat: sqlserver 2 oracle delete --- .../src/main/resources/META-INF/cloudcanal/plugin.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-transform/src/main/resources/META-INF/cloudcanal/plugin.properties b/data-transform/src/main/resources/META-INF/cloudcanal/plugin.properties index 06d37f6..8f5c504 100644 --- a/data-transform/src/main/resources/META-INF/cloudcanal/plugin.properties +++ b/data-transform/src/main/resources/META-INF/cloudcanal/plugin.properties @@ -1 +1 @@ -loadClassName=com.clougence.cloudcanal.dataprocess.datatransform.MySqlSrcAddExtraColumn \ No newline at end of file +loadClassName=com.clougence.cloudcanal.dataprocess.datatransform.SQLServerToOracleDeleteTransform -- Gitee