xrpld
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
80 [[nodiscard]] std::vector<std::string> const*
82 {
83 XRPL_ASSERT(
85 "xrpl::DatabaseCon::Setup::commonPragma : consistent global "
86 "pragma");
87 return useGlobalPragma && globalPragma ? globalPragma.get() : nullptr;
88 }
89
93 };
94
95 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
101
102 template <std::size_t N, std::size_t M>
104 Setup const& setup,
105 std::string const& dbName,
106 std::array<std::string, N> const& pragma,
107 std::array<char const*, M> const& initSQL,
108 beast::Journal journal)
109 // Use temporary files or regular DB files?
110 : DatabaseCon(
111 setup.standAlone && setup.startUp != StartUpType::Load &&
112 setup.startUp != StartUpType::LoadFile && setup.startUp != StartUpType::Replay
113 ? ""
114 : (setup.dataDir / dbName),
115 setup.commonPragma(),
116 pragma,
117 initSQL,
118 journal)
119 {
120 }
121
122 // Use this constructor to setup checkpointing
123 template <std::size_t N, std::size_t M>
125 Setup const& setup,
126 std::string const& dbName,
127 std::array<std::string, N> const& pragma,
128 std::array<char const*, M> const& initSQL,
129 CheckpointerSetup const& checkpointerSetup,
130 beast::Journal journal)
131 : DatabaseCon(setup, dbName, pragma, initSQL, journal)
132 {
133 setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
134 }
135
136 template <std::size_t N, std::size_t M>
138 boost::filesystem::path const& dataDir,
139 std::string const& dbName,
140 std::array<std::string, N> const& pragma,
141 std::array<char const*, M> const& initSQL,
142 beast::Journal journal)
143 : DatabaseCon(dataDir / dbName, nullptr, pragma, initSQL, journal)
144 {
145 }
146
147 // Use this constructor to setup checkpointing
148 template <std::size_t N, std::size_t M>
150 boost::filesystem::path const& dataDir,
151 std::string const& dbName,
152 std::array<std::string, N> const& pragma,
153 std::array<char const*, M> const& initSQL,
154 CheckpointerSetup const& checkpointerSetup,
155 beast::Journal journal)
156 : DatabaseCon(dataDir, dbName, pragma, initSQL, journal)
157 {
158 setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
159 }
160
161 ~DatabaseCon();
162
163 soci::session&
165 {
166 return *session_;
167 }
168
171 {
172 using namespace std::chrono_literals;
174 [&]() { return LockedSociSession(session_, lock_); }, "checkoutDb", 10ms, j_);
175
176 return session;
177 }
178
179private:
180 void
182
183 template <std::size_t N, std::size_t M>
185 boost::filesystem::path const& pPath,
186 std::vector<std::string> const* commonPragma,
187 std::array<std::string, N> const& pragma,
188 std::array<char const*, M> const& initSQL,
189 beast::Journal journal)
190 : session_(std::make_shared<soci::session>()), j_(journal)
191 {
192 open(*session_, "sqlite", pPath.string());
193
194 for (auto const& p : pragma)
195 {
196 soci::statement st = session_->prepare << p;
197 st.execute(true);
198 }
199
200 if (commonPragma)
201 {
202 for (auto const& p : *commonPragma)
203 {
204 soci::statement st = session_->prepare << p;
205 st.execute(true);
206 }
207 }
208
209 for (auto const& sql : initSQL)
210 {
211 soci::statement st = session_->prepare << sql;
212 st.execute(true);
213 }
214 }
215
217
218 // checkpointer may outlive the DatabaseCon when the checkpointer jobQueue
219 // callback locks a weak pointer and the DatabaseCon is then destroyed. In
220 // this case, the checkpointer needs to make sure it doesn't use an already
221 // destroyed session. Thus this class keeps a shared_ptr to the session (so
222 // the checkpointer can keep a weak_ptr) and the checkpointer is a
223 // shared_ptr in this class. session_ will never be null.
226
228};
229
230// Return the checkpointer from its id. If the checkpointer no longer exists, an
231// nullptr is returned
234
235} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:38
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:43
std::recursive_mutex mutex
Definition DatabaseCon.h:24
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.
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
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition SociDB.cpp:92
StartUpType
Definition StartUpType.h:8
std::shared_ptr< Checkpointer > checkpointerFromId(std::uintptr_t id)
std::reference_wrapper< ServiceRegistry > registry
Definition DatabaseCon.h:99
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