Skip to content

Commit 965b341

Browse files
committed
added more transaction modes to import and delete operation
1 parent 0263967 commit 965b341

File tree

6 files changed

+45
-22
lines changed

6 files changed

+45
-22
lines changed

citydb-cli/src/main/java/org/citydb/cli/deleter/DeleteCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,10 @@ public Integer call() throws ExecutionException {
123123

124124
if (preview) {
125125
logger.info("Delete is running in preview mode. Features will not be deleted.");
126+
deleter.setTransactionMode(Deleter.TransactionMode.AUTO_ROLLBACK);
126127
} else if (autoCommit) {
127128
logger.info("Committing delete operation after {} feature(s).", commitAfter);
128-
deleter.setAutoCommit(true);
129+
deleter.setTransactionMode(Deleter.TransactionMode.AUTO_COMMIT);
129130
deleteOptions.setBatchSize(commitAfter);
130131
}
131132

citydb-cli/src/main/java/org/citydb/cli/importer/ImportController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@ protected boolean doImport() throws ExecutionException {
137137

138138
try {
139139
Importer importer = Importer.newInstance()
140-
.setAutoCommit(!preview)
140+
.setTransactionMode(preview ?
141+
Importer.TransactionMode.AUTO_ROLLBACK :
142+
Importer.TransactionMode.AUTO_COMMIT)
141143
.setImportLogger(importLogger);
142144

143145
AtomicLong counter = new AtomicLong();

citydb-operation/src/main/java/org/citydb/operation/deleter/DeleteHelper.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,18 @@ public class DeleteHelper {
4141
private final DeleteLogger logger;
4242
private final TableHelper tableHelper;
4343
private final List<DeleteLogEntry> logEntries = new ArrayList<>();
44+
private final Deleter.TransactionMode transactionMode;
4445
private final int batchSize;
45-
private final boolean autoCommit;
4646

4747
private int batchCounter;
4848

4949
DeleteHelper(DatabaseAdapter adapter, Connection connection, DeleteOptions options, DeleteLogger logger,
50-
boolean autoCommit) {
50+
Deleter.TransactionMode transactionMode) {
5151
this.adapter = adapter;
5252
this.connection = connection;
5353
this.options = options;
5454
this.logger = logger;
55-
this.autoCommit = autoCommit;
55+
this.transactionMode = transactionMode;
5656

5757
tableHelper = new TableHelper(this);
5858
batchSize = options.getBatchSize() > 0 ?
@@ -84,7 +84,7 @@ void deleteFeature(long id) throws DeleteException {
8484
logEntries.add(DeleteLogEntry.of(Table.FEATURE, id));
8585
}
8686

87-
executeBatch(false, autoCommit);
87+
executeBatch(false, transactionMode == Deleter.TransactionMode.AUTO_COMMIT);
8888
} catch (Exception e) {
8989
throw new DeleteException("Failed to delete feature (ID: " + id + ").", e);
9090
}
@@ -101,6 +101,8 @@ void executeBatch(boolean force, boolean commit) throws DeleteException, SQLExce
101101

102102
if (commit) {
103103
connection.commit();
104+
} else if (transactionMode == Deleter.TransactionMode.AUTO_ROLLBACK) {
105+
connection.rollback();
104106
}
105107

106108
updateDeleteLog(commit);

citydb-operation/src/main/java/org/citydb/operation/deleter/Deleter.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,17 @@ public class Deleter {
4343
private DeleteLogger logger;
4444
private CountLatch countLatch;
4545
private Throwable exception;
46-
private boolean autoCommit = false;
46+
private TransactionMode transactionMode = TransactionMode.NO_COMMIT;
4747

4848
private volatile State state = State.SESSION_NOT_STARTED;
4949
private volatile boolean shouldRun;
5050

51+
public enum TransactionMode {
52+
AUTO_COMMIT,
53+
AUTO_ROLLBACK,
54+
NO_COMMIT
55+
}
56+
5157
public enum State {
5258
SESSION_NOT_STARTED,
5359
SESSION_STARTED,
@@ -71,12 +77,12 @@ public Deleter setDeleteLogger(DeleteLogger logger) {
7177
return this;
7278
}
7379

74-
public boolean isAutoCommit() {
75-
return autoCommit;
80+
public TransactionMode getTransactionMode() {
81+
return transactionMode;
7682
}
7783

78-
public Deleter setAutoCommit(boolean autoCommit) {
79-
this.autoCommit = autoCommit;
84+
public Deleter setTransactionMode(TransactionMode transactionMode) {
85+
this.transactionMode = transactionMode;
8086
return this;
8187
}
8288

@@ -105,7 +111,7 @@ public Deleter startSession(DatabaseAdapter adapter, DeleteOptions options) thro
105111
countLatch = new CountLatch();
106112
contexts = ThreadLocal.withInitial(() -> {
107113
try {
108-
DeleteHelper helper = new DeleteHelper(adapter, connection, options, logger, autoCommit);
114+
DeleteHelper helper = new DeleteHelper(adapter, connection, options, logger, transactionMode);
109115
helpers.add(helper);
110116
return helper;
111117
} catch (Exception e) {
@@ -151,6 +157,8 @@ public void commitSession() throws DeleteException {
151157
|| state == State.SESSION_COMMITTED
152158
|| state == State.SESSION_ABORTED) {
153159
return;
160+
} else if (transactionMode == TransactionMode.AUTO_ROLLBACK) {
161+
throw new DeleteException("Illegal to commit a session in auto-rollback mode.");
154162
}
155163

156164
try {

citydb-operation/src/main/java/org/citydb/operation/importer/ImportHelper.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,18 @@ public class ImportHelper {
5353
private final SequenceHelper sequenceHelper;
5454
private final Map<CacheType, ReferenceCache> caches = new EnumMap<>(CacheType.class);
5555
private final List<ImportLogEntry> logEntries = new ArrayList<>();
56+
private final Importer.TransactionMode transactionMode;
5657
private final int batchSize;
57-
private final boolean autoCommit;
5858

5959
private SequenceValues sequenceValues;
6060
private int batchCounter;
6161

6262
ImportHelper(DatabaseAdapter adapter, ImportOptions options, ReferenceManager referenceManager,
63-
ImportLogger logger, boolean autoCommit) throws SQLException {
63+
ImportLogger logger, Importer.TransactionMode transactionMode) throws SQLException {
6464
this.adapter = adapter;
6565
this.referenceManager = referenceManager;
6666
this.logger = logger;
67-
this.autoCommit = autoCommit;
67+
this.transactionMode = transactionMode;
6868

6969
connection = adapter.getPool().getConnection(false);
7070
schemaMapping = adapter.getSchemaAdapter().getSchemaMapping();
@@ -117,7 +117,7 @@ FeatureDescriptor importFeature(Feature feature) throws ImportException {
117117
logEntries.add(ImportLogEntry.of(feature, descriptor));
118118
}
119119

120-
executeBatch(false, autoCommit);
120+
executeBatch(false, transactionMode == Importer.TransactionMode.AUTO_COMMIT);
121121
return descriptor;
122122
} catch (Exception e) {
123123
throw new ImportException("Failed to import feature.", e);
@@ -145,6 +145,8 @@ void executeBatch(boolean force, boolean commit) throws ImportException, SQLExce
145145

146146
if (commit) {
147147
connection.commit();
148+
} else if (transactionMode == Importer.TransactionMode.AUTO_ROLLBACK) {
149+
connection.rollback();
148150
}
149151

150152
updateImportLog(commit);

citydb-operation/src/main/java/org/citydb/operation/importer/Importer.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,17 @@ public class Importer {
4444
private ImportLogger logger;
4545
private CountLatch countLatch;
4646
private Throwable exception;
47-
private boolean autoCommit = true;
47+
private TransactionMode transactionMode = TransactionMode.AUTO_COMMIT;
4848

4949
private volatile State state = State.SESSION_NOT_STARTED;
5050
private volatile boolean shouldRun;
5151

52+
public enum TransactionMode {
53+
AUTO_COMMIT,
54+
AUTO_ROLLBACK,
55+
NO_COMMIT
56+
}
57+
5258
public enum State {
5359
SESSION_NOT_STARTED,
5460
SESSION_STARTED,
@@ -72,12 +78,12 @@ public Importer setImportLogger(ImportLogger logger) {
7278
return this;
7379
}
7480

75-
public boolean isAutoCommit() {
76-
return autoCommit;
81+
public TransactionMode getTransactionMode() {
82+
return transactionMode;
7783
}
7884

79-
public Importer setAutoCommit(boolean autoCommit) {
80-
this.autoCommit = autoCommit;
85+
public Importer setTransactionMode(TransactionMode transactionMode) {
86+
this.transactionMode = transactionMode;
8187
return this;
8288
}
8389

@@ -107,7 +113,7 @@ public Importer startSession(DatabaseAdapter adapter, ImportOptions options) thr
107113
countLatch = new CountLatch();
108114
contexts = ThreadLocal.withInitial(() -> {
109115
try {
110-
ImportHelper helper = new ImportHelper(adapter, options, referenceManager, logger, autoCommit);
116+
ImportHelper helper = new ImportHelper(adapter, options, referenceManager, logger, transactionMode);
111117
helpers.add(helper);
112118
return helper;
113119
} catch (Exception e) {
@@ -152,6 +158,8 @@ public void commitSession() throws ImportException {
152158
|| state == State.SESSION_COMMITTED
153159
|| state == State.SESSION_ABORTED) {
154160
return;
161+
} else if (transactionMode == TransactionMode.AUTO_ROLLBACK) {
162+
throw new ImportException("Illegal to commit a session in auto-rollback mode.");
155163
}
156164

157165
try {

0 commit comments

Comments
 (0)