MantisBase v0.3.4
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 MANTIS_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
57 [[nodiscard]] bool init() const;
58
60 void addDbHooks(const std::string &entity_name) const;
61
63 void addDbHooks(const Entity &entity) const;
64
66 static void addDbHooks(const Entity &entity, const std::shared_ptr<soci::session> &sess);
67
69 void dropDbHooks(const std::string &entity_name) const;
70
72 static void dropDbHooks(const std::string &entity_name, const std::shared_ptr<soci::session> &sess);
73
75 void runWorker(const RtCallback &callback);
76
78 void stopWorker() const;
79
80 private:
81#if MANTIS_HAS_POSTGRESQL
82 // Create the notification trigger function
83 static void createNotifyFunction(soci::session &sql);
84#endif
85
86 static std::string buildTriggerObject(const Entity &entity, const std::string &action /*"NEW" or "OLD"*/);
87
88 const MantisBase &mApp;
89 std::unique_ptr<RtDbWorker> m_rtDbWorker;
90 };
91
93 class RtDbWorker {
94 public:
95 RtDbWorker();
96
98
99 [[nodiscard]] bool isDbRunning() const;
100
101 void addCallback(const RtCallback &cb);
102
103 void stopWorker();
104
105 private:
106 void run();
107
108 void runSQlite();
109
110#if MANTIS_HAS_POSTGRESQL
111 void runPostgreSQL();
112#endif
113
114 bool initSQLite();
115
116#if MANTIS_HAS_POSTGRESQL
117 bool initPSQL();
118#endif
119
120 int last_id = -1; // Last db ID to be queried, only query newer than this
121 std::string last_ts = getCurrentTimestampUTC(); // When last is not set, use timestamp value in UTC
122
123 std::string m_db_type;
124 RtCallback m_callback;
125 std::atomic<bool> m_running;
126 std::thread th;
127 std::mutex mtx;
128 std::condition_variable cv;
129 std::unique_ptr<soci::session> sql_ro;
130
131#if MANTIS_HAS_POSTGRESQL
132 std::unique_ptr<PGconn, decltype(&PQfinish)> psql{nullptr, &PQfinish};
133#endif
134 };
135}
136
137#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.cpp:9
void dropDbHooks(const std::string &entity_name) const
Definition realtime.cpp:147
Definition realtime.h:93
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:15
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