diff options
author | bojan <bojan@13f79535-47bb-0310-9956-ffa450edef68> | 2006-06-14 05:42:10 +0000 |
---|---|---|
committer | bojan <bojan@13f79535-47bb-0310-9956-ffa450edef68> | 2006-06-14 05:42:10 +0000 |
commit | 05d61b879cbcec210e3ea4a399b8884445e90929 (patch) | |
tree | 5ad16f19e8cb6a2e410d605537120af88f7af898 /dbd/apr_dbd_sqlite3.c | |
parent | 5588523934b1bf566d15bd5f9f3b8fcc34444f79 (diff) | |
download | libapr-util-05d61b879cbcec210e3ea4a399b8884445e90929.tar.gz |
Implement DBD transaction modes
git-svn-id: http://svn.apache.org/repos/asf/apr/apr-util/trunk@414087 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'dbd/apr_dbd_sqlite3.c')
-rw-r--r-- | dbd/apr_dbd_sqlite3.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/dbd/apr_dbd_sqlite3.c b/dbd/apr_dbd_sqlite3.c index 256e0e2f..76074d03 100644 --- a/dbd/apr_dbd_sqlite3.c +++ b/dbd/apr_dbd_sqlite3.c @@ -32,6 +32,7 @@ #define MAX_RETRY_SLEEP 100000 struct apr_dbd_transaction_t { + int mode; int errnum; apr_dbd_t *handle; }; @@ -178,7 +179,7 @@ static int dbd_sqlite3_select(apr_pool_t * pool, apr_dbd_t * sql, apr_dbd_result ret = sqlite3_finalize(stmt); apr_dbd_mutex_unlock(); - if (sql->trans) { + if (TXN_NOTICE_ERRORS(sql->trans)) { sql->trans->errnum = ret; } return ret; @@ -279,7 +280,7 @@ static int dbd_sqlite3_query(apr_dbd_t *sql, int *nrows, const char *query) ret = 0; } apr_dbd_mutex_unlock(); - if (sql->trans) { + if (TXN_NOTICE_ERRORS(sql->trans)) { sql->trans->errnum = ret; } return ret; @@ -391,7 +392,7 @@ static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql, ret = 0; } apr_dbd_mutex_unlock(); - if (sql->trans) { + if (TXN_NOTICE_ERRORS(sql->trans)) { sql->trans->errnum = ret; } @@ -525,7 +526,7 @@ static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql, } apr_dbd_mutex_unlock(); - if (sql->trans) { + if (TXN_NOTICE_ERRORS(sql->trans)) { sql->trans->errnum = ret; } return ret; @@ -576,7 +577,8 @@ static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans) int nrows = 0; if (trans) { - if (trans->errnum) { + /* rollback on error or explicit rollback request */ + if (trans->errnum || TXN_DO_ROLLBACK(trans)) { trans->errnum = 0; ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK"); } else { @@ -588,6 +590,23 @@ static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans) return ret; } +static int dbd_sqlite3_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_sqlite3_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode = (mode & TXN_MODE_BITS); +} + static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params) { apr_dbd_t *sql = NULL; @@ -673,6 +692,8 @@ APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = { dbd_sqlite3_pvselect, dbd_sqlite3_pquery, dbd_sqlite3_pselect, - dbd_sqlite3_get_name + dbd_sqlite3_get_name, + dbd_sqlite3_transaction_mode_get, + dbd_sqlite3_transaction_mode_set }; #endif |