diff flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java @ 4086:ee0c60757a94

Added transaction support flys-aft/trunk@3566 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 02 Jan 2012 15:13:58 +0000
parents 100c4e0a45e1
children aad1886ea226
line wrap: on
line diff
--- a/flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java	Thu Dec 22 12:07:29 2011 +0000
+++ b/flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java	Mon Jan 02 15:13:58 2012 +0000
@@ -2,9 +2,12 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Deque;
+import java.util.ArrayDeque;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.sql.Savepoint;
 
 public class ConnectedStatements
 {
@@ -14,16 +17,27 @@
 
     protected Map<String, SymbolicStatement.Instance> boundStatements;
 
+    protected Deque<Savepoint> savepoints;
+
     public ConnectedStatements(
         Connection connection,
         Map<String, SymbolicStatement> statements
-    ) {
+    )
+    throws SQLException
+    {
         this.connection = connection;
         this.statements = statements;
+        checkSavePoints();
 
         boundStatements = new HashMap<String, SymbolicStatement.Instance>();
     }
 
+    protected void checkSavePoints() throws SQLException {
+        if (connection.getMetaData().supportsSavepoints()) {
+            savepoints = new ArrayDeque<Savepoint>();
+        }
+    }
+
     public SymbolicStatement.Instance getStatement(String key) 
     throws SQLException
     {
@@ -42,12 +56,39 @@
         return stmnt;
     }
 
+    void beginTransaction() throws SQLException {
+        if (savepoints != null) {
+            savepoints.push(connection.setSavepoint());
+        }
+    }
+
+    void commitTransaction() throws SQLException {
+        if (savepoints != null) {
+            savepoints.pop();
+        }
+        connection.commit();
+    }
+
+    void rollbackTransaction() throws SQLException {
+        if (savepoints != null) {
+            Savepoint savepoint = savepoints.pop();
+            connection.rollback(savepoint);
+        }
+        else {
+            connection.rollback();
+        }
+    }
+
     public void close() {
         for (SymbolicStatement.Instance s: boundStatements.values()) {
             s.close();
         }
 
         try {
+            if (savepoints != null && !savepoints.isEmpty()) {
+                Savepoint savepoint = savepoints.peekFirst();
+                connection.rollback(savepoint);
+            }
             connection.close();
         }
         catch (SQLException sqle) {

http://dive4elements.wald.intevation.org