Added transactions for corpse creation, added sql to fix a bug in raid member saving in some situations, fixed a bug in encounters

This commit is contained in:
KimLS 2014-11-08 15:22:03 -08:00
parent fe7774ab75
commit d987ccf289
5 changed files with 29 additions and 2 deletions

View File

@ -234,6 +234,18 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
return ret; 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) { 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. // No good reason to lock the DB, we only need it in the first place to check char encoding.
// LockMutex lock(&MDatabase); // LockMutex lock(&MDatabase);

View File

@ -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); 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(const char* query, uint32 querylen, bool retryOnFailureOnce = true);
MySQLRequestResult QueryDatabase(std::string query, 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); uint32 DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen);
void ping(); void ping();
MYSQL* getMySQL(){ return &mysql; } MYSQL* getMySQL(){ return &mysql; }

View File

@ -402,6 +402,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp)
} }
} }
database.TransactionBegin();
if(removed_list.size() != 0) { if(removed_list.size() != 0) {
std::stringstream ss(""); std::stringstream ss("");
ss << "DELETE FROM inventory WHERE charid=" << client->CharacterID(); 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->CalcBonuses(); // will only affect offline profile viewing of dead characters..unneeded overhead
client->Save(); client->Save();
Rezzed(false);
Save();
database.TransactionCommit();
return;
} //end "not leaving naked corpses" } //end "not leaving naked corpses"
Rezzed(false); Rezzed(false);

View File

@ -146,6 +146,7 @@ void unregister_event(std::string package_name, std::string name, int evt) {
iter = elist.erase(iter); iter = elist.erase(iter);
break; break;
} }
++iter;
} }
lua_encounter_events_registered[package_name] = elist; lua_encounter_events_registered[package_name] = elist;
} }

View File

@ -94,6 +94,10 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo
c->GetName(), groupleader, rleader, looter); c->GetName(), groupleader, rleader, looter);
auto results = database.QueryDatabase(query); auto results = database.QueryDatabase(query);
if(!results.Success()) {
LogFile->write(EQEMuLog::Error, "Error inserting into raid members: %s", results.ErrorMessage().c_str());
}
LearnMembers(); LearnMembers();
VerifyRaid(); VerifyRaid();
if (rleader) { 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); std::string query = StringFormat("UPDATE raid_members SET israidleader = 0 WHERE name = '%s'", wasLead);
auto results = database.QueryDatabase(query); auto results = database.QueryDatabase(query);
if (!results.Success()) 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); query = StringFormat("UPDATE raid_members SET israidleader = 1 WHERE name = '%s'", name);
results = database.QueryDatabase(query); results = database.QueryDatabase(query);
if (!results.Success()) 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); strn0cpy(leadername, name, 64);