From 577296b67ad39b603a59b01223d0b3ed6b78b96e Mon Sep 17 00:00:00 2001 From: erilong Date: Wed, 24 Mar 2010 13:29:14 +0000 Subject: [PATCH] allow postgres users to enable or disable savepoints --- .../org/jumpmind/symmetric/common/ParameterConstants.java | 1 + .../java/org/jumpmind/symmetric/load/csv/CsvLoader.java | 7 ++++++- symmetric/src/main/resources/symmetric-default.properties | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/symmetric/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java b/symmetric/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java index d439157d48..709e39ea5b 100644 --- a/symmetric/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java +++ b/symmetric/src/main/java/org/jumpmind/symmetric/common/ParameterConstants.java @@ -79,6 +79,7 @@ private ParameterConstants() { public final static String DATA_LOADER_TIME_BETWEEN_ACK_RETRIES = "time.between.ack.retries.ms"; public final static String DATA_LOADER_NO_KEYS_IN_UPDATE = "dont.include.keys.in.update.statement"; public final static String DATA_LOADER_ENABLE_FALLBACK_UPDATE = "dataloader.enable.fallback.update"; + public final static String DATA_LOADER_ENABLE_FALLBACK_SAVEPOINT = "dataloader.enable.fallback.savepoint"; public final static String DATA_LOADER_ENABLE_FALLBACK_INSERT = "dataloader.enable.fallback.insert"; public final static String DATA_LOADER_ALLOW_MISSING_DELETE = "dataloader.allow.missing.delete"; public final static String DATA_LOADER_MAX_ROWS_BEFORE_COMMIT = "dataloader.max.rows.before.commit"; diff --git a/symmetric/src/main/java/org/jumpmind/symmetric/load/csv/CsvLoader.java b/symmetric/src/main/java/org/jumpmind/symmetric/load/csv/CsvLoader.java index ba0f58d3f7..198407b243 100644 --- a/symmetric/src/main/java/org/jumpmind/symmetric/load/csv/CsvLoader.java +++ b/symmetric/src/main/java/org/jumpmind/symmetric/load/csv/CsvLoader.java @@ -257,10 +257,14 @@ protected int insert(String[] tokens) { if (continueToLoad) { boolean enableFallbackUpdate = parameterService.is(ParameterConstants.DATA_LOADER_ENABLE_FALLBACK_UPDATE); + boolean enableFallbackSavepoint = parameterService.is(ParameterConstants.DATA_LOADER_ENABLE_FALLBACK_SAVEPOINT); + Object savepoint = null; try { stats.startTimer(); if (enableFallbackUpdate && dbDialect.requiresSavepointForFallback()) { - if (context.getTableTemplate().count(context, parseKeys(tokens, 1)) > 0) { + if (enableFallbackSavepoint) { + savepoint = dbDialect.createSavepointForFallback(); + } else if (context.getTableTemplate().count(context, parseKeys(tokens, 1)) > 0) { throw new DataIntegrityViolationException("Row already exists"); } } @@ -269,6 +273,7 @@ protected int insert(String[] tokens) { // TODO: modify sql-error-codes.xml for unique constraint vs // foreign key if (enableFallbackUpdate) { + dbDialect.rollbackToSavepoint(savepoint); if (log.isDebugEnabled()) { log.debug("LoaderInsertingFailedUpdating", context.getTableName(), ArrayUtils.toString(tokens)); } diff --git a/symmetric/src/main/resources/symmetric-default.properties b/symmetric/src/main/resources/symmetric-default.properties index 48f3acfb0d..daba4e215b 100644 --- a/symmetric/src/main/resources/symmetric-default.properties +++ b/symmetric/src/main/resources/symmetric-default.properties @@ -263,6 +263,12 @@ dataextractor.old.data.enable=true # This property can be overridden in the database dataloader.enable.fallback.update=true +# For dialects that roll back on integrity errors, enabled the use of savepoints +# before inserts, otherwise it will try to select the row by primary key. +# +# This property can be overridden in the database +dataloader.enable.fallback.savepoint=true + # Turn on/off fallback to insert statements after a failed # update #