aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Server/WorldSession.cpp8
-rw-r--r--src/server/shared/Database/AdhocStatement.cpp20
-rw-r--r--src/server/shared/Database/AdhocStatement.h6
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h15
-rw-r--r--src/server/shared/Database/PreparedStatement.cpp22
-rw-r--r--src/server/shared/Database/PreparedStatement.h6
-rw-r--r--src/server/shared/Database/QueryHolder.h8
-rw-r--r--src/server/shared/Threading/Callback.h4
-rw-r--r--src/server/worldserver/RemoteAccess/RASession.h2
9 files changed, 43 insertions, 48 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 7fbc398a4da..444c06e41b8 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -1105,7 +1105,7 @@ void WorldSession::ProcessQueryCallbacks()
PreparedQueryResult result;
//! HandleCharEnumOpcode
- if (_charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+ if (_charEnumCallback.valid() && _charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
result = _charEnumCallback.get();
HandleCharEnum(result);
@@ -1118,7 +1118,7 @@ void WorldSession::ProcessQueryCallbacks()
}
//! HandlePlayerLoginOpcode
- if (_charLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+ if (_charLoginCallback.valid() && _charLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
SQLQueryHolder* param = _charLoginCallback.get();
HandlePlayerLogin((LoginQueryHolder*)param);
@@ -1143,7 +1143,7 @@ void WorldSession::ProcessQueryCallbacks()
}
//- HandleCharAddIgnoreOpcode
- if (_addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+ if (_addIgnoreCallback.valid() && _addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
result = _addIgnoreCallback.get();
HandleAddIgnoreOpcodeCallBack(result);
@@ -1159,7 +1159,7 @@ void WorldSession::ProcessQueryCallbacks()
}
//- HandleStablePet
- if (_stablePetCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+ if (_stablePetCallback.valid() && _stablePetCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
result = _stablePetCallback.get();
HandleStablePetCallback(result);
diff --git a/src/server/shared/Database/AdhocStatement.cpp b/src/server/shared/Database/AdhocStatement.cpp
index 65c41823ccb..7fae9173d20 100644
--- a/src/server/shared/Database/AdhocStatement.cpp
+++ b/src/server/shared/Database/AdhocStatement.cpp
@@ -19,22 +19,20 @@
#include "MySQLConnection.h"
/*! Basic, ad-hoc queries. */
-BasicStatementTask::BasicStatementTask(const char* sql) :
-m_has_result(false)
-{
- m_sql = strdup(sql);
-}
-
-BasicStatementTask::BasicStatementTask(const char* sql, QueryResultPromise& result) :
-m_has_result(true),
-m_result(std::move(result))
+BasicStatementTask::BasicStatementTask(const char* sql, bool async) :
+m_result(nullptr)
{
m_sql = strdup(sql);
+ m_has_result = async; // If the operation is async, then there's a result
+ if (async)
+ m_result = new QueryResultPromise();
}
BasicStatementTask::~BasicStatementTask()
{
free((void*)m_sql);
+ if (m_has_result && m_result != nullptr)
+ delete m_result;
}
bool BasicStatementTask::Execute()
@@ -45,11 +43,11 @@ bool BasicStatementTask::Execute()
if (!result || !result->GetRowCount() || !result->NextRow())
{
delete result;
- m_result.set_value(QueryResult(NULL));
+ m_result->set_value(QueryResult(NULL));
return false;
}
- m_result.set_value(QueryResult(result));
+ m_result->set_value(QueryResult(result));
return true;
}
diff --git a/src/server/shared/Database/AdhocStatement.h b/src/server/shared/Database/AdhocStatement.h
index a67caaa160f..40c1dbb7098 100644
--- a/src/server/shared/Database/AdhocStatement.h
+++ b/src/server/shared/Database/AdhocStatement.h
@@ -28,16 +28,16 @@ typedef std::promise<QueryResult> QueryResultPromise;
class BasicStatementTask : public SQLOperation
{
public:
- BasicStatementTask(const char* sql);
- BasicStatementTask(const char* sql, QueryResultPromise& result);
+ BasicStatementTask(const char* sql, bool async = false);
~BasicStatementTask();
bool Execute() override;
+ QueryResultFuture GetFuture() { return m_result->get_future(); }
private:
const char* m_sql; //- Raw query to be executed
bool m_has_result;
- QueryResultPromise m_result;
+ QueryResultPromise* m_result;
};
#endif \ No newline at end of file
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index 4b9e887f341..f0b540022da 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -296,10 +296,9 @@ class DatabaseWorkerPool
//! The return value is then processed in ProcessQueryCallback methods.
QueryResultFuture AsyncQuery(const char* sql)
{
- QueryResultPromise res;
- BasicStatementTask* task = new BasicStatementTask(sql, res);
+ BasicStatementTask* task = new BasicStatementTask(sql, true);
Enqueue(task);
- return res.get_future(); //! Actual return value has no use yet
+ return task->GetFuture(); //! Actual return value has no use yet
}
//! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed.
@@ -320,10 +319,9 @@ class DatabaseWorkerPool
//! Statement must be prepared with CONNECTION_ASYNC flag.
PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt)
{
- PreparedQueryResultPromise res;
- PreparedStatementTask* task = new PreparedStatementTask(stmt, res);
+ PreparedStatementTask* task = new PreparedStatementTask(stmt, true);
Enqueue(task);
- return res.get_future();
+ return task->GetFuture();
}
//! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture
@@ -332,10 +330,9 @@ class DatabaseWorkerPool
//! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag.
QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder)
{
- QueryResultHolderPromise res;
- SQLQueryHolderTask* task = new SQLQueryHolderTask(holder, res);
+ SQLQueryHolderTask* task = new SQLQueryHolderTask(holder);
Enqueue(task);
- return res.get_future(); //! Fool compiler, has no use yet
+ return task->GetFuture();
}
/**
diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/shared/Database/PreparedStatement.cpp
index 4b2b55f25e5..fb1bfa687d0 100644
--- a/src/server/shared/Database/PreparedStatement.cpp
+++ b/src/server/shared/Database/PreparedStatement.cpp
@@ -445,19 +445,19 @@ std::string MySQLPreparedStatement::getQueryString(std::string const& sqlPattern
}
//- Execution
-PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt) :
-m_stmt(stmt),
-m_has_result(false) { }
-
-PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultPromise& result) :
-m_stmt(stmt),
-m_has_result(true),
-m_result(std::move(result)) { }
-
+PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt, bool async) :
+m_stmt(stmt)
+{
+ m_has_result = async; // If it's async, then there's a result
+ if (async)
+ m_result = new PreparedQueryResultPromise();
+}
PreparedStatementTask::~PreparedStatementTask()
{
delete m_stmt;
+ if (m_has_result && m_result != nullptr)
+ delete m_result;
}
bool PreparedStatementTask::Execute()
@@ -468,10 +468,10 @@ bool PreparedStatementTask::Execute()
if (!result || !result->GetRowCount())
{
delete result;
- m_result.set_value(PreparedQueryResult(NULL));
+ m_result->set_value(PreparedQueryResult(NULL));
return false;
}
- m_result.set_value(PreparedQueryResult(result));
+ m_result->set_value(PreparedQueryResult(result));
return true;
}
diff --git a/src/server/shared/Database/PreparedStatement.h b/src/server/shared/Database/PreparedStatement.h
index d69ee52a3e7..16f7a9141d3 100644
--- a/src/server/shared/Database/PreparedStatement.h
+++ b/src/server/shared/Database/PreparedStatement.h
@@ -160,15 +160,15 @@ typedef std::promise<PreparedQueryResult> PreparedQueryResultPromise;
class PreparedStatementTask : public SQLOperation
{
public:
- PreparedStatementTask(PreparedStatement* stmt);
- PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultPromise& result);
+ PreparedStatementTask(PreparedStatement* stmt, bool async = false);
~PreparedStatementTask();
bool Execute();
+ PreparedQueryResultFuture GetFuture() { return m_result->get_future(); }
protected:
PreparedStatement* m_stmt;
bool m_has_result;
- PreparedQueryResultPromise m_result;
+ PreparedQueryResultPromise* m_result;
};
#endif
diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/shared/Database/QueryHolder.h
index 5751675fe5f..37e23ecd653 100644
--- a/src/server/shared/Database/QueryHolder.h
+++ b/src/server/shared/Database/QueryHolder.h
@@ -45,13 +45,15 @@ typedef std::promise<SQLQueryHolder*> QueryResultHolderPromise;
class SQLQueryHolderTask : public SQLOperation
{
private:
- SQLQueryHolder * m_holder;
+ SQLQueryHolder* m_holder;
QueryResultHolderPromise m_result;
public:
- SQLQueryHolderTask(SQLQueryHolder *holder, QueryResultHolderPromise& res)
- : m_holder(holder), m_result(std::move(res)){ };
+ SQLQueryHolderTask(SQLQueryHolder* holder)
+ : m_holder(holder) { };
+
bool Execute();
+ QueryResultHolderFuture GetFuture() { return m_result.get_future(); }
};
diff --git a/src/server/shared/Threading/Callback.h b/src/server/shared/Threading/Callback.h
index 5d9dc9a760d..80c865b5710 100644
--- a/src/server/shared/Threading/Callback.h
+++ b/src/server/shared/Threading/Callback.h
@@ -47,7 +47,7 @@ class QueryCallback
int IsReady()
{
- return _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
+ return _result.valid() && _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}
void GetResult(Result& res)
@@ -130,7 +130,7 @@ class QueryCallback_2
int IsReady()
{
- return _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
+ return _result.valid() && _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}
void GetResult(Result& res)
diff --git a/src/server/worldserver/RemoteAccess/RASession.h b/src/server/worldserver/RemoteAccess/RASession.h
index f3ef2a6a86a..d06ebfa31a7 100644
--- a/src/server/worldserver/RemoteAccess/RASession.h
+++ b/src/server/worldserver/RemoteAccess/RASession.h
@@ -46,8 +46,6 @@ public:
private:
int Send(const char* data);
- void AsyncRead();
- void AsyncWrite(size_t length);
std::string ReadString();
bool CheckAccessLevel(const std::string& user);
bool CheckPassword(const std::string& user, const std::string& pass);