[Performance] Mail key is now cached during player load (#3339)

* [Performance] Mail key is now cached during player load

* More refactoring
This commit is contained in:
Chris Miles 2023-05-09 13:22:43 -05:00 committed by GitHub
parent 93a4153a4b
commit dbc6346fe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 62 additions and 38 deletions

View File

@ -133,55 +133,54 @@ uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) {
void SharedDatabase::SetMailKey(int CharID, int IPAddress, int MailKey) void SharedDatabase::SetMailKey(int CharID, int IPAddress, int MailKey)
{ {
char MailKeyString[17]; char mail_key[17];
if (RuleB(Chat, EnableMailKeyIPVerification) == true) if (RuleB(Chat, EnableMailKeyIPVerification) == true) {
sprintf(MailKeyString, "%08X%08X", IPAddress, MailKey); sprintf(mail_key, "%08X%08X", IPAddress, MailKey);
else }
sprintf(MailKeyString, "%08X", MailKey); else {
sprintf(mail_key, "%08X", MailKey);
}
const std::string query = StringFormat("UPDATE character_data SET mailkey = '%s' WHERE id = '%i'", const std::string query = StringFormat(
MailKeyString, CharID); "UPDATE character_data SET mailkey = '%s' WHERE id = '%i'",
const auto results = QueryDatabase(query); mail_key, CharID
if (!results.Success()) );
LogError("SharedDatabase::SetMailKey({}, {}) : {}", CharID, MailKeyString, results.ErrorMessage().c_str());
const auto results = QueryDatabase(query);
if (!results.Success()) {
LogError("SharedDatabase::SetMailKey({}, {}) : {}", CharID, mail_key, results.ErrorMessage().c_str());
}
} }
std::string SharedDatabase::GetMailKey(int CharID, bool key_only) SharedDatabase::MailKeys SharedDatabase::GetMailKey(int character_id)
{ {
const std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `id`='%i' LIMIT 1", CharID); const std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `id`='%i' LIMIT 1", character_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
return MailKeys{};
Log(Logs::Detail, Logs::MySQLError, "Error retrieving mailkey from database: %s", results.ErrorMessage().c_str());
return std::string();
} }
if (!results.RowCount()) { if (!results.RowCount()) {
Log(Logs::General,
Log(Logs::General, Logs::ClientLogin, "Error: Mailkey for character id [%i] does not exist or could not be found", CharID); Logs::ClientLogin,
return std::string(); "Error: Mailkey for character id [%i] does not exist or could not be found",
character_id
);
return MailKeys{};
} }
auto& row = results.begin(); auto &row = results.begin();
if (row != results.end()) { if (row != results.end()) {
std::string mail_key = row[0]; std::string mail_key = row[0];
if (mail_key.length() > 8 && key_only) { return MailKeys{
return mail_key.substr(8); .mail_key = mail_key.substr(8),
} .mail_key_full = mail_key
else { };
return mail_key;
}
} }
else {
Log(Logs::General, Logs::MySQLError, "Internal MySQL error in SharedDatabase::GetMailKey(int, bool)"); return MailKeys{};
return std::string();
}
} }
bool SharedDatabase::SaveCursor(uint32 char_id, std::list<EQ::ItemInstance*>::const_iterator &start, std::list<EQ::ItemInstance*>::const_iterator &end) bool SharedDatabase::SaveCursor(uint32 char_id, std::list<EQ::ItemInstance*>::const_iterator &start, std::list<EQ::ItemInstance*>::const_iterator &end)

View File

@ -81,7 +81,11 @@ public:
bool SetGMInvul(uint32 account_id, bool gminvul); bool SetGMInvul(uint32 account_id, bool gminvul);
bool SetGMFlymode(uint32 account_id, uint8 flymode); bool SetGMFlymode(uint32 account_id, uint8 flymode);
void SetMailKey(int CharID, int IPAddress, int MailKey); void SetMailKey(int CharID, int IPAddress, int MailKey);
std::string GetMailKey(int CharID, bool key_only = false); struct MailKeys {
std::string mail_key;
std::string mail_key_full;
};
MailKeys GetMailKey(int character_id);
bool SaveCursor( bool SaveCursor(
uint32 char_id, uint32 char_id,
std::list<EQ::ItemInstance *>::const_iterator &start, std::list<EQ::ItemInstance *>::const_iterator &start,

View File

@ -11238,7 +11238,7 @@ void Client::ReconnectUCS()
{ {
EQApplicationPacket *outapp = nullptr; EQApplicationPacket *outapp = nullptr;
std::string buffer; std::string buffer;
std::string mail_key = database.GetMailKey(CharacterID(), true); std::string mail_key = m_mail_key;
EQ::versions::UCSVersion connection_type = EQ::versions::ucsUnknown; EQ::versions::UCSVersion connection_type = EQ::versions::ucsUnknown;
// chat server packet // chat server packet

View File

@ -2038,6 +2038,13 @@ private:
bool CanTradeFVNoDropItem(); bool CanTradeFVNoDropItem();
void SendMobPositions(); void SendMobPositions();
void PlayerTradeEventLog(Trade *t, Trade *t2); void PlayerTradeEventLog(Trade *t, Trade *t2);
// full and partial mail key cache
std::string m_mail_key_full;
std::string m_mail_key;
public:
const std::string &GetMailKeyFull() const;
const std::string &GetMailKey() const;
}; };
#endif #endif

View File

@ -1267,6 +1267,12 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
database.LoadCharacterLeadershipAA(cid, &m_pp); /* Load Character Leadership AA's */ database.LoadCharacterLeadershipAA(cid, &m_pp); /* Load Character Leadership AA's */
database.LoadCharacterTribute(cid, &m_pp); /* Load CharacterTribute */ database.LoadCharacterTribute(cid, &m_pp); /* Load CharacterTribute */
// this pattern is strange
// this is remnants of the old way of doing things
auto mail_keys = database.GetMailKey(CharacterID());
m_mail_key_full = mail_keys.mail_key_full;
m_mail_key = mail_keys.mail_key;
/* Load AdventureStats */ /* Load AdventureStats */
AdventureStats_Struct as; AdventureStats_Struct as;
if (database.GetAdventureStats(cid, &as)) if (database.GetAdventureStats(cid, &as))
@ -11677,7 +11683,7 @@ void Client::Handle_OP_QueryUCSServerStatus(const EQApplicationPacket *app)
EQApplicationPacket* outapp = nullptr; EQApplicationPacket* outapp = nullptr;
std::string buffer; std::string buffer;
std::string MailKey = database.GetMailKey(CharacterID(), true); std::string MailKey = GetMailKey();
EQ::versions::UCSVersion ConnectionType = EQ::versions::ucsUnknown; EQ::versions::UCSVersion ConnectionType = EQ::versions::ucsUnknown;
// chat server packet // chat server packet

View File

@ -3018,3 +3018,13 @@ void Client::BuyerItemSearch(const EQApplicationPacket *app) {
QueuePacket(outapp); QueuePacket(outapp);
safe_delete(outapp); safe_delete(outapp);
} }
const std::string &Client::GetMailKeyFull() const
{
return m_mail_key_full;
}
const std::string &Client::GetMailKey() const
{
return m_mail_key;
}

View File

@ -1132,8 +1132,6 @@ bool ZoneDatabase::SaveCharacterData(
return false; return false;
} }
const auto mail_key = database.GetMailKey(c->CharacterID());
clock_t t = std::clock(); /* Function timer start */ clock_t t = std::clock(); /* Function timer start */
const auto query = fmt::format( const auto query = fmt::format(
"REPLACE INTO `character_data` (" "REPLACE INTO `character_data` ("
@ -1427,7 +1425,7 @@ bool ZoneDatabase::SaveCharacterData(
m_epp->perAA, m_epp->perAA,
m_epp->expended_aa, m_epp->expended_aa,
m_epp->last_invsnapshot_time, m_epp->last_invsnapshot_time,
mail_key.c_str() c->GetMailKeyFull()
); );
auto results = database.QueryDatabase(query); auto results = database.QueryDatabase(query);
LogDebug( LogDebug(