summaryrefslogtreecommitdiff
path: root/dbd/apr_dbd_sqlite3.c
diff options
context:
space:
mode:
authorbojan <bojan@13f79535-47bb-0310-9956-ffa450edef68>2006-06-14 05:42:10 +0000
committerbojan <bojan@13f79535-47bb-0310-9956-ffa450edef68>2006-06-14 05:42:10 +0000
commit05d61b879cbcec210e3ea4a399b8884445e90929 (patch)
tree5ad16f19e8cb6a2e410d605537120af88f7af898 /dbd/apr_dbd_sqlite3.c
parent5588523934b1bf566d15bd5f9f3b8fcc34444f79 (diff)
downloadlibapr-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.c33
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