rippled
DatabaseCon.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_APP_DATA_DATABASECON_H_INCLUDED
21 #define RIPPLE_APP_DATA_DATABASECON_H_INCLUDED
22 
23 #include <ripple/app/main/DBInit.h>
24 #include <ripple/core/Config.h>
25 #include <ripple/core/SociDB.h>
26 #include <boost/filesystem/path.hpp>
27 #include <boost/optional.hpp>
28 #include <mutex>
29 #include <string>
30 
31 namespace soci {
32 class session;
33 }
34 
35 namespace ripple {
36 
37 template <class T, class TMutex>
39 {
40 public:
41  using mutex = TMutex;
42 
43 private:
44  T* it_;
46 
47 public:
48  LockedPointer(T* it, mutex& m) : it_(it), lock_(m)
49  {
50  }
51  LockedPointer(LockedPointer&& rhs) noexcept
52  : it_(rhs.it_), lock_(std::move(rhs.lock_))
53  {
54  }
55  LockedPointer() = delete;
56  LockedPointer(LockedPointer const& rhs) = delete;
58  operator=(LockedPointer const& rhs) = delete;
59 
60  T*
61  get()
62  {
63  return it_;
64  }
65  T&
67  {
68  return *it_;
69  }
70  T*
72  {
73  return it_;
74  }
75  explicit operator bool() const
76  {
77  return bool(it_);
78  }
79 };
80 
82 
84 {
85 public:
86  struct Setup
87  {
88  explicit Setup() = default;
89 
91  bool standAlone = false;
92  boost::filesystem::path dataDir;
93  // Indicates whether or not to return the `globalPragma`
94  // from commonPragma()
95  bool useGlobalPragma = false;
96 
98  commonPragma() const
99  {
100  assert(!useGlobalPragma || globalPragma);
102  : nullptr;
103  }
104 
106  };
107 
108  template <std::size_t N, std::size_t M>
110  Setup const& setup,
111  std::string const& DBName,
112  std::array<char const*, N> const& pragma,
113  std::array<char const*, M> const& initSQL)
114  // Use temporary files or regular DB files?
115  : DatabaseCon(
116  setup.standAlone && setup.startUp != Config::LOAD &&
117  setup.startUp != Config::LOAD_FILE &&
118  setup.startUp != Config::REPLAY
119  ? ""
120  : (setup.dataDir / DBName),
121  setup.commonPragma(),
122  pragma,
123  initSQL)
124  {
125  }
126 
127  template <std::size_t N, std::size_t M>
129  boost::filesystem::path const& dataDir,
130  std::string const& DBName,
131  std::array<char const*, N> const& pragma,
132  std::array<char const*, M> const& initSQL)
133  : DatabaseCon(dataDir / DBName, nullptr, pragma, initSQL)
134  {
135  }
136 
137  soci::session&
139  {
140  return session_;
141  }
142 
145  {
146  return LockedSociSession(&session_, lock_);
147  }
148 
149  void
151 
152 private:
153  template <std::size_t N, std::size_t M>
155  boost::filesystem::path const& pPath,
156  std::vector<std::string> const* commonPragma,
157  std::array<char const*, N> const& pragma,
158  std::array<char const*, M> const& initSQL)
159  {
160  open(session_, "sqlite", pPath.string());
161 
162  if (commonPragma)
163  {
164  for (auto const& p : *commonPragma)
165  {
166  soci::statement st = session_.prepare << p;
167  st.execute(true);
168  }
169  }
170  for (auto const& p : pragma)
171  {
172  soci::statement st = session_.prepare << p;
173  st.execute(true);
174  }
175  for (auto const& sql : initSQL)
176  {
177  soci::statement st = session_.prepare << sql;
178  st.execute(true);
179  }
180  }
181 
183 
184  soci::session session_;
186 };
187 
190  Config const& c,
191  boost::optional<beast::Journal> j = boost::none);
192 
193 } // namespace ripple
194 
195 #endif
ripple::Config::NORMAL
@ NORMAL
Definition: Config.h:123
ripple::DatabaseCon::DatabaseCon
DatabaseCon(boost::filesystem::path const &dataDir, std::string const &DBName, std::array< char const *, N > const &pragma, std::array< char const *, M > const &initSQL)
Definition: DatabaseCon.h:128
ripple::DatabaseCon::Setup::globalPragma
static std::unique_ptr< std::vector< std::string > const > globalPragma
Definition: DatabaseCon.h:105
std::string
STL class.
ripple::DatabaseCon::DatabaseCon
DatabaseCon(boost::filesystem::path const &pPath, std::vector< std::string > const *commonPragma, std::array< char const *, N > const &pragma, std::array< char const *, M > const &initSQL)
Definition: DatabaseCon.h:154
ripple::Logs
Manages partitions for logging.
Definition: Log.h:48
ripple::DatabaseCon::Setup
Definition: DatabaseCon.h:86
ripple::LockedSociSession
LockedPointer< soci::session, std::recursive_mutex > LockedSociSession
Definition: DatabaseCon.h:81
ripple::DatabaseCon::DatabaseCon
DatabaseCon(Setup const &setup, std::string const &DBName, std::array< char const *, N > const &pragma, std::array< char const *, M > const &initSQL)
Definition: DatabaseCon.h:109
ripple::DatabaseCon::Setup::startUp
Config::StartUpType startUp
Definition: DatabaseCon.h:90
std::vector< std::string >
ripple::LockedPointer::operator*
T & operator*()
Definition: DatabaseCon.h:66
std::unique_ptr::get
T get(T... args)
ripple::DatabaseCon::Setup::dataDir
boost::filesystem::path dataDir
Definition: DatabaseCon.h:92
ripple::Config::StartUpType
StartUpType
Definition: Config.h:123
ripple::LockedPointer::LockedPointer
LockedPointer()=delete
ripple::LockedPointer
Definition: DatabaseCon.h:38
ripple::LockedPointer::LockedPointer
LockedPointer(T *it, mutex &m)
Definition: DatabaseCon.h:48
ripple::DatabaseCon::Setup::commonPragma
std::vector< std::string > const * commonPragma() const
Definition: DatabaseCon.h:98
ripple::DatabaseCon::setupCheckpointing
void setupCheckpointing(JobQueue *, Logs &)
Definition: DatabaseCon.cpp:172
soci
Definition: DatabaseCon.h:31
ripple::DatabaseCon::Setup::useGlobalPragma
bool useGlobalPragma
Definition: DatabaseCon.h:95
ripple::DatabaseCon::lock_
LockedSociSession::mutex lock_
Definition: DatabaseCon.h:182
ripple::LockedPointer::it_
T * it_
Definition: DatabaseCon.h:44
ripple::LockedPointer::LockedPointer
LockedPointer(LockedPointer &&rhs) noexcept
Definition: DatabaseCon.h:51
ripple::LockedPointer::lock_
std::unique_lock< mutex > lock_
Definition: DatabaseCon.h:45
ripple::DatabaseCon::Setup::standAlone
bool standAlone
Definition: DatabaseCon.h:91
ripple::DatabaseCon::checkoutDb
LockedSociSession checkoutDb()
Definition: DatabaseCon.h:144
ripple::Config
Definition: Config.h:67
ripple::DatabaseCon::session_
soci::session session_
Definition: DatabaseCon.h:184
std::unique_lock< mutex >
std::array
STL class.
ripple::JobQueue
A pool of threads to perform work.
Definition: JobQueue.h:55
ripple::DatabaseCon::getSession
soci::session & getSession()
Definition: DatabaseCon.h:138
ripple::LockedPointer::get
T * get()
Definition: DatabaseCon.h:61
ripple::LockedPointer::operator=
LockedPointer & operator=(LockedPointer const &rhs)=delete
ripple::setup_DatabaseCon
DatabaseCon::Setup setup_DatabaseCon(Config const &c, boost::optional< beast::Journal > j=boost::none)
Definition: DatabaseCon.cpp:31
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::DatabaseCon::checkpointer_
std::unique_ptr< Checkpointer > checkpointer_
Definition: DatabaseCon.h:185
ripple::LockedPointer::operator->
T * operator->()
Definition: DatabaseCon.h:71
ripple::DatabaseCon::Setup::Setup
Setup()=default
ripple::DatabaseCon
Definition: DatabaseCon.h:83
ripple::LockedPointer::mutex
TMutex mutex
Definition: DatabaseCon.h:41
mutex
std::unique_ptr
STL class.
ripple::open
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition: SociDB.cpp:99
string