aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/Transaction.h
diff options
context:
space:
mode:
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