summaryrefslogtreecommitdiff
path: root/src/account-server/dalstorage.cpp
diff options
context:
space:
mode:
authorAndreas Habel <mail@exceptionfault.de>2008-10-24 10:16:39 +0000
committerAndreas Habel <mail@exceptionfault.de>2008-10-24 10:16:39 +0000
commitef9852cddecfc5abce38438ca2138defb1a9b1bf (patch)
tree5b44f19205abdeb09f2ecbd513646a5cf87c04da /src/account-server/dalstorage.cpp
parentbb65f5e72a77c4ef111a1e942766c6a66626bd05 (diff)
downloadmanaserv-ef9852cddecfc5abce38438ca2138defb1a9b1bf.tar.gz
manaserv-ef9852cddecfc5abce38438ca2138defb1a9b1bf.tar.bz2
manaserv-ef9852cddecfc5abce38438ca2138defb1a9b1bf.tar.xz
manaserv-ef9852cddecfc5abce38438ca2138defb1a9b1bf.zip
Fixed a bug when trying to change password or mailaddress via client, caused by nested transactions.
Fixed deletion of characters which left over garbage in sqlite.
Diffstat (limited to 'src/account-server/dalstorage.cpp')
-rw-r--r--src/account-server/dalstorage.cpp85
1 files changed, 61 insertions, 24 deletions
diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp
index 90f157b0..04efe8a3 100644
--- a/src/account-server/dalstorage.cpp
+++ b/src/account-server/dalstorage.cpp
@@ -467,10 +467,14 @@ bool DALStorage::doesCharacterNameExist(const std::string& name)
return true;
}
-bool DALStorage::updateCharacter(Character *character)
+bool DALStorage::updateCharacter(Character *character,
+ bool startTransaction)
{
// Update the database Character data (see CharacterData for details)
- mDb->beginTransaction();
+ if (startTransaction)
+ {
+ mDb->beginTransaction();
+ }
try
{
std::ostringstream sqlUpdateCharacterInfo;
@@ -505,7 +509,10 @@ bool DALStorage::updateCharacter(Character *character)
catch (const dal::DbSqlQueryExecFailure& e)
{
// TODO: throw an exception.
- mDb->rollbackTransaction();
+ if (startTransaction)
+ {
+ mDb->rollbackTransaction();
+ }
LOG_ERROR("(DALStorage::updateCharacter #1) SQL query failure: " << e.what());
return false;
}
@@ -523,7 +530,10 @@ bool DALStorage::updateCharacter(Character *character)
catch (const dal::DbSqlQueryExecFailure& e)
{
// TODO: throw an exception.
- mDb->rollbackTransaction();
+ if (startTransaction)
+ {
+ mDb->rollbackTransaction();
+ }
LOG_ERROR("(DALStorage::updateCharacter #2) SQL query failure: " << e.what());
return false;
}
@@ -545,7 +555,10 @@ bool DALStorage::updateCharacter(Character *character)
catch (const dal::DbSqlQueryExecFailure& e)
{
// TODO: throw an exception.
- mDb->rollbackTransaction();
+ if (startTransaction)
+ {
+ mDb->rollbackTransaction();
+ }
LOG_ERROR("(DALStorage::updateCharacter #3) SQL query failure: " << e.what());
return false;
}
@@ -591,12 +604,18 @@ bool DALStorage::updateCharacter(Character *character)
catch (const dal::DbSqlQueryExecFailure& e)
{
// TODO: throw an exception.
- mDb->rollbackTransaction();
+ if (startTransaction)
+ {
+ mDb->rollbackTransaction();
+ }
LOG_ERROR("(DALStorage::updateCharacter #4) SQL query failure: " << e.what());
return false;
}
- mDb->commitTransaction();
+ if (startTransaction)
+ {
+ mDb->commitTransaction();
+ }
return true;
}
@@ -721,7 +740,10 @@ void DALStorage::flush(Account *account)
{
if ((*it)->getDatabaseID() >= 0)
{
- updateCharacter(*it);
+ /* 2nd. parameter false means: don't start a transaction in
+ the updateCharacter method, cause we did this already a few
+ lines above */
+ updateCharacter(*it, false);
}
else
{
@@ -1193,33 +1215,48 @@ void DALStorage::delCharacter(int charId, bool startTransaction = true) const
mDb->beginTransaction();
try
{
+ std::ostringstream sql;
+
// delete the inventory of the character
- std::ostringstream sqlDeleteInventoryTable;
- sqlDeleteInventoryTable
- << "DELETE FROM " << INVENTORIES_TBL_NAME
+ sql << "DELETE FROM " << INVENTORIES_TBL_NAME
<< " WHERE owner_id = '" << charId << "';";
- mDb->execSql(sqlDeleteInventoryTable.str());
+ mDb->execSql(sql.str());
+
+ // delete the skills of the character
+ sql.str("");
+ sql << "DELETE FROM " << CHAR_SKILLS_TBL_NAME
+ << " WHERE char_id = '" << charId << "';";
+ mDb->execSql(sql.str());
// delete from the quests table
- std::ostringstream sqlDeleteQuestsTable;
- sqlDeleteQuestsTable
- << "DELETE FROM " << QUESTS_TBL_NAME
+ sql.str("");
+ sql << "DELETE FROM " << QUESTS_TBL_NAME
<< " WHERE owner_id = '" << charId << "';";
- mDb->execSql(sqlDeleteQuestsTable.str());
+ mDb->execSql(sql.str());
// delete from the guilds table
- std::ostringstream sqlDeleteGuildsTable;
- sqlDeleteGuildsTable
- << "DELETE FROM " << GUILD_MEMBERS_TBL_NAME
+ sql.str("");
+ sql << "DELETE FROM " << GUILD_MEMBERS_TBL_NAME
<< " WHERE member_id = '" << charId << "';";
- mDb->execSql(sqlDeleteGuildsTable.str());
+ mDb->execSql(sql.str());
+
+ // delete auctions of the character
+ sql.str("");
+ sql << "DELETE FROM " << AUCTION_TBL_NAME
+ << " WHERE char_id = '" << charId << "';";
+ mDb->execSql(sql.str());
+
+ // delete bids made on auctions made by the character
+ sql.str("");
+ sql << "DELETE FROM " << AUCTION_BIDS_TBL_NAME
+ << " WHERE char_id = '" << charId << "';";
+ mDb->execSql(sql.str());
// now delete the character itself.
- std::ostringstream sqlDeleteCharactersTable;
- sqlDeleteCharactersTable
- << "DELETE FROM " << CHARACTERS_TBL_NAME
+ sql.str("");
+ sql << "DELETE FROM " << CHARACTERS_TBL_NAME
<< " WHERE id = '" << charId << "';";
- mDb->execSql(sqlDeleteCharactersTable.str());
+ mDb->execSql(sql.str());
if (startTransaction)
mDb->commitTransaction();