aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2020-05-30 15:43:54 +0000
committerGitHub <noreply@github.com>2020-05-30 17:43:54 +0200
commit141ada19b00fb9d0dd1a260d86d97bbb709a0f5e (patch)
tree03c8559a245f404d7d84655fe5c5066ec22e2ee7 /src/server/game/Server
parent00bc6e7d54e924dabaf4636a4b8084f0db067194 (diff)
Cherry pick some db commits (#24713)
* Core/DBLayer: Implement async transaction completion callbacks (cherry picked from commit 0f0ca3a9194d76afa0227943e86469ad8368c5e2) # Conflicts: # src/server/bnetserver/REST/LoginRESTService.cpp # src/server/bnetserver/Server/Session.cpp # src/server/bnetserver/Server/Session.h # src/server/database/Database/Transaction.cpp # src/server/game/Handlers/CharacterHandler.cpp # src/server/game/Handlers/SpellHandler.cpp # src/server/game/Server/WorldSession.cpp # src/server/game/Server/WorldSocket.cpp # src/server/game/Server/WorldSocket.h * Core/Misc: Fixed char enum packet sometimes not showing newly created character when client latency is too low (cherry picked from commit fc9d2e728e5c21bd2a1645a29be60d0e280ad940) # Conflicts: # src/server/game/Handlers/CharacterHandler.cpp * Fix no-pch build * Core/Player: Wait for correct transaction on character creation (cherry picked from commit 01c68b2aa2ed25ea9b4c007f238a0e958f6525b1) # Conflicts: # src/server/game/Entities/Player/Player.cpp * Fix warning * Remove unused login transaction Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/WorldSession.cpp8
-rw-r--r--src/server/game/Server/WorldSession.h4
-rw-r--r--src/server/game/Server/WorldSocket.cpp10
-rw-r--r--src/server/game/Server/WorldSocket.h1
4 files changed, 17 insertions, 6 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 55282e1a7bb..256e818de5f 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -1193,7 +1193,8 @@ void WorldSession::SetPlayer(Player* player)
void WorldSession::ProcessQueryCallbacks()
{
- _queryProcessor.ProcessReadyQueries();
+ _queryProcessor.ProcessReadyCallbacks();
+ _transactionCallbacks.ProcessReadyCallbacks();
if (_realmAccountLoginCallback.valid() && _realmAccountLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
InitializeSessionCallback(static_cast<CharacterDatabaseQueryHolder*>(_realmAccountLoginCallback.get()));
@@ -1203,6 +1204,11 @@ void WorldSession::ProcessQueryCallbacks()
HandlePlayerLogin(reinterpret_cast<LoginQueryHolder*>(_charLoginCallback.get()));
}
+TransactionCallback& WorldSession::AddTransactionCallback(TransactionCallback&& callback)
+{
+ return _transactionCallbacks.AddCallback(std::move(callback));
+}
+
void WorldSession::InitWarden(BigNumber* k, std::string const& os)
{
if (os == "Win")
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 57794ac81bf..b9df671a502 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -23,11 +23,11 @@
#define __WORLDSESSION_H
#include "Common.h"
+#include "AsyncCallbackProcessor.h"
#include "DatabaseEnvFwd.h"
#include "LockedQueue.h"
#include "ObjectGuid.h"
#include "Packet.h"
-#include "QueryCallbackProcessor.h"
#include "SharedDefines.h"
#include <string>
#include <map>
@@ -1091,6 +1091,7 @@ class TC_GAME_API WorldSession
public:
QueryCallbackProcessor& GetQueryProcessor() { return _queryProcessor; }
+ TransactionCallback& AddTransactionCallback(TransactionCallback&& callback);
private:
void ProcessQueryCallbacks();
@@ -1099,6 +1100,7 @@ class TC_GAME_API WorldSession
QueryResultHolderFuture _charLoginCallback;
QueryCallbackProcessor _queryProcessor;
+ AsyncCallbackProcessor<TransactionCallback> _transactionCallbacks;
friend class World;
protected:
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 0e65704076d..ff85f71c769 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -39,13 +39,15 @@ WorldSocket::WorldSocket(tcp::socket&& socket)
_headerBuffer.Resize(sizeof(ClientPktHeader));
}
+WorldSocket::~WorldSocket() = default;
+
void WorldSocket::Start()
{
std::string ip_address = GetRemoteIpAddress().to_string();
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_INFO);
stmt->setString(0, ip_address);
- _queryProcessor.AddQuery(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)));
+ _queryProcessor.AddCallback(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)));
}
void WorldSocket::CheckIpCallback(PreparedQueryResult result)
@@ -115,7 +117,7 @@ bool WorldSocket::Update()
if (!BaseSocket::Update())
return false;
- _queryProcessor.ProcessReadyQueries();
+ _queryProcessor.ProcessReadyCallbacks();
return true;
}
@@ -439,7 +441,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
stmt->setInt32(0, int32(realm.Id.Realm));
stmt->setString(1, authSession->Account);
- _queryProcessor.AddQuery(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)));
+ _queryProcessor.AddCallback(LoginDatabase.AsyncQuery(stmt).WithPreparedCallback(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)));
}
void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSession, PreparedQueryResult result)
@@ -600,7 +602,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes
if (wardenActive)
_worldSession->InitWarden(&account.SessionKey, account.OS);
- _queryProcessor.AddQuery(_worldSession->LoadPermissionsAsync().WithPreparedCallback(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)));
+ _queryProcessor.AddCallback(_worldSession->LoadPermissionsAsync().WithPreparedCallback(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)));
AsyncRead();
}
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 6f6b0848423..00d2ec59651 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -71,6 +71,7 @@ class TC_GAME_API WorldSocket : public Socket<WorldSocket>
public:
WorldSocket(tcp::socket&& socket);
+ ~WorldSocket();
WorldSocket(WorldSocket const& right) = delete;
WorldSocket& operator=(WorldSocket const& right) = delete;