mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-15 10:00:28 +00:00
feat(Core/Database): port TrinityCore database API (#5611)
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "World.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "WorldSession.h"
|
||||
#include "QueryHolder.h"
|
||||
#include "zlib.h"
|
||||
|
||||
#ifdef ELUNA
|
||||
@@ -139,8 +140,6 @@ WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8
|
||||
ResetTimeOutTime(false);
|
||||
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId());
|
||||
}
|
||||
|
||||
InitializeQueryCallbackParameters();
|
||||
}
|
||||
|
||||
/// WorldSession destructor
|
||||
@@ -569,7 +568,7 @@ void WorldSession::LogoutPlayer(bool save)
|
||||
{
|
||||
if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK);
|
||||
stmt->setUInt32(0, _player->GetGUID().GetCounter());
|
||||
stmt->setUInt8(1, BG_DESERTION_TYPE_INVITE_LOGOUT);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
@@ -668,7 +667,7 @@ void WorldSession::LogoutPlayer(bool save)
|
||||
LOG_DEBUG("network", "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
|
||||
|
||||
//! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
@@ -772,7 +771,7 @@ void WorldSession::SendAuthWaitQue(uint32 position)
|
||||
|
||||
void WorldSession::LoadGlobalAccountData()
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_DATA);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_DATA);
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
LoadAccountData(CharacterDatabase.Query(stmt), GLOBAL_CACHE_MASK);
|
||||
}
|
||||
@@ -810,7 +809,7 @@ void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask)
|
||||
void WorldSession::SetAccountData(AccountDataType type, time_t tm, std::string const& data)
|
||||
{
|
||||
uint32 id = 0;
|
||||
uint32 index = 0;
|
||||
CharacterDatabaseStatements index;
|
||||
if ((1 << type) & GLOBAL_CACHE_MASK)
|
||||
{
|
||||
id = GetAccountId();
|
||||
@@ -826,7 +825,7 @@ void WorldSession::SetAccountData(AccountDataType type, time_t tm, std::string c
|
||||
index = CHAR_REP_PLAYER_ACCOUNT_DATA;
|
||||
}
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(index);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(index);
|
||||
stmt->setUInt32(0, id);
|
||||
stmt->setUInt8(1, type);
|
||||
stmt->setUInt32(2, uint32(tm));
|
||||
@@ -853,7 +852,7 @@ void WorldSession::LoadTutorialsData()
|
||||
{
|
||||
memset(m_Tutorials, 0, sizeof(uint32) * MAX_ACCOUNT_TUTORIAL_VALUES);
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_TUTORIALS);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_TUTORIALS);
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
|
||||
for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i)
|
||||
@@ -870,12 +869,12 @@ void WorldSession::SendTutorialsData()
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
void WorldSession::SaveTutorialsData(SQLTransaction& trans)
|
||||
void WorldSession::SaveTutorialsData(CharacterDatabaseTransaction trans)
|
||||
{
|
||||
if (!m_TutorialsChanged)
|
||||
return;
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_HAS_TUTORIALS);
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_HAS_TUTORIALS);
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
bool hasTutorials = bool(CharacterDatabase.Query(stmt));
|
||||
|
||||
@@ -1198,181 +1197,21 @@ void WorldSession::SetPlayer(Player* player)
|
||||
m_GUIDLow = _player->GetGUID().GetCounter();
|
||||
}
|
||||
|
||||
void WorldSession::InitializeQueryCallbackParameters()
|
||||
{
|
||||
// Callback parameters that have pointers in them should be properly
|
||||
// initialized to nullptr here.
|
||||
_charCreateCallback.SetParam(nullptr);
|
||||
_loadPetFromDBFirstCallback.SetFirstParam(0);
|
||||
_loadPetFromDBFirstCallback.SetSecondParam(nullptr);
|
||||
}
|
||||
|
||||
void WorldSession::ProcessQueryCallbacks()
|
||||
{
|
||||
ProcessQueryCallbackPlayer();
|
||||
ProcessQueryCallbackPet();
|
||||
ProcessQueryCallbackLogin();
|
||||
_queryProcessor.ProcessReadyCallbacks();
|
||||
_transactionCallbacks.ProcessReadyCallbacks();
|
||||
_queryHolderProcessor.ProcessReadyCallbacks();
|
||||
}
|
||||
|
||||
void WorldSession::ProcessQueryCallbackPlayer()
|
||||
TransactionCallback& WorldSession::AddTransactionCallback(TransactionCallback&& callback)
|
||||
{
|
||||
PreparedQueryResult result;
|
||||
|
||||
//- HandleCharRenameOpcode
|
||||
if (_charRenameCallback.IsReady())
|
||||
{
|
||||
std::string param = _charRenameCallback.GetParam();
|
||||
_charRenameCallback.GetResult(result);
|
||||
HandleChangePlayerNameOpcodeCallBack(result, param);
|
||||
_charRenameCallback.FreeResult();
|
||||
}
|
||||
|
||||
//- HandleOpenItemOpcode
|
||||
if (_openWrappedItemCallback.IsReady())
|
||||
{
|
||||
uint8 bagIndex = _openWrappedItemCallback.GetFirstParam();
|
||||
uint8 slot = _openWrappedItemCallback.GetSecondParam();
|
||||
ObjectGuid::LowType itemLowGUID = _openWrappedItemCallback.GetThirdParam();
|
||||
_openWrappedItemCallback.GetResult(result);
|
||||
HandleOpenWrappedItemCallback(result, bagIndex, slot, itemLowGUID);
|
||||
_openWrappedItemCallback.FreeResult();
|
||||
}
|
||||
|
||||
//- Player - ActivateSpec
|
||||
if (_loadActionsSwitchSpecCallback.ready())
|
||||
{
|
||||
_loadActionsSwitchSpecCallback.get(result);
|
||||
HandleLoadActionsSwitchSpec(result);
|
||||
_loadActionsSwitchSpecCallback.cancel();
|
||||
}
|
||||
return _transactionCallbacks.AddCallback(std::move(callback));
|
||||
}
|
||||
|
||||
void WorldSession::ProcessQueryCallbackPet()
|
||||
SQLQueryHolderCallback& WorldSession::AddQueryHolderCallback(SQLQueryHolderCallback&& callback)
|
||||
{
|
||||
PreparedQueryResult result;
|
||||
|
||||
//- SendStabledPet
|
||||
if (_sendStabledPetCallback.IsReady())
|
||||
{
|
||||
ObjectGuid param = _sendStabledPetCallback.GetParam();
|
||||
_sendStabledPetCallback.GetResult(result);
|
||||
SendStablePetCallback(result, param);
|
||||
_sendStabledPetCallback.FreeResult();
|
||||
return;
|
||||
}
|
||||
|
||||
//- HandleStablePet
|
||||
if (_stablePetCallback.ready())
|
||||
{
|
||||
_stablePetCallback.get(result);
|
||||
HandleStablePetCallback(result);
|
||||
_stablePetCallback.cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
//- HandleUnstablePet
|
||||
if (_unstablePetCallback.IsReady())
|
||||
{
|
||||
uint32 param = _unstablePetCallback.GetParam();
|
||||
_unstablePetCallback.GetResult(result);
|
||||
HandleUnstablePetCallback(result, param);
|
||||
_unstablePetCallback.FreeResult();
|
||||
return;
|
||||
}
|
||||
|
||||
//- HandleStableSwapPet
|
||||
if (_stableSwapCallback.IsReady())
|
||||
{
|
||||
uint32 param = _stableSwapCallback.GetParam();
|
||||
_stableSwapCallback.GetResult(result);
|
||||
HandleStableSwapPetCallback(result, param);
|
||||
_stableSwapCallback.FreeResult();
|
||||
return;
|
||||
}
|
||||
|
||||
//- LoadPetFromDB first part
|
||||
if (_loadPetFromDBFirstCallback.IsReady())
|
||||
{
|
||||
Player* player = GetPlayer();
|
||||
if (!player)
|
||||
{
|
||||
if (AsynchPetSummon* info = _loadPetFromDBFirstCallback.GetSecondParam())
|
||||
delete info;
|
||||
_loadPetFromDBFirstCallback.Reset();
|
||||
return;
|
||||
}
|
||||
// process only if player is in world (teleport crashes?)
|
||||
// otherwise wait with result till he logs in
|
||||
if (player->IsInWorld())
|
||||
{
|
||||
uint8 asynchLoadType = _loadPetFromDBFirstCallback.GetFirstParam();
|
||||
_loadPetFromDBFirstCallback.GetResult(result);
|
||||
|
||||
uint8 loadResult = HandleLoadPetFromDBFirstCallback(result, asynchLoadType);
|
||||
if (loadResult != PET_LOAD_OK)
|
||||
Pet::HandleAsynchLoadFailed(_loadPetFromDBFirstCallback.GetSecondParam(), player, asynchLoadType, loadResult);
|
||||
|
||||
if (AsynchPetSummon* info = _loadPetFromDBFirstCallback.GetSecondParam())
|
||||
delete info;
|
||||
_loadPetFromDBFirstCallback.Reset();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//- LoadPetFromDB second part
|
||||
if (_loadPetFromDBSecondCallback.ready())
|
||||
{
|
||||
Player* player = GetPlayer();
|
||||
if (!player)
|
||||
{
|
||||
SQLQueryHolder* param;
|
||||
_loadPetFromDBSecondCallback.get(param);
|
||||
delete param;
|
||||
_loadPetFromDBSecondCallback.cancel();
|
||||
}
|
||||
else if (!player->IsInWorld())
|
||||
{
|
||||
// wait
|
||||
}
|
||||
else
|
||||
{
|
||||
SQLQueryHolder* param;
|
||||
_loadPetFromDBSecondCallback.get(param);
|
||||
HandleLoadPetFromDBSecondCallback((LoadPetFromDBQueryHolder*)param);
|
||||
delete param;
|
||||
_loadPetFromDBSecondCallback.cancel();
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::ProcessQueryCallbackLogin()
|
||||
{
|
||||
PreparedQueryResult result;
|
||||
|
||||
//! HandleCharEnumOpcode
|
||||
if (_charEnumCallback.ready())
|
||||
{
|
||||
_charEnumCallback.get(result);
|
||||
HandleCharEnum(result);
|
||||
_charEnumCallback.cancel();
|
||||
}
|
||||
|
||||
if (_charCreateCallback.IsReady())
|
||||
{
|
||||
_charCreateCallback.GetResult(result);
|
||||
HandleCharCreateCallback(result, _charCreateCallback.GetParam());
|
||||
// Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain
|
||||
}
|
||||
|
||||
//! HandlePlayerLoginOpcode
|
||||
if (_charLoginCallback.ready())
|
||||
{
|
||||
SQLQueryHolder* param;
|
||||
_charLoginCallback.get(param);
|
||||
HandlePlayerLoginFromDB((LoginQueryHolder*)param);
|
||||
_charLoginCallback.cancel();
|
||||
}
|
||||
return _queryHolderProcessor.AddCallback(std::move(callback));
|
||||
}
|
||||
|
||||
void WorldSession::InitWarden(SessionKey const& k, std::string const& os)
|
||||
|
||||
Reference in New Issue
Block a user