diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/account-server/serverhandler.cpp | 4 | ||||
-rw-r--r-- | src/account-server/storage.cpp | 22 | ||||
-rw-r--r-- | src/dal/dataprovider.cpp | 20 | ||||
-rw-r--r-- | src/dal/dataprovider.h | 22 |
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. |