diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-10-30 10:22:17 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-10-30 10:59:07 +0200 |
commit | e4713d0203311fdfcfef72ae5632782075159a56 (patch) | |
tree | ca2ce2177b608a87b50c80837c607fa513e00ea3 /src/dal | |
parent | a84572c5449c74d9107a9c725a5feb32e439843e (diff) | |
download | manaserv-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.cpp | 20 | ||||
-rw-r--r-- | src/dal/dataprovider.h | 22 |
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. |