rippled
Loading...
Searching...
No Matches
DatabaseCon.h
1#ifndef XRPL_APP_DATA_DATABASECON_H_INCLUDED
2#define XRPL_APP_DATA_DATABASECON_H_INCLUDED
3
4#include <xrpld/app/main/DBInit.h>
5#include <xrpld/core/Config.h>
6#include <xrpld/core/SociDB.h>
7
8#include <xrpl/core/PerfLog.h>
9
10#include <boost/filesystem/path.hpp>
11
12#include <mutex>
13#include <optional>
14#include <string>
15
16namespace soci {
17class session;
18}
19
20namespace xrpl {
21
23{
24public:
26
27private:
30
31public:
37 : session_(std::move(rhs.session_)), lock_(std::move(rhs.lock_))
38 {
39 }
43 operator=(LockedSociSession const& rhs) = delete;
44
45 soci::session*
47 {
48 return session_.get();
49 }
50 soci::session&
52 {
53 return *session_;
54 }
55 soci::session*
57 {
58 return session_.get();
59 }
60 explicit
61 operator bool() const
62 {
63 return bool(session_);
64 }
65};
66
68{
69public:
70 struct Setup
71 {
72 explicit Setup() = default;
73
75 bool standAlone = false;
76 boost::filesystem::path dataDir;
77 // Indicates whether or not to return the `globalPragma`
78 // from commonPragma()
79 bool useGlobalPragma = false;
80
83 {
84 XRPL_ASSERT(
86 "xrpl::DatabaseCon::Setup::commonPragma : consistent global "
87 "pragma");
89 : nullptr;
90 }
91
95 };
96
102
103 template <std::size_t N, std::size_t M>
105 Setup const& setup,
106 std::string const& dbName,
107 std::array<std::string, N> const& pragma,
108 std::array<char const*, M> const& initSQL,
109 beast::Journal journal)
110 // Use temporary files or regular DB files?
111 : DatabaseCon(
112 setup.standAlone && setup.startUp != Config::LOAD &&
113 setup.startUp != Config::LOAD_FILE &&
114 setup.startUp != Config::REPLAY
115 ? ""
116 : (setup.dataDir / dbName),
117 setup.commonPragma(),
118 pragma,
119 initSQL,
120 journal)
121 {
122 }
123
124 // Use this constructor to setup checkpointing
125 template <std::size_t N, std::size_t M>
127 Setup const& setup,
128 std::string const& dbName,
129 std::array<std::string, N> const& pragma,
130 std::array<char const*, M> const& initSQL,
131 CheckpointerSetup const& checkpointerSetup,
132 beast::Journal journal)
133 : DatabaseCon(setup, dbName, pragma, initSQL, journal)
134 {
135 setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs);
136 }
137
138 template <std::size_t N, std::size_t M>
140 boost::filesystem::path const& dataDir,
141 std::string const& dbName,
142 std::array<std::string, N> const& pragma,
143 std::array<char const*, M> const& initSQL,
144 beast::Journal journal)
145 : DatabaseCon(dataDir / dbName, nullptr, pragma, initSQL, journal)
146 {
147 }
148
149 // Use this constructor to setup checkpointing
150 template <std::size_t N, std::size_t M>
152 boost::filesystem::path const& dataDir,
153 std::string const& dbName,
154 std::array<std::string, N> const& pragma,
155 std::array<char const*, M> const& initSQL,
156 CheckpointerSetup const& checkpointerSetup,
157 beast::Journal journal)
158 : DatabaseCon(dataDir, dbName, pragma, initSQL, journal)
159 {
160 setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs);
161 }
162
163 ~DatabaseCon();
164
165 soci::session&
167 {
168 return *session_;
169 }
170
173 {
174 using namespace std::chrono_literals;
176 [&]() { return LockedSociSession(session_, lock_); },
177 "checkoutDb",
178 10ms,
179 j_);
180
181 return session;
182 }
183
184private:
185 void
187
188 template <std::size_t N, std::size_t M>
190 boost::filesystem::path const& pPath,
191 std::vector<std::string> const* commonPragma,
192 std::array<std::string, N> const& pragma,
193 std::array<char const*, M> const& initSQL,
194 beast::Journal journal)
195 : session_(std::make_shared<soci::session>()), j_(journal)
196 {
197 open(*session_, "sqlite", pPath.string());
198
199 for (auto const& p : pragma)
200 {
201 soci::statement st = session_->prepare << p;
202 st.execute(true);
203 }
204
205 if (commonPragma)
206 {
207 for (auto const& p : *commonPragma)
208 {
209 soci::statement st = session_->prepare << p;
210 st.execute(true);
211 }
212 }
213
214 for (auto const& sql : initSQL)
215 {
216 soci::statement st = session_->prepare << sql;
217 st.execute(true);
218 }
219 }
220
222
223 // checkpointer may outlive the DatabaseCon when the checkpointer jobQueue
224 // callback locks a weak pointer and the DatabaseCon is then destroyed. In
225 // this case, the checkpointer needs to make sure it doesn't use an already
226 // destroyed session. Thus this class keeps a shared_ptr to the session (so
227 // the checkpointer can keep a weak_ptr) and the checkpointer is a
228 // shared_ptr in this class. session_ will never be null.
231
233};
234
235// Return the checkpointer from its id. If the checkpointer no longer exists, an
236// nullptr is returned
239
242 Config const& c,
244
245} // namespace xrpl
246
247#endif
A generic endpoint for log messages.
Definition Journal.h:41
DatabaseCon(boost::filesystem::path const &dataDir, std::string const &dbName, std::array< std::string, N > const &pragma, std::array< char const *, M > const &initSQL, beast::Journal journal)
DatabaseCon(boost::filesystem::path const &dataDir, std::string const &dbName, std::array< std::string, N > const &pragma, std::array< char const *, M > const &initSQL, CheckpointerSetup const &checkpointerSetup, beast::Journal journal)
std::shared_ptr< soci::session > const session_
beast::Journal const j_
void setupCheckpointing(JobQueue *, Logs &)
std::shared_ptr< Checkpointer > checkpointer_
soci::session & getSession()
DatabaseCon(Setup const &setup, std::string const &dbName, std::array< std::string, N > const &pragma, std::array< char const *, M > const &initSQL, CheckpointerSetup const &checkpointerSetup, beast::Journal journal)
LockedSociSession checkoutDb()
DatabaseCon(Setup const &setup, std::string const &dbName, std::array< std::string, N > const &pragma, std::array< char const *, M > const &initSQL, beast::Journal journal)
DatabaseCon(boost::filesystem::path const &pPath, std::vector< std::string > const *commonPragma, std::array< std::string, N > const &pragma, std::array< char const *, M > const &initSQL, beast::Journal journal)
LockedSociSession::mutex lock_
A pool of threads to perform work.
Definition JobQueue.h:38
soci::session * get()
Definition DatabaseCon.h:46
std::shared_ptr< soci::session > session_
Definition DatabaseCon.h:28
LockedSociSession(std::shared_ptr< soci::session > it, mutex &m)
Definition DatabaseCon.h:32
soci::session * operator->()
Definition DatabaseCon.h:56
LockedSociSession(LockedSociSession const &rhs)=delete
std::unique_lock< mutex > lock_
Definition DatabaseCon.h:29
LockedSociSession & operator=(LockedSociSession const &rhs)=delete
LockedSociSession(LockedSociSession &&rhs) noexcept
Definition DatabaseCon.h:36
soci::session & operator*()
Definition DatabaseCon.h:51
Manages partitions for logging.
Definition Log.h:33
T get(T... args)
T is_same_v
STL namespace.
auto measureDurationAndLog(Func &&func, std::string const &actionDescription, std::chrono::duration< Rep, Period > maxDelay, beast::Journal const &journal)
Definition PerfLog.h:167
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
DatabaseCon::Setup setup_DatabaseCon(Config const &c, std::optional< beast::Journal > j=std::nullopt)
@ open
We haven't closed our ledger yet, but others might have.
std::shared_ptr< Checkpointer > checkpointerFromId(std::uintptr_t id)
std::array< std::string, 4 > txPragma
Definition DatabaseCon.h:93
Config::StartUpType startUp
Definition DatabaseCon.h:74
static std::unique_ptr< std::vector< std::string > const > globalPragma
Definition DatabaseCon.h:92
boost::filesystem::path dataDir
Definition DatabaseCon.h:76
std::array< std::string, 1 > lgrPragma
Definition DatabaseCon.h:94
std::vector< std::string > const * commonPragma() const
Definition DatabaseCon.h:82