summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/account-server/serverhandler.cpp4
-rw-r--r--src/account-server/storage.cpp22
-rw-r--r--src/dal/dataprovider.cpp20
-rw-r--r--src/dal/dataprovider.h22
4 files changed, 54 insertions, 14 deletions
diff --git a/src/account-server/serverhandler.cpp b/src/account-server/serverhandler.cpp
index 9ca9e281..b81be075 100644
--- a/src/account-server/serverhandler.cpp
+++ b/src/account-server/serverhandler.cpp
@@ -553,7 +553,7 @@ void GameServerHandler::sendPartyChange(Character *ptr, int partyId)
void GameServerHandler::syncDatabase(MessageIn &msg)
{
// It is safe to perform the following updates in a transaction
- storage->database()->beginTransaction();
+ dal::PerformTransaction transaction(storage->database());
int msgType = msg.readByte();
while (msgType != SYNC_END_OF_BUFFER && msg.getUnreadLength() > 0)
@@ -602,5 +602,5 @@ void GameServerHandler::syncDatabase(MessageIn &msg)
msgType = msg.readByte();
}
- storage->database()->commitTransaction();
+ transaction.commit();
}
diff --git a/src/account-server/storage.cpp b/src/account-server/storage.cpp
index 9d51c641..13047de9 100644
--- a/src/account-server/storage.cpp
+++ b/src/account-server/storage.cpp
@@ -906,9 +906,10 @@ void Storage::addAccount(Account *account)
using namespace dal;
- mDb->beginTransaction();
try
{
+ PerformTransaction transaction(mDb);
+
// insert the account
std::ostringstream sql;
sql << "insert into " << ACCOUNTS_TBL_NAME
@@ -928,12 +929,11 @@ void Storage::addAccount(Account *account)
mDb->processSql();
account->setID(mDb->getLastId());
- mDb->commitTransaction();
+ transaction.commit();
}
catch (const dal::DbSqlQueryExecFailure &e)
{
LOG_ERROR("Error in DALStorage::addAccount: " << e.what());
- mDb->rollbackTransaction();
}
}
@@ -946,9 +946,10 @@ void Storage::flush(Account *account)
using namespace dal;
- mDb->beginTransaction();
try
{
+ PerformTransaction transaction(mDb);
+
// update the account
std::ostringstream sqlUpdateAccountTable;
sqlUpdateAccountTable
@@ -1064,12 +1065,11 @@ void Storage::flush(Account *account)
}
}
- mDb->commitTransaction();
+ transaction.commit();
}
catch (const std::exception &e)
{
LOG_ERROR("ERROR in DALStorage::flush: " << e.what());
- mDb->rollbackTransaction();
}
}
@@ -1943,10 +1943,9 @@ Post *Storage::getStoredPost(int playerId)
*/
void Storage::deletePost(Letter *letter)
{
- mDb->beginTransaction();
-
try
{
+ dal::PerformTransaction transaction(mDb);
std::ostringstream sql;
// first delete all attachments of the letter
@@ -1962,12 +1961,11 @@ void Storage::deletePost(Letter *letter)
<< " WHERE letter_id = " << letter->getId();
mDb->execSql(sql.str());
- mDb->commitTransaction();
+ transaction.commit();
letter->setId(0);
}
catch (const dal::DbSqlQueryExecFailure &e)
{
- mDb->rollbackTransaction();
LOG_ERROR("(DALStorage::deletePost) SQL query failure: " << e.what());
}
}
@@ -1991,7 +1989,7 @@ void Storage::syncDatabase()
return;
}
- mDb->beginTransaction();
+ dal::PerformTransaction transaction(mDb);
int itmCount = 0;
for_each_xml_child_node(node, rootNode)
{
@@ -2075,7 +2073,7 @@ void Storage::syncDatabase()
}
}
- mDb->commitTransaction();
+ transaction.commit();
}
/**
diff --git a/src/dal/dataprovider.cpp b/src/dal/dataprovider.cpp
index 370741cd..f6bcbdf9 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 7ea15a71..1764ef1d 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.