summaryrefslogtreecommitdiffstats
path: root/src/dal
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-10-30 10:22:17 +0200
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-10-30 10:59:07 +0200
commite4713d0203311fdfcfef72ae5632782075159a56 (patch)
treeca2ce2177b608a87b50c80837c607fa513e00ea3 /src/dal
parenta84572c5449c74d9107a9c725a5feb32e439843e (diff)
downloadmanaserv-e4713d0203311fdfcfef72ae5632782075159a56.tar.gz
manaserv-e4713d0203311fdfcfef72ae5632782075159a56.tar.xz
manaserv-e4713d0203311fdfcfef72ae5632782075159a56.zip
Introduced a helper class for performing transactions
Avoids having to remember to call rollbackTransaction and makes transactions exception-safe (since the destructor of PerformTransaction will be called when an exception is thrown).
Diffstat (limited to 'src/dal')
-rw-r--r--src/dal/dataprovider.cpp20
-rw-r--r--src/dal/dataprovider.h22
2 files changed, 42 insertions, 0 deletions
diff --git a/src/dal/dataprovider.cpp b/src/dal/dataprovider.cpp
index 370741c..f6bcbdf 100644
--- a/src/dal/dataprovider.cpp
+++ b/src/dal/dataprovider.cpp
@@ -25,6 +25,26 @@
namespace dal
{
+PerformTransaction::PerformTransaction(DataProvider *dataProvider)
+ : mDataProvider(dataProvider)
+ , mCommitted(false)
+{
+ mDataProvider->beginTransaction();
+}
+
+PerformTransaction::~PerformTransaction()
+{
+ if (!mCommitted)
+ mDataProvider->rollbackTransaction();
+}
+
+void PerformTransaction::commit()
+{
+ mDataProvider->commitTransaction();
+ mCommitted = true;
+}
+
+
/**
* Constructor.
*/
diff --git a/src/dal/dataprovider.h b/src/dal/dataprovider.h
index 7ea15a7..1764ef1 100644
--- a/src/dal/dataprovider.h
+++ b/src/dal/dataprovider.h
@@ -30,6 +30,8 @@
namespace dal
{
+class DataProvider;
+
/**
* Enumeration type for the database backends.
*/
@@ -39,6 +41,26 @@ typedef enum {
DB_BKEND_POSTGRESQL
} DbBackends;
+/**
+ * Begins a transaction on a given data provider. When the transaction is
+ * complete, commit() should be called. When the destructor is called before
+ * commit() is called, the transaction is rolled back.
+ *
+ * This avoids having to remember to call rollback in a lot of places, and
+ * makes exception handling easier.
+ */
+class PerformTransaction
+{
+public:
+ PerformTransaction(DataProvider *dataProvider);
+ ~PerformTransaction();
+
+ void commit();
+
+private:
+ DataProvider *mDataProvider;
+ bool mCommitted;
+};
/**
* An abstract data provider.