dbd/sqlite3/connection.c

changeset 41
e490414a391d
parent 32
03ed0ca09837
child 42
93335fa1f1d0
--- a/dbd/sqlite3/connection.c	Sun Jul 18 03:42:30 2010 +0000
+++ b/dbd/sqlite3/connection.c	Mon Dec 20 09:01:12 2010 +0000
@@ -9,19 +9,36 @@
 }
 
 static int commit(connection_t *conn) {
-    return run(conn, "COMMIT");
+    conn->txn_in_progress = 0;
+    return run(conn, "COMMIT TRANSACTION");
 }
 
 
 static int begin(connection_t *conn) {
-    return run(conn, "BEGIN");
+    int err = 0;
+
+    if (conn->txn_in_progress) {
+        err = 0;
+    } else {
+        conn->txn_in_progress = 1;
+        err = run(conn, "BEGIN TRANSACTION");
+    }
+
+    return err;
 }
 
-
 static int rollback(connection_t *conn) {
-    return run(conn, "ROLLBACK");
+    conn->txn_in_progress = 0;
+    return run(conn, "ROLLBACK TRANSACTION");
 }
 
+int try_begin_transaction(connection_t *conn) {
+    if (conn->autocommit) {
+        return 1;
+    }
+
+    return begin(conn) == 0;
+}
 
 /* 
  * connection,err = DBD.SQLite3.New(dbfile)
@@ -50,7 +67,7 @@
     }
 
     conn->autocommit = 0;
-    begin(conn);
+    conn->txn_in_progress = 0;
 
     luaL_getmetatable(L, DBD_SQLITE_CONNECTION);
     lua_setmetatable(L, -2);
@@ -67,10 +84,13 @@
     int err = 1;
 
     if (conn->sqlite) {
-	if (on)
+	if (on) {
 	    err = rollback(conn);
+        }
+        /*
 	else
 	    err = begin(conn);
+        */
 
 	conn->autocommit = on;	
     }
@@ -88,6 +108,7 @@
     int disconnect = 0;   
 
     if (conn->sqlite) {
+        rollback(conn);
 	sqlite3_close(conn->sqlite);
 	disconnect = 1;
 	conn->sqlite = NULL;
@@ -105,12 +126,7 @@
     int err = 1;
 
     if (conn->sqlite) {
-	commit(conn);
-
-	if (!conn->autocommit)
-	    err = begin(conn);
-	else
-	    err = 1;
+	err = commit(conn);
     }
 
     lua_pushboolean(L, !err);
@@ -176,12 +192,14 @@
     int err = 1;
 
     if (conn->sqlite) {
-	rollback(conn);
+	err =rollback(conn);
 
+        /*
 	if (!conn->autocommit)
 	    err = begin(conn);
 	else
 	    err = 1;
+        */
     }
 
     lua_pushboolean(L, !err);

mercurial