rippled
Loading...
Searching...
No Matches
DatabaseCon.h
1#pragma once
2
3#include <xrpl/core/PerfLog.h>
4#include <xrpl/core/ServiceRegistry.h>
5#include <xrpl/core/StartUpType.h>
6#include <xrpl/rdb/DBInit.h>
7#include <xrpl/rdb/SociDB.h>
8
9#include <boost/filesystem/path.hpp>
10
11#include <mutex>
12#include <optional>
13#include <string>
14
15namespace soci {
16class session;
17} // namespace soci
18
19namespace xrpl {
20
22{
23public:
25
26private:
29
30public:
36 : session_(std::move(rhs.session_)), lock_(std::move(rhs.lock_))
37 {
38 }
42 operator=(LockedSociSession const& rhs) = delete;
43
44 soci::session*
46 {
47 return session_.get();
48 }
49 soci::session&
51 {
52 return *session_;
53 }
54 soci::session*
56 {
57 return session_.get();
58 }
59 explicit
60 operator bool() const
61 {
62 return bool(session_);
63 }
64};
65
67{
68public:
69 struct Setup
70 {
71 explicit Setup() = default;
72
74 bool standAlone = false;
75 boost::filesystem::path dataDir;
76 // Indicates whether or not to return the `globalPragma`
77 // from commonPragma()
78 bool useGlobalPragma = false;
79
82 {
83 XRPL_ASSERT(
85 "xrpl::DatabaseCon::Setup::commonPragma : consistent global "
86 "pragma");
87 return useGlobalPragma && globalPragma ? globalPragma.get() : nullptr;
88 }
89
93 };
94
100
101 template <std::size_t N, std::size_t M>
103 Setup const& setup,
104 std::string const& dbName,
105 std::array<std::string, N> const& pragma,
106 std::array<char const*, M> const& initSQL,
107 beast::Journal journal)
108 // Use temporary files or regular DB files?
109 : DatabaseCon(
110 setup.standAlone && setup.startUp != StartUpType::Load &&
111 setup.startUp != StartUpType::LoadFile && setup.startUp != StartUpType::Replay
112 ? ""
113 : (setup.dataDir / dbName),
114 setup.commonPragma(),
115 pragma,
116 initSQL,
117 journal)
118 {
119 }
120
121 // Use this constructor to setup checkpointing
122 template <std::size_t N, std::size_t M>
124 Setup const& setup,
125 std::string const& dbName,
126 std::array<std::string, N> const& pragma,
127 std::array<char const*, M> const& initSQL,
128 CheckpointerSetup const& checkpointerSetup,
129 beast::Journal journal)
130 : DatabaseCon(setup, dbName, pragma, initSQL, journal)
131 {
132 setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
133 }
134
135 template <std::size_t N, std::size_t M>
137 boost::filesystem::path const& dataDir,
138 std::string const& dbName,
139 std::array<std::string, N> const& pragma,
140 std::array<char const*, M> const& initSQL,
141 beast::Journal journal)
142 : DatabaseCon(dataDir / dbName, nullptr, pragma, initSQL, journal)
143 {
144 }
145
146 // Use this constructor to setup checkpointing
147 template <std::size_t N, std::size_t M>
149 boost::filesystem::path const& dataDir,
150 std::string const& dbName,
151 std::array<std::string, N> const& pragma,
152 std::array<char const*, M> const& initSQL,
153 CheckpointerSetup const& checkpointerSetup,
154 beast::Journal journal)
155 : DatabaseCon(dataDir, dbName, pragma, initSQL, journal)
156 {
157 setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
158 }
159
160 ~DatabaseCon();
161
162 soci::session&
164 {
165 return *session_;
166 }
167
170 {
171 using namespace std::chrono_literals;
173 [&]() { return LockedSociSession(session_, lock_); }, "checkoutDb", 10ms, j_);
174
175 return session;
176 }
177
178private:
179 void
181
182 template <std::size_t N, std::size_t M>
184 boost::filesystem::path const& pPath,
185 std::vector<std::string> const* commonPragma,
186 std::array<std::string, N> const& pragma,
187 std::array<char const*, M> const& initSQL,
188 beast::Journal journal)
189 : session_(std::make_shared<soci::session>()), j_(journal)
190 {
191 open(*session_, "sqlite", pPath.string());
192
193 for (auto const& p : pragma)
194 {
195 soci::statement st = session_->prepare << p;
196 st.execute(true);
197 }
198
199 if (commonPragma)
200 {
201 for (auto const& p : *commonPragma)
202 {
203 soci::statement st = session_->prepare << p;
204 st.execute(true);
205 }
206 }
207
208 for (auto const& sql : initSQL)
209 {
210 soci::statement st = session_->prepare << sql;
211 st.execute(true);
212 }
213 }
214
216
217 // checkpointer may outlive the DatabaseCon when the checkpointer jobQueue
218 // callback locks a weak pointer and the DatabaseCon is then destroyed. In
219 // this case, the checkpointer needs to make sure it doesn't use an already
220 // destroyed session. Thus this class keeps a shared_ptr to the session (so
221 // the checkpointer can keep a weak_ptr) and the checkpointer is a
222 // shared_ptr in this class. session_ will never be null.
225
227};
228
229// Return the checkpointer from its id. If the checkpointer no longer exists, an
230// nullptr is returned
233
234} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:40
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)
void setupCheckpointing(JobQueue *, ServiceRegistry &)
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_
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:45
std::shared_ptr< soci::session > session_
Definition DatabaseCon.h:27
LockedSociSession(std::shared_ptr< soci::session > it, mutex &m)
Definition DatabaseCon.h:31
soci::session * operator->()
Definition DatabaseCon.h:55
LockedSociSession(LockedSociSession const &rhs)=delete
std::unique_lock< mutex > lock_
Definition DatabaseCon.h:28
LockedSociSession & operator=(LockedSociSession const &rhs)=delete
LockedSociSession(LockedSociSession &&rhs) noexcept
Definition DatabaseCon.h:35
soci::session & operator*()
Definition DatabaseCon.h:50
Service registry for dependency injection.
T get(T... args)
STL namespace.
auto measureDurationAndLog(Func &&func, std::string const &actionDescription, std::chrono::duration< Rep, Period > maxDelay, beast::Journal const &journal)
Definition PerfLog.h:162
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
@ open
We haven't closed our ledger yet, but others might have.
StartUpType
Definition StartUpType.h:8
std::shared_ptr< Checkpointer > checkpointerFromId(std::uintptr_t id)
std::reference_wrapper< ServiceRegistry > registry
Definition DatabaseCon.h:98
std::array< std::string, 4 > txPragma
Definition DatabaseCon.h:91
static std::unique_ptr< std::vector< std::string > const > globalPragma
Definition DatabaseCon.h:90
boost::filesystem::path dataDir
Definition DatabaseCon.h:75
std::array< std::string, 1 > lgrPragma
Definition DatabaseCon.h:92
std::vector< std::string > const * commonPragma() const
Definition DatabaseCon.h:81