rippled
Loading...
Searching...
No Matches
DatabaseCon.h
1#pragma once
2
3#include <xrpl/core/PerfLog.h>
4#include <xrpl/core/StartUpType.h>
5#include <xrpl/rdb/DBInit.h>
6#include <xrpl/rdb/SociDB.h>
7
8#include <boost/filesystem/path.hpp>
9
10#include <mutex>
11#include <optional>
12#include <string>
13
14namespace soci {
15class session;
16}
17
18namespace xrpl {
19
21{
22public:
24
25private:
28
29public:
33 LockedSociSession(LockedSociSession&& rhs) noexcept : session_(std::move(rhs.session_)), lock_(std::move(rhs.lock_))
34 {
35 }
39 operator=(LockedSociSession const& rhs) = delete;
40
41 soci::session*
43 {
44 return session_.get();
45 }
46 soci::session&
48 {
49 return *session_;
50 }
51 soci::session*
53 {
54 return session_.get();
55 }
56 explicit
57 operator bool() const
58 {
59 return bool(session_);
60 }
61};
62
64{
65public:
66 struct Setup
67 {
68 explicit Setup() = default;
69
71 bool standAlone = false;
72 boost::filesystem::path dataDir;
73 // Indicates whether or not to return the `globalPragma`
74 // from commonPragma()
75 bool useGlobalPragma = false;
76
79 {
80 XRPL_ASSERT(
82 "xrpl::DatabaseCon::Setup::commonPragma : consistent global "
83 "pragma");
84 return useGlobalPragma && globalPragma ? globalPragma.get() : nullptr;
85 }
86
90 };
91
97
98 template <std::size_t N, std::size_t M>
100 Setup const& setup,
101 std::string const& dbName,
102 std::array<std::string, N> const& pragma,
103 std::array<char const*, M> const& initSQL,
104 beast::Journal journal)
105 // Use temporary files or regular DB files?
106 : DatabaseCon(
107 setup.standAlone && setup.startUp != StartUpType::LOAD && setup.startUp != StartUpType::LOAD_FILE &&
108 setup.startUp != StartUpType::REPLAY
109 ? ""
110 : (setup.dataDir / dbName),
111 setup.commonPragma(),
112 pragma,
113 initSQL,
114 journal)
115 {
116 }
117
118 // Use this constructor to setup checkpointing
119 template <std::size_t N, std::size_t M>
121 Setup const& setup,
122 std::string const& dbName,
123 std::array<std::string, N> const& pragma,
124 std::array<char const*, M> const& initSQL,
125 CheckpointerSetup const& checkpointerSetup,
126 beast::Journal journal)
127 : DatabaseCon(setup, dbName, pragma, initSQL, journal)
128 {
129 setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs);
130 }
131
132 template <std::size_t N, std::size_t M>
134 boost::filesystem::path const& dataDir,
135 std::string const& dbName,
136 std::array<std::string, N> const& pragma,
137 std::array<char const*, M> const& initSQL,
138 beast::Journal journal)
139 : DatabaseCon(dataDir / dbName, nullptr, pragma, initSQL, journal)
140 {
141 }
142
143 // Use this constructor to setup checkpointing
144 template <std::size_t N, std::size_t M>
146 boost::filesystem::path const& dataDir,
147 std::string const& dbName,
148 std::array<std::string, N> const& pragma,
149 std::array<char const*, M> const& initSQL,
150 CheckpointerSetup const& checkpointerSetup,
151 beast::Journal journal)
152 : DatabaseCon(dataDir, dbName, pragma, initSQL, journal)
153 {
154 setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs);
155 }
156
157 ~DatabaseCon();
158
159 soci::session&
161 {
162 return *session_;
163 }
164
167 {
168 using namespace std::chrono_literals;
169 LockedSociSession session =
170 perf::measureDurationAndLog([&]() { return LockedSociSession(session_, lock_); }, "checkoutDb", 10ms, j_);
171
172 return session;
173 }
174
175private:
176 void
178
179 template <std::size_t N, std::size_t M>
181 boost::filesystem::path const& pPath,
182 std::vector<std::string> const* commonPragma,
183 std::array<std::string, N> const& pragma,
184 std::array<char const*, M> const& initSQL,
185 beast::Journal journal)
186 : session_(std::make_shared<soci::session>()), j_(journal)
187 {
188 open(*session_, "sqlite", pPath.string());
189
190 for (auto const& p : pragma)
191 {
192 soci::statement st = session_->prepare << p;
193 st.execute(true);
194 }
195
196 if (commonPragma)
197 {
198 for (auto const& p : *commonPragma)
199 {
200 soci::statement st = session_->prepare << p;
201 st.execute(true);
202 }
203 }
204
205 for (auto const& sql : initSQL)
206 {
207 soci::statement st = session_->prepare << sql;
208 st.execute(true);
209 }
210 }
211
213
214 // checkpointer may outlive the DatabaseCon when the checkpointer jobQueue
215 // callback locks a weak pointer and the DatabaseCon is then destroyed. In
216 // this case, the checkpointer needs to make sure it doesn't use an already
217 // destroyed session. Thus this class keeps a shared_ptr to the session (so
218 // the checkpointer can keep a weak_ptr) and the checkpointer is a
219 // shared_ptr in this class. session_ will never be null.
222
224};
225
226// Return the checkpointer from its id. If the checkpointer no longer exists, an
227// nullptr is returned
230
231} // 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)
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)
Definition DatabaseCon.h:99
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:37
soci::session * get()
Definition DatabaseCon.h:42
std::shared_ptr< soci::session > session_
Definition DatabaseCon.h:26
LockedSociSession(std::shared_ptr< soci::session > it, mutex &m)
Definition DatabaseCon.h:30
soci::session * operator->()
Definition DatabaseCon.h:52
LockedSociSession(LockedSociSession const &rhs)=delete
std::unique_lock< mutex > lock_
Definition DatabaseCon.h:27
LockedSociSession & operator=(LockedSociSession const &rhs)=delete
LockedSociSession(LockedSociSession &&rhs) noexcept
Definition DatabaseCon.h:33
soci::session & operator*()
Definition DatabaseCon.h:47
Manages partitions for logging.
Definition Log.h:32
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:158
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::array< std::string, 4 > txPragma
Definition DatabaseCon.h:88
static std::unique_ptr< std::vector< std::string > const > globalPragma
Definition DatabaseCon.h:87
boost::filesystem::path dataDir
Definition DatabaseCon.h:72
std::array< std::string, 1 > lgrPragma
Definition DatabaseCon.h:89
std::vector< std::string > const * commonPragma() const
Definition DatabaseCon.h:78