summary refs log tree commit diff stats
path: root/database.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'database.cpp')
-rw-r--r--database.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/database.cpp b/database.cpp new file mode 100644 index 0000000..037579b --- /dev/null +++ b/database.cpp
@@ -0,0 +1,91 @@
1#include "database.h"
2
3#include <include/uuid.h>
4
5#include <stdexcept>
6
7std::string database::create(std::mt19937& rng) {
8 std::lock_guard state_guard(mutex_);
9
10 std::string token = uuids::to_string(uuids::uuid_random_generator{rng}());
11 requests_[token] = request{};
12
13 return token;
14}
15
16void database::subscribe(const std::string& token,
17 subscribe_callback_type callback) {
18 std::lock_guard state_guard(mutex_);
19
20 if (!requests_.count(token)) {
21 throw std::invalid_argument("Could not find request.");
22 }
23
24 request& req = requests_[token];
25 size_t nextId = req.subscribers.size();
26 req.subscribers.push_back(callback);
27}
28
29void database::post(const std::string& token, const std::string& msg) {
30 std::lock_guard state_guard(mutex_);
31
32 if (!requests_.count(token)) {
33 throw std::invalid_argument("Could not find request.");
34 }
35
36 request& req = requests_.at(token);
37
38 for (std::optional<subscribe_callback_type>& callback : req.subscribers) {
39 if (callback) {
40 try {
41 (*callback)(msg);
42 } catch (const std::exception& ex) {
43 callback = std::nullopt;
44 }
45 }
46 }
47}
48
49void database::setResult(const std::string& token, const std::string& result) {
50 std::lock_guard state_guard(mutex_);
51
52 if (!requests_.count(token)) {
53 throw std::invalid_argument("Could not find request.");
54 }
55
56 request& req = requests_[token];
57 req.result = result;
58}
59
60const std::string& database::getResult(const std::string& token) {
61 std::lock_guard state_guard(mutex_);
62
63 if (!requests_.count(token)) {
64 throw std::invalid_argument("Could not find request.");
65 }
66
67 const request& req = requests_.at(token);
68 return req.result;
69}
70
71void database::mark_done(const std::string& token) {
72 std::lock_guard state_guard(mutex_);
73
74 if (!requests_.count(token)) {
75 throw std::invalid_argument("Could not find request.");
76 }
77
78 request& req = requests_[token];
79 req.done = true;
80}
81
82bool database::is_done(const std::string& token) {
83 std::lock_guard state_guard(mutex_);
84
85 if (!requests_.count(token)) {
86 throw std::invalid_argument("Could not find request.");
87 }
88
89 const request& req = requests_.at(token);
90 return req.done;
91}