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)

View File

@@ -112,6 +112,12 @@ enum ChatRestrictionType
ERR_YELL_RESTRICTED = 3
};
enum DeclinedNameResult
{
DECLINED_NAMES_RESULT_SUCCESS = 0,
DECLINED_NAMES_RESULT_ERROR = 1
};
enum CharterTypes
{
GUILD_CHARTER_TYPE = 9,
@@ -165,29 +171,53 @@ class CharacterCreateInfo
friend class Player;
protected:
CharacterCreateInfo(std::string name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId,
WorldPacket& data) : Name(std::move(name)), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair),
OutfitId(outfitId), Data(data), CharCount(0)
{}
/// User specified variables
std::string Name;
uint8 Race;
uint8 Class;
uint8 Gender;
uint8 Skin;
uint8 Face;
uint8 HairStyle;
uint8 HairColor;
uint8 FacialHair;
uint8 OutfitId;
WorldPacket Data;
uint8 Race = 0;
uint8 Class = 0;
uint8 Gender = GENDER_NONE;
uint8 Skin = 0;
uint8 Face = 0;
uint8 HairStyle = 0;
uint8 HairColor = 0;
uint8 FacialHair = 0;
uint8 OutfitId = 0;
/// Server side data
uint8 CharCount;
uint8 CharCount = 0;
};
private:
virtual ~CharacterCreateInfo() = default;
struct CharacterRenameInfo
{
friend class WorldSession;
protected:
ObjectGuid Guid;
std::string Name;
};
struct CharacterCustomizeInfo : public CharacterRenameInfo
{
friend class Player;
friend class WorldSession;
protected:
uint8 Gender = GENDER_NONE;
uint8 Skin = 0;
uint8 Face = 0;
uint8 HairStyle = 0;
uint8 HairColor = 0;
uint8 FacialHair = 0;
};
struct CharacterFactionChangeInfo : public CharacterCustomizeInfo
{
friend class Player;
friend class WorldSession;
protected:
uint8 Race = 0;
bool FactionChange = false;
};
struct PacketCounter
@@ -303,7 +333,7 @@ public:
// Pet
void SendPetNameQuery(ObjectGuid guid, uint32 petnumber);
void SendStablePet(ObjectGuid guid);
void SendStablePetCallback(PreparedQueryResult result, ObjectGuid guid);
void SendStablePetCallback(ObjectGuid guid, PreparedQueryResult result);
void SendStableResult(uint8 guid);
bool CheckStableMaster(ObjectGuid guid);
@@ -316,7 +346,7 @@ public:
void LoadTutorialsData();
void SendTutorialsData();
void SaveTutorialsData(SQLTransaction& trans);
void SaveTutorialsData(CharacterDatabaseTransaction trans);
uint32 GetTutorialInt(uint8 index) const { return m_Tutorials[index]; }
void SetTutorialInt(uint8 index, uint32 value)
{
@@ -403,13 +433,20 @@ public: // opcodes handlers
void HandleCharEnumOpcode(WorldPacket& recvPacket);
void HandleCharDeleteOpcode(WorldPacket& recvPacket);
void HandleCharCreateOpcode(WorldPacket& recvPacket);
void HandleCharCreateCallback(PreparedQueryResult result, CharacterCreateInfo* createInfo);
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
void HandleCharEnum(PreparedQueryResult result);
void HandlePlayerLoginFromDB(LoginQueryHolder* holder);
void HandlePlayerLoginFromDB(LoginQueryHolder const& holder);
void HandlePlayerLoginToCharInWorld(Player* pCurrChar);
void HandlePlayerLoginToCharOutOfWorld(Player* pCurrChar);
void HandleCharFactionOrRaceChange(WorldPacket& recvData);
void HandleCharFactionOrRaceChangeCallback(std::shared_ptr<CharacterFactionChangeInfo> factionChangeInfo, PreparedQueryResult result);
void SendCharCreate(ResponseCodes result);
void SendCharDelete(ResponseCodes result);
void SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo);
void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const* customizeInfo);
void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const* factionChangeInfo);
void SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid);
// played time
void HandlePlayedTime(WorldPacket& recvPacket);
@@ -592,16 +629,16 @@ public: // opcodes handlers
void HandleStablePet(WorldPacket& recvPacket);
void HandleStablePetCallback(PreparedQueryResult result);
void HandleUnstablePet(WorldPacket& recvPacket);
void HandleUnstablePetCallback(PreparedQueryResult result, uint32 petId);
void HandleUnstablePetCallback(uint32 petId, PreparedQueryResult result);
void HandleBuyStableSlot(WorldPacket& recvPacket);
void HandleStableRevivePet(WorldPacket& recvPacket);
void HandleStableSwapPet(WorldPacket& recvPacket);
void HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId);
void HandleOpenWrappedItemCallback(PreparedQueryResult result, uint8 bagIndex, uint8 slot, ObjectGuid::LowType itemLowGUID);
void HandleStableSwapPetCallback(uint32 petId, PreparedQueryResult result);
void HandleOpenWrappedItemCallback(uint8 bagIndex, uint8 slot, ObjectGuid::LowType itemLowGUID, PreparedQueryResult result);
void HandleLoadActionsSwitchSpec(PreparedQueryResult result);
void HandleCharacterAuraFrozen(PreparedQueryResult result);
uint8 HandleLoadPetFromDBFirstCallback(PreparedQueryResult result, uint8 asynchLoadType);
void HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder* holder);
void HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder const& holder);
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
@@ -753,7 +790,7 @@ public: // opcodes handlers
void HandleSetActionBarToggles(WorldPacket& recvData);
void HandleCharRenameOpcode(WorldPacket& recvData);
void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName);
void HandleCharRenameCallBack(std::shared_ptr<CharacterRenameInfo> renameInfo, PreparedQueryResult result);
void HandleSetPlayerDeclinedNames(WorldPacket& recvData);
void HandleTotemDestroyed(WorldPacket& recvData);
@@ -903,6 +940,7 @@ public: // opcodes handlers
void HandleAlterAppearance(WorldPacket& recvData);
void HandleRemoveGlyph(WorldPacket& recvData);
void HandleCharCustomize(WorldPacket& recvData);
void HandleCharCustomizeCallback(std::shared_ptr<CharacterCustomizeInfo> customizeInfo, PreparedQueryResult result);
void HandleQueryInspectAchievements(WorldPacket& recvData);
void HandleEquipmentSetSave(WorldPacket& recvData);
void HandleEquipmentSetDelete(WorldPacket& recvData);
@@ -915,9 +953,6 @@ public: // opcodes handlers
void HandleEnterPlayerVehicle(WorldPacket& data);
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
// _loadPetFromDBFirstCallback helpers
//QueryCallback<PreparedQueryResult, uint64> GetLoadPetFromDBFirstCallback() { return _loadPetFromDBFirstCallback; }
uint32 _lastAuctionListItemsMSTime;
uint32 _lastAuctionListOwnerItemsMSTime;
@@ -931,28 +966,20 @@ public: // opcodes handlers
bool GetShouldSetOfflineInDB() const { return _shouldSetOfflineInDB; }
bool IsSocketClosed() const;
/***
CALLBACKS
***/
/*
* CALLBACKS
*/
QueryCallbackProcessor& GetQueryProcessor() { return _queryProcessor; }
TransactionCallback& AddTransactionCallback(TransactionCallback&& callback);
SQLQueryHolderCallback& AddQueryHolderCallback(SQLQueryHolderCallback&& callback);
private:
void InitializeQueryCallbackParameters();
void ProcessQueryCallbacks();
void ProcessQueryCallbackPlayer();
void ProcessQueryCallbackPet();
void ProcessQueryCallbackLogin();
PreparedQueryResultFuture _charEnumCallback;
PreparedQueryResultFuture _stablePetCallback;
QueryCallback<PreparedQueryResult, std::string> _charRenameCallback;
QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback;
QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback;
QueryCallback<PreparedQueryResult, ObjectGuid> _sendStabledPetCallback;
QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback;
QueryResultHolderFuture _charLoginCallback;
QueryResultHolderFuture _loadPetFromDBSecondCallback;
QueryCallback_3<PreparedQueryResult, uint8, uint8, uint32> _openWrappedItemCallback;
QueryCallbackProcessor _queryProcessor;
AsyncCallbackProcessor<TransactionCallback> _transactionCallbacks;
AsyncCallbackProcessor<SQLQueryHolderCallback> _queryHolderProcessor;
friend class World;
protected:
@@ -984,15 +1011,6 @@ protected:
DosProtection& operator=(DosProtection const& right) = delete;
} AntiDOS;
public:
// xinef: those must be public, requires calls out of worldsession :(
QueryCallback_2<PreparedQueryResult, uint32, AsynchPetSummon*> _loadPetFromDBFirstCallback;
PreparedQueryResultFuture _loadActionsSwitchSpecCallback;
PreparedQueryResultFuture _CharacterAuraFrozenCallback;
/***
END OF CALLBACKS
***/
private:
// private trade methods
void moveItems(Item* myItems[], Item* hisItems[]);