aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-07-31 23:27:26 +0200
committerShauren <shauren.trinity@gmail.com>2022-01-24 21:21:37 +0100
commitd5dcf02196e30c932c7a25c3975a91a0fe1ccd50 (patch)
tree088b9bc6b9fc261a62894f0e839f59ef622c1f26 /src/server/database/Database
parent61bf51874de432856ecd2c5794334bd256d4b014 (diff)
Core/DBLayer: Add nicer api for SQLQueryHolders
(cherry picked from commit 9b806c6b5d9e83f8614523317a44742954f97744)
Diffstat (limited to 'src/server/database/Database')
-rw-r--r--src/server/database/Database/DatabaseEnvFwd.h2
-rw-r--r--src/server/database/Database/DatabaseWorkerPool.cpp2
-rw-r--r--src/server/database/Database/DatabaseWorkerPool.h2
-rw-r--r--src/server/database/Database/QueryHolder.cpp11
-rw-r--r--src/server/database/Database/QueryHolder.h19
5 files changed, 34 insertions, 2 deletions
diff --git a/src/server/database/Database/DatabaseEnvFwd.h b/src/server/database/Database/DatabaseEnvFwd.h
index f85035cc83a..c72df398cd0 100644
--- a/src/server/database/Database/DatabaseEnvFwd.h
+++ b/src/server/database/Database/DatabaseEnvFwd.h
@@ -86,6 +86,8 @@ using HotfixDatabaseQueryHolder = SQLQueryHolder<HotfixDatabaseConnection>;
using LoginDatabaseQueryHolder = SQLQueryHolder<LoginDatabaseConnection>;
using WorldDatabaseQueryHolder = SQLQueryHolder<WorldDatabaseConnection>;
+class SQLQueryHolderCallback;
+
// mysql
struct MySQLHandle;
struct MySQLResult;
diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp
index 53ca065136e..facb10a5972 100644
--- a/src/server/database/Database/DatabaseWorkerPool.cpp
+++ b/src/server/database/Database/DatabaseWorkerPool.cpp
@@ -227,7 +227,7 @@ QueryCallback DatabaseWorkerPool<T>::AsyncQuery(PreparedStatement<T>* stmt)
}
template <class T>
-QueryResultHolderFuture DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder<T>* holder)
+SQLQueryHolderCallback DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder<T>* holder)
{
SQLQueryHolderTask* task = new SQLQueryHolderTask(holder);
// Store future result before enqueueing - task might get already processed and deleted before returning from this method
diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h
index 13d52f99539..f46c0e29c04 100644
--- a/src/server/database/Database/DatabaseWorkerPool.h
+++ b/src/server/database/Database/DatabaseWorkerPool.h
@@ -160,7 +160,7 @@ class DatabaseWorkerPool
//! return object as soon as the query is executed.
//! The return value is then processed in ProcessQueryCallback methods.
//! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag.
- QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder<T>* holder);
+ SQLQueryHolderCallback DelayQueryHolder(SQLQueryHolder<T>* holder);
/**
Transaction context methods.
diff --git a/src/server/database/Database/QueryHolder.cpp b/src/server/database/Database/QueryHolder.cpp
index dacd12913da..eb9dbdcca22 100644
--- a/src/server/database/Database/QueryHolder.cpp
+++ b/src/server/database/Database/QueryHolder.cpp
@@ -92,3 +92,14 @@ bool SQLQueryHolderTask::Execute()
m_result.set_value(m_holder);
return true;
}
+
+bool SQLQueryHolderCallback::InvokeIfReady()
+{
+ if (m_future.valid() && m_future.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+ {
+ m_callback(m_future.get());
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/server/database/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h
index fe4a0e78331..f94eff49d2c 100644
--- a/src/server/database/Database/QueryHolder.h
+++ b/src/server/database/Database/QueryHolder.h
@@ -63,4 +63,23 @@ class TC_DATABASE_API SQLQueryHolderTask : public SQLOperation
QueryResultHolderFuture GetFuture() { return m_result.get_future(); }
};
+class TC_DATABASE_API SQLQueryHolderCallback
+{
+public:
+ SQLQueryHolderCallback(QueryResultHolderFuture&& future) : m_future(std::move(future)) { }
+ SQLQueryHolderCallback(SQLQueryHolderCallback&&) = default;
+
+ SQLQueryHolderCallback& operator=(SQLQueryHolderCallback&&) = default;
+
+ void AfterComplete(std::function<void(SQLQueryHolderBase*)> callback) &
+ {
+ m_callback = std::move(callback);
+ }
+
+ bool InvokeIfReady();
+
+ QueryResultHolderFuture m_future;
+ std::function<void(SQLQueryHolderBase*)> m_callback;
+};
+
#endif