diff --git a/citydb-cli/src/main/java/org/citydb/cli/deleter/DeleteCommand.java b/citydb-cli/src/main/java/org/citydb/cli/deleter/DeleteCommand.java index 1d1cf701..f7cae5ed 100644 --- a/citydb-cli/src/main/java/org/citydb/cli/deleter/DeleteCommand.java +++ b/citydb-cli/src/main/java/org/citydb/cli/deleter/DeleteCommand.java @@ -123,9 +123,10 @@ public Integer call() throws ExecutionException { if (preview) { logger.info("Delete is running in preview mode. Features will not be deleted."); + deleter.setTransactionMode(Deleter.TransactionMode.AUTO_ROLLBACK); } else if (autoCommit) { logger.info("Committing delete operation after {} feature(s).", commitAfter); - deleter.setAutoCommit(true); + deleter.setTransactionMode(Deleter.TransactionMode.AUTO_COMMIT); deleteOptions.setBatchSize(commitAfter); } diff --git a/citydb-cli/src/main/java/org/citydb/cli/importer/ImportController.java b/citydb-cli/src/main/java/org/citydb/cli/importer/ImportController.java index 26ac1cb8..96b5215f 100644 --- a/citydb-cli/src/main/java/org/citydb/cli/importer/ImportController.java +++ b/citydb-cli/src/main/java/org/citydb/cli/importer/ImportController.java @@ -137,7 +137,9 @@ protected boolean doImport() throws ExecutionException { try { Importer importer = Importer.newInstance() - .setAutoCommit(!preview) + .setTransactionMode(preview ? + Importer.TransactionMode.AUTO_ROLLBACK : + Importer.TransactionMode.AUTO_COMMIT) .setImportLogger(importLogger); AtomicLong counter = new AtomicLong(); diff --git a/citydb-operation/src/main/java/org/citydb/operation/deleter/DeleteHelper.java b/citydb-operation/src/main/java/org/citydb/operation/deleter/DeleteHelper.java index 34ed5b62..1a6481ba 100644 --- a/citydb-operation/src/main/java/org/citydb/operation/deleter/DeleteHelper.java +++ b/citydb-operation/src/main/java/org/citydb/operation/deleter/DeleteHelper.java @@ -41,18 +41,18 @@ public class DeleteHelper { private final DeleteLogger logger; private final TableHelper tableHelper; private final List logEntries = new ArrayList<>(); + private final Deleter.TransactionMode transactionMode; private final int batchSize; - private final boolean autoCommit; private int batchCounter; DeleteHelper(DatabaseAdapter adapter, Connection connection, DeleteOptions options, DeleteLogger logger, - boolean autoCommit) { + Deleter.TransactionMode transactionMode) { this.adapter = adapter; this.connection = connection; this.options = options; this.logger = logger; - this.autoCommit = autoCommit; + this.transactionMode = transactionMode; tableHelper = new TableHelper(this); batchSize = options.getBatchSize() > 0 ? @@ -84,7 +84,7 @@ void deleteFeature(long id) throws DeleteException { logEntries.add(DeleteLogEntry.of(Table.FEATURE, id)); } - executeBatch(false, autoCommit); + executeBatch(false, transactionMode == Deleter.TransactionMode.AUTO_COMMIT); } catch (Exception e) { throw new DeleteException("Failed to delete feature (ID: " + id + ").", e); } @@ -101,6 +101,8 @@ void executeBatch(boolean force, boolean commit) throws DeleteException, SQLExce if (commit) { connection.commit(); + } else if (transactionMode == Deleter.TransactionMode.AUTO_ROLLBACK) { + connection.rollback(); } updateDeleteLog(commit); diff --git a/citydb-operation/src/main/java/org/citydb/operation/deleter/Deleter.java b/citydb-operation/src/main/java/org/citydb/operation/deleter/Deleter.java index 37dfb26a..79969843 100644 --- a/citydb-operation/src/main/java/org/citydb/operation/deleter/Deleter.java +++ b/citydb-operation/src/main/java/org/citydb/operation/deleter/Deleter.java @@ -43,11 +43,17 @@ public class Deleter { private DeleteLogger logger; private CountLatch countLatch; private Throwable exception; - private boolean autoCommit = false; + private TransactionMode transactionMode = TransactionMode.NO_COMMIT; private volatile State state = State.SESSION_NOT_STARTED; private volatile boolean shouldRun; + public enum TransactionMode { + AUTO_COMMIT, + AUTO_ROLLBACK, + NO_COMMIT + } + public enum State { SESSION_NOT_STARTED, SESSION_STARTED, @@ -71,12 +77,12 @@ public Deleter setDeleteLogger(DeleteLogger logger) { return this; } - public boolean isAutoCommit() { - return autoCommit; + public TransactionMode getTransactionMode() { + return transactionMode; } - public Deleter setAutoCommit(boolean autoCommit) { - this.autoCommit = autoCommit; + public Deleter setTransactionMode(TransactionMode transactionMode) { + this.transactionMode = transactionMode; return this; } @@ -105,7 +111,7 @@ public Deleter startSession(DatabaseAdapter adapter, DeleteOptions options) thro countLatch = new CountLatch(); contexts = ThreadLocal.withInitial(() -> { try { - DeleteHelper helper = new DeleteHelper(adapter, connection, options, logger, autoCommit); + DeleteHelper helper = new DeleteHelper(adapter, connection, options, logger, transactionMode); helpers.add(helper); return helper; } catch (Exception e) { @@ -151,6 +157,8 @@ public void commitSession() throws DeleteException { || state == State.SESSION_COMMITTED || state == State.SESSION_ABORTED) { return; + } else if (transactionMode == TransactionMode.AUTO_ROLLBACK) { + throw new DeleteException("Illegal to commit a session in auto-rollback mode."); } try { diff --git a/citydb-operation/src/main/java/org/citydb/operation/importer/ImportHelper.java b/citydb-operation/src/main/java/org/citydb/operation/importer/ImportHelper.java index 4608c2c5..ce18b58d 100644 --- a/citydb-operation/src/main/java/org/citydb/operation/importer/ImportHelper.java +++ b/citydb-operation/src/main/java/org/citydb/operation/importer/ImportHelper.java @@ -53,18 +53,18 @@ public class ImportHelper { private final SequenceHelper sequenceHelper; private final Map caches = new EnumMap<>(CacheType.class); private final List logEntries = new ArrayList<>(); + private final Importer.TransactionMode transactionMode; private final int batchSize; - private final boolean autoCommit; private SequenceValues sequenceValues; private int batchCounter; ImportHelper(DatabaseAdapter adapter, ImportOptions options, ReferenceManager referenceManager, - ImportLogger logger, boolean autoCommit) throws SQLException { + ImportLogger logger, Importer.TransactionMode transactionMode) throws SQLException { this.adapter = adapter; this.referenceManager = referenceManager; this.logger = logger; - this.autoCommit = autoCommit; + this.transactionMode = transactionMode; connection = adapter.getPool().getConnection(false); schemaMapping = adapter.getSchemaAdapter().getSchemaMapping(); @@ -117,7 +117,7 @@ FeatureDescriptor importFeature(Feature feature) throws ImportException { logEntries.add(ImportLogEntry.of(feature, descriptor)); } - executeBatch(false, autoCommit); + executeBatch(false, transactionMode == Importer.TransactionMode.AUTO_COMMIT); return descriptor; } catch (Exception e) { throw new ImportException("Failed to import feature.", e); @@ -145,6 +145,8 @@ void executeBatch(boolean force, boolean commit) throws ImportException, SQLExce if (commit) { connection.commit(); + } else if (transactionMode == Importer.TransactionMode.AUTO_ROLLBACK) { + connection.rollback(); } updateImportLog(commit); diff --git a/citydb-operation/src/main/java/org/citydb/operation/importer/Importer.java b/citydb-operation/src/main/java/org/citydb/operation/importer/Importer.java index 207e320b..270067f7 100644 --- a/citydb-operation/src/main/java/org/citydb/operation/importer/Importer.java +++ b/citydb-operation/src/main/java/org/citydb/operation/importer/Importer.java @@ -44,11 +44,17 @@ public class Importer { private ImportLogger logger; private CountLatch countLatch; private Throwable exception; - private boolean autoCommit = true; + private TransactionMode transactionMode = TransactionMode.AUTO_COMMIT; private volatile State state = State.SESSION_NOT_STARTED; private volatile boolean shouldRun; + public enum TransactionMode { + AUTO_COMMIT, + AUTO_ROLLBACK, + NO_COMMIT + } + public enum State { SESSION_NOT_STARTED, SESSION_STARTED, @@ -72,12 +78,12 @@ public Importer setImportLogger(ImportLogger logger) { return this; } - public boolean isAutoCommit() { - return autoCommit; + public TransactionMode getTransactionMode() { + return transactionMode; } - public Importer setAutoCommit(boolean autoCommit) { - this.autoCommit = autoCommit; + public Importer setTransactionMode(TransactionMode transactionMode) { + this.transactionMode = transactionMode; return this; } @@ -107,7 +113,7 @@ public Importer startSession(DatabaseAdapter adapter, ImportOptions options) thr countLatch = new CountLatch(); contexts = ThreadLocal.withInitial(() -> { try { - ImportHelper helper = new ImportHelper(adapter, options, referenceManager, logger, autoCommit); + ImportHelper helper = new ImportHelper(adapter, options, referenceManager, logger, transactionMode); helpers.add(helper); return helper; } catch (Exception e) { @@ -152,6 +158,8 @@ public void commitSession() throws ImportException { || state == State.SESSION_COMMITTED || state == State.SESSION_ABORTED) { return; + } else if (transactionMode == TransactionMode.AUTO_ROLLBACK) { + throw new ImportException("Illegal to commit a session in auto-rollback mode."); } try {