diff -r 71c4b5dd82bb -r e490414a391d dbd/sqlite3/connection.c --- 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);