diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-10-24 17:37:24 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-28 22:41:36 +0100 |
| commit | 357147834e3d9e4c2822a0a5b895152d6639268d (patch) | |
| tree | 3d8a8ede9e57cb1ccea02c4a80eea3e6aa9a6077 /src/server/game/Handlers/CharacterHandler.cpp | |
| parent | f400a1cf365fd83241b5485cc731a48fd40b5943 (diff) | |
Core/DBLayer: Fixed memory leaks with existing SQLQueryHolder uses and eliminated the possibilty of adding more in future (replaced manual memory management with smart pointers)
(cherry picked from commit 53482f729995889936ad8fba9fc5789d9cdba85a)
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index f13a3e6e33e..17588a3e0fb 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -382,18 +382,18 @@ private: bool _isDeletedCharacters = false; }; -void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder* holder) +void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder) { WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; - charEnum.IsDeletedCharacters = static_cast<EnumCharactersQueryHolder*>(holder)->IsDeletedCharacters(); + charEnum.IsDeletedCharacters = static_cast<EnumCharactersQueryHolder const&>(holder).IsDeletedCharacters(); charEnum.DisabledClassesMask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK); if (!charEnum.IsDeletedCharacters) _legitCharacters.clear(); std::unordered_map<ObjectGuid::LowType, std::vector<UF::ChrCustomizationChoice>> customizations; - if (PreparedQueryResult customizationsResult = holder->GetPreparedResult(EnumCharactersQueryHolder::CUSTOMIZATIONS)) + if (PreparedQueryResult customizationsResult = holder.GetPreparedResult(EnumCharactersQueryHolder::CUSTOMIZATIONS)) { do { @@ -408,7 +408,7 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder* holder) } while (customizationsResult->NextRow()); } - if (PreparedQueryResult result = holder->GetPreparedResult(EnumCharactersQueryHolder::CHARACTERS)) + if (PreparedQueryResult result = holder.GetPreparedResult(EnumCharactersQueryHolder::CHARACTERS)) { do { @@ -466,8 +466,6 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder* holder) } SendPacket(charEnum.Write()); - - delete holder; } void WorldSession::HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/) @@ -477,32 +475,32 @@ void WorldSession::HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& CharacterDatabase.Execute(stmt); /// get all the data necessary for loading all characters (along with their pets) on the account - EnumCharactersQueryHolder* holder = new EnumCharactersQueryHolder(); + std::shared_ptr<EnumCharactersQueryHolder> holder = std::make_shared<EnumCharactersQueryHolder>(); if (!holder->Initialize(GetAccountId(), sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED), false)) { - HandleCharEnum(holder); + HandleCharEnum(*holder); return; } - AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase* result) + AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& result) { - HandleCharEnum(static_cast<EnumCharactersQueryHolder*>(result)); + HandleCharEnum(static_cast<EnumCharactersQueryHolder const&>(result)); }); } void WorldSession::HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/) { /// get all the data necessary for loading all undeleted characters (along with their pets) on the account - EnumCharactersQueryHolder* holder = new EnumCharactersQueryHolder(); + std::shared_ptr<EnumCharactersQueryHolder> holder = std::make_shared<EnumCharactersQueryHolder>(); if (!holder->Initialize(GetAccountId(), sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED), true)) { - HandleCharEnum(holder); + HandleCharEnum(*holder); return; } - AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase* result) + AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& result) { - HandleCharEnum(static_cast<EnumCharactersQueryHolder*>(result)); + HandleCharEnum(static_cast<EnumCharactersQueryHolder const&>(result)); }); } @@ -1029,19 +1027,18 @@ void WorldSession::HandleContinuePlayerLogin() return; } - LoginQueryHolder* holder = new LoginQueryHolder(GetAccountId(), m_playerLoading); + std::shared_ptr<LoginQueryHolder> holder = std::make_shared<LoginQueryHolder>(GetAccountId(), m_playerLoading); if (!holder->Initialize()) { - delete holder; // delete all unprocessed queries m_playerLoading.Clear(); return; } SendPacket(WorldPackets::Auth::ResumeComms(CONNECTION_TYPE_INSTANCE).Write()); - AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase* holder) + AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& holder) { - HandlePlayerLogin(static_cast<LoginQueryHolder*>(holder)); + HandlePlayerLogin(static_cast<LoginQueryHolder const&>(holder)); }); } @@ -1062,9 +1059,9 @@ void WorldSession::HandleLoadScreenOpcode(WorldPackets::Character::LoadingScreen // TODO: Do something with this packet } -void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) +void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder) { - ObjectGuid playerGuid = holder->GetGuid(); + ObjectGuid playerGuid = holder.GetGuid(); Player* pCurrChar = new Player(this); // for send server info and strings (config) @@ -1076,7 +1073,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) SetPlayer(nullptr); KickPlayer("WorldSession::HandlePlayerLogin Player::LoadFromDB failed"); // disconnect client, player no set to session and it will not deleted or saved at kick delete pCurrChar; // delete it manually - delete holder; // delete all unprocessed queries m_playerLoading.Clear(); return; } @@ -1095,7 +1091,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) SendPacket(loginVerifyWorld.Write()); // load player specific part before send times - LoadAccountData(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA), PER_CHARACTER_CACHE_MASK); + LoadAccountData(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA), PER_CHARACTER_CACHE_MASK); SendAccountDataTimes(playerGuid, ALL_ACCOUNT_DATA_CACHE_MASK); SendFeatureSystemStatus(); @@ -1127,7 +1123,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) } //QueryResult* result = CharacterDatabase.PQuery("SELECT guildid, `rank` FROM guild_member WHERE guid = '%u'", pCurrChar->GetGUIDLow()); - if (PreparedQueryResult resultGuild = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GUILD)) + if (PreparedQueryResult resultGuild = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GUILD)) { Field* fields = resultGuild->Fetch(); pCurrChar->SetInGuild(fields[0].GetUInt64()); @@ -1237,7 +1233,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) sSocialMgr->SendFriendStatus(pCurrChar, FRIEND_ONLINE, pCurrChar->GetGUID(), true); // Place character in world (and load zone) before some object loading - pCurrChar->LoadCorpse(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION)); + pCurrChar->LoadCorpse(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION)); stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_FAVORITE_AUCTIONS); stmt->setUInt64(0, pCurrChar->GetGUID().GetCounter()); @@ -1429,8 +1425,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin); TC_METRIC_EVENT("player_events", "Login", pCurrChar->GetName()); - - delete holder; } void WorldSession::SendFeatureSystemStatus() |
