From d987ccf28969b70629e37ebe9c3537005a527775 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 8 Nov 2014 15:22:03 -0800 Subject: [PATCH] Added transactions for corpse creation, added sql to fix a bug in raid member saving in some situations, fixed a bug in encounters --- common/dbcore.cpp | 12 ++++++++++++ common/dbcore.h | 3 +++ zone/corpse.cpp | 7 +++++++ zone/lua_general.cpp | 1 + zone/raids.cpp | 8 ++++++-- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/common/dbcore.cpp b/common/dbcore.cpp index 21168efa0..fb038db2e 100644 --- a/common/dbcore.cpp +++ b/common/dbcore.cpp @@ -234,6 +234,18 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE return ret; } +void DBcore::TransactionBegin() { + QueryDatabase("START TRANSACTION"); +} + +void DBcore::TransactionCommit() { + QueryDatabase("COMMIT"); +} + +void DBcore::TransactionRollback() { + QueryDatabase("ROLLBACK"); +} + uint32 DBcore::DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen) { // No good reason to lock the DB, we only need it in the first place to check char encoding. // LockMutex lock(&MDatabase); diff --git a/common/dbcore.h b/common/dbcore.h index 56f326467..9dd5aef5e 100644 --- a/common/dbcore.h +++ b/common/dbcore.h @@ -26,6 +26,9 @@ public: bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0, bool retry = true); MySQLRequestResult QueryDatabase(const char* query, uint32 querylen, bool retryOnFailureOnce = true); MySQLRequestResult QueryDatabase(std::string query, bool retryOnFailureOnce = true); + void TransactionBegin(); + void TransactionCommit(); + void TransactionRollback(); uint32 DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen); void ping(); MYSQL* getMySQL(){ return &mysql; } diff --git a/zone/corpse.cpp b/zone/corpse.cpp index f028b4555..8df695a84 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -402,6 +402,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) } } + database.TransactionBegin(); if(removed_list.size() != 0) { std::stringstream ss(""); ss << "DELETE FROM inventory WHERE charid=" << client->CharacterID(); @@ -433,6 +434,12 @@ Corpse::Corpse(Client* client, int32 in_rezexp) client->CalcBonuses(); // will only affect offline profile viewing of dead characters..unneeded overhead client->Save(); + + Rezzed(false); + Save(); + database.TransactionCommit(); + + return; } //end "not leaving naked corpses" Rezzed(false); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index f0d374870..d58ea21bc 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -146,6 +146,7 @@ void unregister_event(std::string package_name, std::string name, int evt) { iter = elist.erase(iter); break; } + ++iter; } lua_encounter_events_registered[package_name] = elist; } diff --git a/zone/raids.cpp b/zone/raids.cpp index d377d4174..041b92ad4 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -94,6 +94,10 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo c->GetName(), groupleader, rleader, looter); auto results = database.QueryDatabase(query); + if(!results.Success()) { + LogFile->write(EQEMuLog::Error, "Error inserting into raid members: %s", results.ErrorMessage().c_str()); + } + LearnMembers(); VerifyRaid(); if (rleader) { @@ -225,12 +229,12 @@ void Raid::SetRaidLeader(const char *wasLead, const char *name) std::string query = StringFormat("UPDATE raid_members SET israidleader = 0 WHERE name = '%s'", wasLead); auto results = database.QueryDatabase(query); if (!results.Success()) - printf("Set Raid Leader error: %s\n", results.ErrorMessage().c_str()); + LogFile->write(EQEMuLog::Error, "Set Raid Leader error: %s\n", results.ErrorMessage().c_str()); query = StringFormat("UPDATE raid_members SET israidleader = 1 WHERE name = '%s'", name); results = database.QueryDatabase(query); if (!results.Success()) - printf("Set Raid Leader error: %s\n", results.ErrorMessage().c_str()); + LogFile->write(EQEMuLog::Error, "Set Raid Leader error: %s\n", results.ErrorMessage().c_str()); strn0cpy(leadername, name, 64);