aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-09-06 08:16:39 +0200
committerTobias Brunner <tobias@strongswan.org>2013-10-11 15:16:04 +0200
commit947b76cda8b28f8b07e30977ca1c902ed8736dbe (patch)
tree86ac1b54296657c2bf6092c5715493572d965c3b
parent5f6a40827e8ff4b4723308a439320117b6ef3ede (diff)
downloadstrongswan-947b76cda8b28f8b07e30977ca1c902ed8736dbe.tar.bz2
strongswan-947b76cda8b28f8b07e30977ca1c902ed8736dbe.tar.xz
database: Add interface to handle transactions
-rw-r--r--src/libstrongswan/database/database.h33
-rw-r--r--src/libstrongswan/plugins/mysql/mysql_database.c22
-rw-r--r--src/libstrongswan/plugins/sqlite/sqlite_database.c22
3 files changed, 76 insertions, 1 deletions
diff --git a/src/libstrongswan/database/database.h b/src/libstrongswan/database/database.h
index d46fc3d34..77d4da144 100644
--- a/src/libstrongswan/database/database.h
+++ b/src/libstrongswan/database/database.h
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2008 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -102,7 +103,7 @@ struct database_t {
enumerator_t* (*query)(database_t *this, char *sql, ...);
/**
- * Execute a query which dows not return rows, such as INSERT.
+ * Execute a query which does not return rows, such as INSERT.
*
* @param rowid pointer to write inserted AUTO_INCREMENT row ID, or NULL
* @param sql sql string, containing '?' placeholders
@@ -112,6 +113,36 @@ struct database_t {
int (*execute)(database_t *this, int *rowid, char *sql, ...);
/**
+ * Start a transaction.
+ *
+ * @note Either commit() or rollback() has to be called to end the
+ * transaction.
+ * @note Transactions are thread-specific. So commit()/rollbak() has to be
+ * called from the same thread.
+ * @note While this method can be called multiple times (commit/rollback
+ * have to be called an equal number of times) real nested transactions are
+ * not supported. So if any if the "inner" transactions are rolled back
+ * the outer most transaction is rolled back.
+ *
+ * @return TRUE on success
+ */
+ bool (*transaction)(database_t *this);
+
+ /**
+ * Commit all changes made during the current transaction.
+ *
+ * @return TRUE on success
+ */
+ bool (*commit)(database_t *this);
+
+ /**
+ * Rollback/revert all changes made during the current transaction.
+ *
+ * @return TRUE on success
+ */
+ bool (*rollback)(database_t *this);
+
+ /**
* Get the database implementation type.
*
* To allow driver specific SQL or performance optimizations each database
diff --git a/src/libstrongswan/plugins/mysql/mysql_database.c b/src/libstrongswan/plugins/mysql/mysql_database.c
index fdb6fd684..0757c2a32 100644
--- a/src/libstrongswan/plugins/mysql/mysql_database.c
+++ b/src/libstrongswan/plugins/mysql/mysql_database.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2007 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -602,6 +603,24 @@ METHOD(database_t, execute, int,
return affected;
}
+METHOD(database_t, transaction, bool,
+ private_mysql_database_t *this)
+{
+ return FALSE;
+}
+
+METHOD(database_t, commit, bool,
+ private_mysql_database_t *this)
+{
+ return FALSE;
+}
+
+METHOD(database_t, rollback, bool,
+ private_mysql_database_t *this)
+{
+ return FALSE;
+}
+
METHOD(database_t, get_driver,db_driver_t,
private_mysql_database_t *this)
{
@@ -686,6 +705,9 @@ mysql_database_t *mysql_database_create(char *uri)
.db = {
.query = _query,
.execute = _execute,
+ .transaction = _transaction,
+ .commit = _commit,
+ .rollback = _rollback,
.get_driver = _get_driver,
.destroy = _destroy,
},
diff --git a/src/libstrongswan/plugins/sqlite/sqlite_database.c b/src/libstrongswan/plugins/sqlite/sqlite_database.c
index 41d45dee7..6c8b48324 100644
--- a/src/libstrongswan/plugins/sqlite/sqlite_database.c
+++ b/src/libstrongswan/plugins/sqlite/sqlite_database.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2007 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -280,6 +281,24 @@ METHOD(database_t, execute, int,
return affected;
}
+METHOD(database_t, transaction, bool,
+ private_sqlite_database_t *this)
+{
+ return FALSE;
+}
+
+METHOD(database_t, commit, bool,
+ private_sqlite_database_t *this)
+{
+ return FALSE;
+}
+
+METHOD(database_t, rollback, bool,
+ private_sqlite_database_t *this)
+{
+ return FALSE;
+}
+
METHOD(database_t, get_driver, db_driver_t,
private_sqlite_database_t *this)
{
@@ -330,6 +349,9 @@ sqlite_database_t *sqlite_database_create(char *uri)
.db = {
.query = _query,
.execute = _execute,
+ .transaction = _transaction,
+ .commit = _commit,
+ .rollback = _rollback,
.get_driver = _get_driver,
.destroy = _destroy,
},