feat(Core/Database): port TrinityCore database API (#5611)

This commit is contained in:
Kargatum
2021-06-22 11:21:07 +07:00
committed by GitHub
parent 2a2e54d8c5
commit 9ac6fddcae
155 changed files with 5818 additions and 4321 deletions

View File

@@ -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)