diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftSymmetricDialect.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftSymmetricDialect.java
index c5ac596692..ca0d548dda 100644
--- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftSymmetricDialect.java
+++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftSymmetricDialect.java
@@ -33,6 +33,7 @@ public class RedshiftSymmetricDialect extends AbstractSymmetricDialect implement
public RedshiftSymmetricDialect(IParameterService parameterService, IDatabasePlatform platform) {
super(parameterService, platform);
+ triggerTemplate = new RedshiftTriggerTemplate(this);
}
@Override
diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftTriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftTriggerTemplate.java
new file mode 100644
index 0000000000..0c6c0aabee
--- /dev/null
+++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/redshift/RedshiftTriggerTemplate.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to JumpMind Inc under one or more contributor
+ * license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding
+ * copyright ownership. JumpMind Inc licenses this file
+ * to you under the GNU General Public License, version 3.0 (GPLv3)
+ * (the "License"); you may not use this file except in compliance
+ * with the License.
+ *
+ * You should have received a copy of the GNU General Public License,
+ * version 3.0 (GPLv3) along with this library; if not, see
+ * .
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jumpmind.symmetric.db.redshift;
+
+import java.util.HashMap;
+
+import org.jumpmind.symmetric.db.AbstractTriggerTemplate;
+import org.jumpmind.symmetric.db.ISymmetricDialect;
+
+public class RedshiftTriggerTemplate extends AbstractTriggerTemplate {
+
+ protected RedshiftTriggerTemplate(ISymmetricDialect symmetricDialect) {
+ super(symmetricDialect);
+
+ emptyColumnTemplate = "''";
+ stringColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || replace(replace($(tableAlias).\"$(columnName)\",$$\\$$,$$\\\\$$),'\"',$$\\\"$$) || '\"' end";
+ numberColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || cast($(tableAlias).\"$(columnName)\" as varchar) || '\"' end";
+ datetimeColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' else '\"' || to_char($(tableAlias).\"$(columnName)\", 'YYYY-MM-DD HH24:MI:SS.MS') || '\"' end";
+ booleanColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then '' when $(tableAlias).\"$(columnName)\" then '\"1\"' else '\"0\"' end";
+ triggerConcatCharacter = "||";
+ newTriggerValue = "new";
+ oldTriggerValue = "old";
+ oldColumnPrefix = "";
+ newColumnPrefix = "";
+
+ sqlTemplates = new HashMap();
+ sqlTemplates.put("insertTriggerTemplate", "");
+ sqlTemplates.put("updateTriggerTemplate", "");
+ sqlTemplates.put("deleteTriggerTemplate", "");
+ sqlTemplates.put("initialLoadSqlTemplate", "select $(columns) from $(schemaName)$(tableName) t where $(whereClause)");
+ }
+
+}
diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ClusterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ClusterService.java
index 579df4e0bc..2d3067908a 100644
--- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ClusterService.java
+++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ClusterService.java
@@ -75,23 +75,21 @@ public ClusterService(IParameterService parameterService, ISymmetricDialect dial
public void init() {
sqlTemplate.update(getSql("initLockSql"), new Object[] { getServerId() });
- initLockTable(ROUTE);
- initLockTable(PULL);
- initLockTable(PUSH);
- initLockTable(HEARTBEAT);
- initLockTable(PURGE_INCOMING);
- initLockTable(PURGE_OUTGOING);
- initLockTable(PURGE_STATISTICS);
- initLockTable(SYNCTRIGGERS);
- initLockTable(PURGE_DATA_GAPS);
- initLockTable(STAGE_MANAGEMENT);
- initLockTable(WATCHDOG);
- initLockTable(STATISTICS);
- initLockTable(FILE_SYNC_PULL);
- initLockTable(FILE_SYNC_PUSH);
- initLockTable(FILE_SYNC_TRACKER);
- initLockTable(FILE_SYNC_SHARED, TYPE_SHARED);
- initLockTable(INITIAL_LOAD_EXTRACT);
+
+ Map allLocks = findLocks();
+ for (String action : new String[] { ROUTE, PULL, PUSH, HEARTBEAT, PURGE_INCOMING, PURGE_OUTGOING, PURGE_STATISTICS, SYNCTRIGGERS,
+ PURGE_DATA_GAPS, STAGE_MANAGEMENT, WATCHDOG, STATISTICS, FILE_SYNC_PULL, FILE_SYNC_PUSH, FILE_SYNC_TRACKER,
+ INITIAL_LOAD_EXTRACT }) {
+ if (allLocks.get(action) == null) {
+ initLockTable(action, TYPE_CLUSTER);
+ }
+ }
+
+ for (String action : new String[] { FILE_SYNC_SHARED }) {
+ if (allLocks.get(action) == null) {
+ initLockTable(action, TYPE_SHARED);
+ }
+ }
}
public void initLockTable(final String action) {
diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceService.java
index 4348089d45..49006a2c81 100644
--- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceService.java
+++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceService.java
@@ -48,16 +48,25 @@ public SequenceService(IParameterService parameterService, ISymmetricDialect sym
}
public void init() {
- initSequence(Constants.SEQUENCE_OUTGOING_BATCH_LOAD_ID, 1);
+ Map sequences = getAll();
+ if (sequences.get(Constants.SEQUENCE_OUTGOING_BATCH_LOAD_ID) == null) {
+ initSequence(Constants.SEQUENCE_OUTGOING_BATCH_LOAD_ID, 1);
+ }
- long maxBatchId = sqlTemplate.queryForLong(getSql("maxOutgoingBatchSql"));
- initSequence(Constants.SEQUENCE_OUTGOING_BATCH, maxBatchId);
+ if (sequences.get(Constants.SEQUENCE_OUTGOING_BATCH) == null) {
+ long maxBatchId = sqlTemplate.queryForLong(getSql("maxOutgoingBatchSql"));
+ initSequence(Constants.SEQUENCE_OUTGOING_BATCH, maxBatchId);
+ }
- long maxTriggerHistId = sqlTemplate.queryForLong(getSql("maxTriggerHistSql"));
- initSequence(Constants.SEQUENCE_TRIGGER_HIST, maxTriggerHistId);
+ if (sequences.get(Constants.SEQUENCE_TRIGGER_HIST) == null) {
+ long maxTriggerHistId = sqlTemplate.queryForLong(getSql("maxTriggerHistSql"));
+ initSequence(Constants.SEQUENCE_TRIGGER_HIST, maxTriggerHistId);
+ }
- long maxRequestId = sqlTemplate.queryForLong(getSql("maxExtractRequestSql"));
- initSequence(Constants.SEQUENCE_EXTRACT_REQ, maxRequestId);
+ if (sequences.get(Constants.SEQUENCE_EXTRACT_REQ) == null) {
+ long maxRequestId = sqlTemplate.queryForLong(getSql("maxExtractRequestSql"));
+ initSequence(Constants.SEQUENCE_EXTRACT_REQ, maxRequestId);
+ }
}
private void initSequence(String name, long initialValue) {
@@ -198,6 +207,15 @@ protected Sequence get(ISqlTransaction transaction, String name) {
}
}
+ protected Map getAll() {
+ Map map = new HashMap();
+ List sequences = sqlTemplate.query(getSql("getAllSequenceSql"), new SequenceRowMapper());
+ for (Sequence sequence : sequences) {
+ map.put(sequence.getSequenceName(), sequence);
+ }
+ return map;
+ }
+
class SequenceRowMapper implements ISqlRowMapper {
public Sequence mapRow(Row rs) {
Sequence sequence = new Sequence();
diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceServiceSqlMap.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceServiceSqlMap.java
index 8c93ba6d69..35bbb784b5 100644
--- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceServiceSqlMap.java
+++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/SequenceServiceSqlMap.java
@@ -33,7 +33,11 @@ public SequenceServiceSqlMap(IDatabasePlatform platform, Map rep
putSql("getSequenceSql",
"select sequence_name,current_value,increment_by,min_value,max_value, " +
"cycle,create_time,last_update_by,last_update_time from $(sequence) where sequence_name=?");
-
+
+ putSql("getAllSequenceSql",
+ "select sequence_name,current_value,increment_by,min_value,max_value," +
+ "cycle,create_time,last_update_by,last_update_time from $(sequence)");
+
putSql("getCurrentValueSql",
"select current_value from $(sequence) where sequence_name=?");
diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java
index b9443e8060..4f2ca773f8 100644
--- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java
+++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java
@@ -1047,8 +1047,7 @@ public void syncTriggers(boolean force) {
}
public void syncTriggers(StringBuilder sqlBuffer, boolean force) {
- if (platform.getDdlBuilder().getDatabaseInfo().isTriggersSupported() &&
- (parameterService.is(ParameterConstants.AUTO_SYNC_TRIGGERS) || isCalledFromSymmetricAdminTool())) {
+ if ((parameterService.is(ParameterConstants.AUTO_SYNC_TRIGGERS) || isCalledFromSymmetricAdminTool())) {
synchronized (this) {
if (clusterService.lock(ClusterConstants.SYNCTRIGGERS)) {
try {
@@ -1109,12 +1108,7 @@ public void syncTriggers(StringBuilder sqlBuffer, boolean force) {
}
}
} else {
- if (!platform.getDdlBuilder().getDatabaseInfo().isTriggersSupported()) {
- log.info("Not synchronizing triggers. Platform does not support triggers.");
- } else {
- log.info("Not synchronizing triggers. {} is set to false",
- ParameterConstants.AUTO_SYNC_TRIGGERS);
- }
+ log.info("Not synchronizing triggers. {} is set to false", ParameterConstants.AUTO_SYNC_TRIGGERS);
}
}
diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/redshift/RedshiftJdbcSqlTemplate.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/redshift/RedshiftJdbcSqlTemplate.java
index 2ea9eca261..910029f0bb 100644
--- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/redshift/RedshiftJdbcSqlTemplate.java
+++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/redshift/RedshiftJdbcSqlTemplate.java
@@ -40,4 +40,12 @@ protected boolean allowsNullForIdentityColumn() {
return false;
}
+ @Override
+ protected String getSelectLastInsertIdSql(String sequenceName) {
+ if (sequenceName.equals("sym_data_data_id")) {
+ return "select max(data_id) from sym_data";
+ }
+ throw new UnsupportedOperationException();
+ }
+
}