MantisBase v0.3.7
Loading...
Searching...
No Matches
realtime.h
Go to the documentation of this file.
1
14#ifndef MANTISBASE_REALTIME_H
15#define MANTISBASE_REALTIME_H
16
17#include <condition_variable>
18#include <functional>
19#include <memory>
20#include <mutex>
21#include <string>
22#include <thread>
23
24#include "mantisbase/mantis.h"
25#include "nlohmann/json.hpp"
26
27#if MB_HAS_POSTGRESQL
28#include <soci/postgresql/soci-postgresql.h>
29#include <libpq-fe.h>
30#endif
31
32namespace soci {
33 class session;
34}
35
36namespace mb {
37 // Forward declarations
38 class MantisBase;
39 class Entity;
40 class RtDbWorker;
41
42 using json = nlohmann::json;
43
45 using RtCallback = std::function<void(const json &)>;
46
52 class RealtimeDB {
53 public:
54 RealtimeDB();
55
56 ~RealtimeDB() { std::cout << "RealtimeDB Des()" << std::endl; }
57
59 [[nodiscard]] bool init() const;
60
62 void addDbHooks(const std::string &entity_name) const;
63
65 void addDbHooks(const Entity &entity) const;
66
68 static void addDbHooks(const Entity &entity, const std::shared_ptr<soci::session> &sess);
69
71 void dropDbHooks(const std::string &entity_name) const;
72
74 static void dropDbHooks(const std::string &entity_name, const std::shared_ptr<soci::session> &sess);
75
77 void runWorker(const RtCallback &callback);
78
80 void stopWorker() const;
81
82 private:
83#if MB_HAS_POSTGRESQL
84 // Create the notification trigger function
85 static void createNotifyFunction(soci::session &sql);
86#endif
87
88 static std::string buildTriggerObject(const Entity &entity, const std::string &action /*"NEW" or "OLD"*/);
89
90 const MantisBase &mApp;
91 std::unique_ptr<RtDbWorker> m_rtDbWorker;
92 };
93
95 class RtDbWorker {
96 public:
97 RtDbWorker();
98
100
101 [[nodiscard]] bool isDbRunning() const;
102
103 void addCallback(const RtCallback &cb);
104
105 void stopWorker();
106
107 private:
108 void run();
109
110 void runSQlite();
111
112#if MB_HAS_POSTGRESQL
113 void runPostgreSQL();
114#endif
115
116 bool initSQLite();
117
118#if MB_HAS_POSTGRESQL
119 bool initPSQL();
120#endif
121
122 int last_id = -1; // Last db ID to be queried, only query newer than this
123 std::string last_ts = getCurrentTimestampUTC(); // When last is not set, use timestamp value in UTC
124
125 std::string m_db_type;
126 RtCallback m_callback;
127 std::atomic<bool> m_running;
128 std::thread th;
129 std::mutex mtx;
130 std::condition_variable cv;
131 std::unique_ptr<soci::session> sql_ro;
132
133#if MB_HAS_POSTGRESQL
134 std::unique_ptr<PGconn, decltype(&PQfinish)> psql{nullptr, &PQfinish};
135#endif
136 };
137}
138
139#endif //MANTISBASE_REALTIME_H
Represents a database table/entity with schema and CRUD operations.
Definition entity.h:39
MantisBase entry point.
Definition mantisbase.h:40
Definition realtime.h:52
void addDbHooks(const std::string &entity_name) const
Definition realtime.cpp:59
bool init() const
Definition realtime.cpp:13
void stopWorker() const
Definition realtime.cpp:189
void runWorker(const RtCallback &callback)
Definition realtime.cpp:182
~RealtimeDB()
Definition realtime.h:56
RealtimeDB()
Definition realtime.cpp:9
void dropDbHooks(const std::string &entity_name) const
Definition realtime.cpp:147
Definition realtime.h:95
void stopWorker()
Definition realtime.cpp:306
RtDbWorker()
Definition realtime.cpp:259
bool isDbRunning() const
Definition realtime.cpp:293
void addCallback(const RtCallback &cb)
Definition realtime.cpp:302
~RtDbWorker()
Definition realtime.cpp:289
Convenience header that includes all MantisBase public API headers.
router.h
Definition auth.h:16
std::function< void(const json &)> RtCallback
Definition realtime.h:45
std::string getCurrentTimestampUTC()
Definition utils.h:289
nlohmann::json json
Shorten JSON namespace.
Definition context_store.h:18
Definition log_database.h:20