From 73111ca0ce90ce2bf3dcd6139f643fd94afd307f Mon Sep 17 00:00:00 2001 From: chenson42 Date: Tue, 10 Feb 2015 14:21:59 +0000 Subject: [PATCH] 0002186: DB2 iSeries - Change the sym_data row_data storage to CLOB to support longer row data --- .../db/db2/Db2As400TriggerTemplate.java | 44 +++++++++++++++++++ .../db/platform/db2/Db2As400DdlBuilder.java | 30 ++----------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/db2/Db2As400TriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/db2/Db2As400TriggerTemplate.java index e4ee4db215..46b08cdaf1 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/db2/Db2As400TriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/db2/Db2As400TriggerTemplate.java @@ -6,6 +6,28 @@ public class Db2As400TriggerTemplate extends Db2TriggerTemplate { public Db2As400TriggerTemplate(ISymmetricDialect symmetricDialect) { super(symmetricDialect); + + clobColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace(cast($(tableAlias).\"$(columnName)\" as CLOB),'\\','\\\\'),'\"','\\\"') || '\"' end" ; + + sqlTemplates.put("insertTriggerTemplate" , +"CREATE TRIGGER $(schemaName)$(triggerName) " + +" AFTER INSERT ON $(schemaName)$(tableName) " + +" REFERENCING NEW AS NEW " + +" FOR EACH ROW MODE DB2SQL " + +" BEGIN ATOMIC " + +" IF $(syncOnInsertCondition) and $(syncOnIncomingBatchCondition) then " + +" INSERT into $(defaultSchema)$(prefixName)_data " + +" (table_name, event_type, trigger_hist_id, row_data, channel_id, transaction_id, source_node_id, external_data, create_time) " + +" VALUES('$(targetTableName)', 'I', $(triggerHistoryId), " + +" $(columns), " + +" $(channelExpression), $(txIdExpression), $(sourceNodeExpression), " + +" $(externalSelect), " + +" CURRENT_TIMESTAMP); " + +" END IF; " + +" $(custom_on_insert_text) " + +" END " ); + + sqlTemplates.put("updateTriggerTemplate" , "CREATE TRIGGER $(schemaName)$(triggerName) \n"+ " AFTER UPDATE ON $(schemaName)$(tableName) \n"+ @@ -27,6 +49,28 @@ public Db2As400TriggerTemplate(ISymmetricDialect symmetricDialect) { " END IF; \n"+ " $(custom_on_update_text) \n"+ " END " ); + + sqlTemplates.put("deleteTriggerTemplate" , +"CREATE TRIGGER $(schemaName)$(triggerName) " + +" AFTER DELETE ON $(schemaName)$(tableName) " + +" REFERENCING OLD AS OLD " + +" FOR EACH ROW MODE DB2SQL " + +" BEGIN ATOMIC " + +" IF $(syncOnDeleteCondition) and $(syncOnIncomingBatchCondition) then " + +" INSERT into $(defaultSchema)$(prefixName)_data " + +" (table_name, event_type, trigger_hist_id, pk_data, old_data, channel_id, transaction_id, source_node_id, external_data, create_time) " + +" VALUES ('$(targetTableName)', 'D', $(triggerHistoryId), " + +" $(oldKeys), " + +" $(oldColumns), " + +" $(channelExpression), " + +" $(txIdExpression), " + +" $(sourceNodeExpression), " + +" $(externalSelect), " + +" CURRENT_TIMESTAMP); " + +" END IF; " + +" $(custom_on_delete_text) " + +" END " ); + } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java index 06f67914a1..69c9510662 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/db2/Db2As400DdlBuilder.java @@ -20,11 +20,7 @@ */ import java.sql.Types; -import java.util.Collection; -import java.util.Iterator; -import org.jumpmind.db.alter.ColumnDataTypeChange; -import org.jumpmind.db.alter.TableChange; import org.jumpmind.db.model.Column; import org.jumpmind.db.model.TypeMap; import org.jumpmind.db.platform.DatabaseNamesConstants; @@ -33,28 +29,10 @@ public class Db2As400DdlBuilder extends Db2DdlBuilder { public Db2As400DdlBuilder() { this.databaseName = DatabaseNamesConstants.DB2AS400; - databaseInfo.addNativeTypeMapping(Types.LONGVARCHAR, "LONG VARCHAR", Types.VARCHAR); + databaseInfo.addNativeTypeMapping(Types.LONGVARCHAR, "CLOB", Types.CLOB); databaseInfo.setRequiresAutoCommitForDdl(true); } - @Override - protected void filterChanges(Collection changes) { - super.filterChanges(changes); - Iterator i = changes.iterator(); - while (i.hasNext()) { - TableChange tableChange = i.next(); - if (tableChange instanceof ColumnDataTypeChange) { - ColumnDataTypeChange change = (ColumnDataTypeChange)tableChange; - if (change.getNewTypeCode() == Types.LONGVARCHAR && - change.getChangedColumn().getJdbcTypeCode() == Types.VARCHAR) { - log.debug("Not processing the detect type change to LONGVARCHAR because " - + "a create of a long varchar results in a variable length VARCHAR field"); - i.remove(); - } - } - } - } - @Override protected void writeCastExpression(Column sourceColumn, Column targetColumn, StringBuilder ddl) { String sourceNativeType = getBareNativeType(sourceColumn); @@ -64,10 +42,10 @@ protected void writeCastExpression(Column sourceColumn, Column targetColumn, Str printIdentifier(getColumnName(sourceColumn), ddl); } else { String type = getSqlType(targetColumn); - if ("LONG VARCHAR".equals(type)) { - type = "VARCHAR"; - } + /** + * iSeries needs size in cast + */ if ("VARCHAR".equals(type)) { type = type + "(" + sourceColumn.getSizeAsInt() + ")"; }