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

@@ -5,7 +5,7 @@
#ifndef AZEROTHCORE_IWORLD_H
#define AZEROTHCORE_IWORLD_H
#include "Callback.h"
#include "AsyncCallbackProcessor.h"
#include "Common.h"
#include "ObjectGuid.h"
#include "QueryResult.h"

View File

@@ -2117,7 +2117,7 @@ void World::LoadAutobroadcasts()
m_AutobroadcastsWeights.clear();
uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0);
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST);
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST);
stmt->setInt32(0, realmId);
PreparedQueryResult result = LoginDatabase.Query(stmt);
@@ -2176,7 +2176,7 @@ void World::Update(uint32 diff)
m_timers[WUPDATE_5_SECS].Reset();
// moved here from HandleCharEnumOpcode
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_BANS);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_BANS);
CharacterDatabase.Execute(stmt);
// copy players hashmapholder to avoid mutex
@@ -2250,7 +2250,7 @@ void World::Update(uint32 diff)
{
m_timers[WUPDATE_CLEANDB].Reset();
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_OLD_LOGS);
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_OLD_LOGS);
stmt->setUInt32(0, sWorld->getIntConfig(CONFIG_LOGDB_CLEARTIME));
stmt->setUInt32(1, uint32(time(0)));
@@ -2291,7 +2291,7 @@ void World::Update(uint32 diff)
m_timers[WUPDATE_UPTIME].Reset();
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_UPTIME_PLAYERS);
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_UPTIME_PLAYERS);
stmt->setUInt32(0, tmpDiff);
stmt->setUInt16(1, uint16(maxOnlinePlayers));
@@ -2804,11 +2804,9 @@ void World::SendAutoBroadcast()
void World::UpdateRealmCharCount(uint32 accountId)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_COUNT);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_COUNT);
stmt->setUInt32(0, accountId);
stmt->setUInt32(1, accountId);
PreparedQueryResultFuture result = CharacterDatabase.AsyncQuery(stmt);
m_realmCharCallbacks.insert(result);
_queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&World::_UpdateRealmCharCount, this, std::placeholders::_1)));
}
void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount)
@@ -2819,9 +2817,9 @@ void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount)
uint32 accountId = fields[0].GetUInt32();
uint8 charCount = uint8(fields[1].GetUInt64());
SQLTransaction trans = LoginDatabase.BeginTransaction();
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM);
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM);
stmt->setUInt32(0, accountId);
stmt->setUInt32(1, realm.Id.Realm);
trans->Append(stmt);
@@ -2940,7 +2938,7 @@ void World::InitGuildResetTime()
void World::ResetDailyQuests()
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY);
CharacterDatabase.Execute(stmt);
for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -2956,7 +2954,7 @@ void World::ResetDailyQuests()
void World::LoadDBAllowedSecurityLevel()
{
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL);
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL);
stmt->setInt32(0, int32(realm.Id.Realm));
PreparedQueryResult result = LoginDatabase.Query(stmt);
@@ -2975,7 +2973,7 @@ void World::SetPlayerSecurityLimit(AccountTypes _sec)
void World::ResetWeeklyQuests()
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY);
CharacterDatabase.Execute(stmt);
for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -2993,7 +2991,7 @@ void World::ResetMonthlyQuests()
{
LOG_INFO("server.worldserver", "Monthly quests reset for all characters.");
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY);
CharacterDatabase.Execute(stmt);
for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -3006,7 +3004,7 @@ void World::ResetMonthlyQuests()
void World::ResetEventSeasonalQuests(uint16 event_id)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL);
stmt->setUInt16(0, event_id);
CharacterDatabase.Execute(stmt);
@@ -3019,7 +3017,7 @@ void World::ResetRandomBG()
{
LOG_DEBUG("server.worldserver", "Random BG status reset for all characters.");
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_BATTLEGROUND_RANDOM);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_BATTLEGROUND_RANDOM);
CharacterDatabase.Execute(stmt);
for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
@@ -3154,7 +3152,7 @@ void World::setWorldState(uint32 index, uint64 value)
WorldStatesMap::const_iterator it = m_worldstates.find(index);
if (it != m_worldstates.end())
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_WORLDSTATE);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_WORLDSTATE);
stmt->setUInt32(0, uint32(value));
stmt->setUInt32(1, index);
@@ -3163,7 +3161,7 @@ void World::setWorldState(uint32 index, uint64 value)
}
else
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_WORLDSTATE);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_WORLDSTATE);
stmt->setUInt32(0, index);
stmt->setUInt32(1, uint32(value));
@@ -3181,22 +3179,7 @@ uint64 World::getWorldState(uint32 index) const
void World::ProcessQueryCallbacks()
{
PreparedQueryResult result;
while (!m_realmCharCallbacks.is_empty())
{
ACE_Future<PreparedQueryResult> lResult;
ACE_Time_Value timeout = ACE_Time_Value::zero;
if (m_realmCharCallbacks.next_readable(lResult, &timeout) != 1)
break;
if (lResult.ready())
{
lResult.get(result);
_UpdateRealmCharCount(result);
lResult.cancel();
}
}
_queryProcessor.ProcessReadyCallbacks();
}
void World::LoadGlobalPlayerDataStore()
@@ -3364,7 +3347,7 @@ GlobalPlayerData const* World::GetGlobalPlayerData(ObjectGuid::LowType guid) con
return &itr->second;
// Player is not in the global storage, try to get it from the Database
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_DATA_BY_GUID);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_DATA_BY_GUID);
stmt->setUInt32(0, guid);
@@ -3412,7 +3395,7 @@ ObjectGuid World::GetGlobalPlayerGUID(std::string const& name) const
return ObjectGuid::Create<HighGuid::Player>(itr->second);
// Player is not in the global storage, try to get it from the Database
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_DATA_BY_NAME);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_DATA_BY_NAME);
stmt->setString(0, name);
@@ -3467,3 +3450,15 @@ bool World::IsFFAPvPRealm() const
{
return getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP;
}
uint32 World::GetNextWhoListUpdateDelaySecs()
{
if (m_timers[WUPDATE_5_SECS].Passed())
return 1;
uint32 t = m_timers[WUPDATE_5_SECS].GetInterval() - m_timers[WUPDATE_5_SECS].GetCurrent();
t = std::min(t, (uint32)m_timers[WUPDATE_5_SECS].GetInterval());
return uint32(ceil(t / 1000.0f));
}

View File

@@ -11,8 +11,6 @@
#ifndef __WORLD_H
#define __WORLD_H
#include "Callback.h"
#include "Common.h"
#include "IWorld.h"
#include "LockedQueue.h"
#include "ObjectGuid.h"
@@ -337,14 +335,7 @@ public:
static float GetMaxVisibleDistanceInBGArenas() { return m_MaxVisibleDistanceInBGArenas; }
// our: needed for arena spectator subscriptions
uint32 GetNextWhoListUpdateDelaySecs()
{
if (m_timers[WUPDATE_5_SECS].Passed())
return 1;
uint32 t = m_timers[WUPDATE_5_SECS].GetInterval() - m_timers[WUPDATE_5_SECS].GetCurrent();
t = std::min(t, (uint32)m_timers[WUPDATE_5_SECS].GetInterval());
return uint32(ceil(t / 1000.0f));
}
uint32 GetNextWhoListUpdateDelaySecs();
// xinef: Global Player Data Storage system
void LoadGlobalPlayerDataStore();
@@ -493,7 +484,7 @@ private:
AutobroadcastsWeightMap m_AutobroadcastsWeights;
void ProcessQueryCallbacks();
ACE_Future_Set<PreparedQueryResult> m_realmCharCallbacks;
QueryCallbackProcessor _queryProcessor;
};
std::unique_ptr<IWorld>& getWorldInstance();