aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/Transaction.h
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-04-14 16:23:44 +0200
committerShauren <shauren.trinity@gmail.com>2020-04-14 16:23:44 +0200
commit0f0ca3a9194d76afa0227943e86469ad8368c5e2 (patch)
treeca267417fdb6be1eb9c78dfd05b7449376a0eaf9 /src/server/database/Database/Transaction.h
parent34b393ab64d1c53e7e5828e735b4c31e61eaf950 (diff)
Core/DBLayer: Implement async transaction completion callbacks
Diffstat (limited to 'src/server/database/Database/Transaction.h')
-rw-r--r--src/server/database/Database/Transaction.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h
index 16fc08fb0d8..36f7d3ec749 100644
--- a/src/server/database/Database/Transaction.h
+++ b/src/server/database/Database/Transaction.h
@@ -22,6 +22,7 @@
#include "DatabaseEnvFwd.h"
#include "SQLOperation.h"
#include "StringFormat.h"
+#include <functional>
#include <mutex>
#include <vector>
@@ -72,6 +73,7 @@ class TC_DATABASE_API TransactionTask : public SQLOperation
{
template <class T> friend class DatabaseWorkerPool;
friend class DatabaseWorker;
+ friend class TransactionCallback;
public:
TransactionTask(std::shared_ptr<TransactionBase> trans) : m_trans(trans) { }
@@ -79,9 +81,43 @@ class TC_DATABASE_API TransactionTask : public SQLOperation
protected:
bool Execute() override;
+ int TryExecute();
+ void CleanupOnFailure();
std::shared_ptr<TransactionBase> m_trans;
static std::mutex _deadlockLock;
};
+class TC_DATABASE_API TransactionWithResultTask : public TransactionTask
+{
+public:
+ TransactionWithResultTask(std::shared_ptr<TransactionBase> trans) : TransactionTask(trans) { }
+
+ TransactionFuture GetFuture() { return m_result.get_future(); }
+
+protected:
+ bool Execute() override;
+
+ TransactionPromise m_result;
+};
+
+class TC_DATABASE_API TransactionCallback
+{
+public:
+ TransactionCallback(TransactionFuture&& future) : m_future(std::move(future)) { }
+ TransactionCallback(TransactionCallback&&) = default;
+
+ TransactionCallback& operator=(TransactionCallback&&) = default;
+
+ void AfterComplete(std::function<void(bool)> callback) &
+ {
+ m_callback = std::move(callback);
+ }
+
+ bool InvokeIfReady();
+
+ TransactionFuture m_future;
+ std::function<void(bool)> m_callback;
+};
+
#endif