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 <mutex>
28 #include <string>
29 
30 namespace soci {
31 class session;
32 }
33 
34 namespace ripple {
35 
36 template <class T, class TMutex>
38 {
39 public:
40  using mutex = TMutex;
41 
42 private:
43  T* it_;
45 
46 public:
47  LockedPointer(T* it, mutex& m) : it_(it), lock_(m)
48  {
49  }
50  LockedPointer(LockedPointer&& rhs) noexcept
51  : it_(rhs.it_), lock_(std::move(rhs.lock_))
52  {
53  }
54  LockedPointer() = delete;
55  LockedPointer(LockedPointer const& rhs) = delete;
57  operator=(LockedPointer const& rhs) = delete;
58 
59  T*
60  get()
61  {
62  return it_;
63  }
64  T&
66  {
67  return *it_;
68  }
69  T*
71  {
72  return it_;
73  }
74  explicit operator bool() const
75  {
76  return bool(it_);
77  }
78 };
79 
81 
83 {
84 public:
85  struct Setup
86  {
87  explicit Setup() = default;
88 
90  bool standAlone = false;
91  boost::filesystem::path dataDir;
92  };
93 
94  template <std::size_t N, std::size_t M>
96  Setup const& setup,
97  std::string const& DBName,
98  std::array<char const*, N> const& pragma,
99  std::array<char const*, M> const& initSQL)
100  {
101  // Use temporary files or regular DB files?
102  auto const useTempFiles = setup.standAlone &&
103  setup.startUp != Config::LOAD &&
104  setup.startUp != Config::LOAD_FILE &&
105  setup.startUp != Config::REPLAY;
106  boost::filesystem::path pPath =
107  useTempFiles ? "" : (setup.dataDir / DBName);
108 
109  init(pPath, pragma, initSQL);
110  }
111 
112  template <std::size_t N, std::size_t M>
114  boost::filesystem::path const& dataDir,
115  std::string const& DBName,
116  std::array<char const*, N> const& pragma,
117  std::array<char const*, M> const& initSQL)
118  {
119  init((dataDir / DBName), pragma, initSQL);
120  }
121 
122  soci::session&
124  {
125  return session_;
126  }
127 
130  {
131  return LockedSociSession(&session_, lock_);
132  }
133 
134  void
136 
137 private:
138  template <std::size_t N, std::size_t M>
139  void
141  boost::filesystem::path const& pPath,
142  std::array<char const*, N> const& pragma,
143  std::array<char const*, M> const& initSQL)
144  {
145  open(session_, "sqlite", pPath.string());
146 
147  for (auto const& p : pragma)
148  {
149  soci::statement st = session_.prepare << p;
150  st.execute(true);
151  }
152  for (auto const& sql : initSQL)
153  {
154  soci::statement st = session_.prepare << sql;
155  st.execute(true);
156  }
157  }
158 
160 
161  soci::session session_;
163 };
164 
166 setup_DatabaseCon(Config const& c);
167 
168 } // namespace ripple
169 
170 #endif
ripple::Config::NORMAL
@ NORMAL
Definition: Config.h:122
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:113
std::string
STL class.
ripple::Logs
Manages partitions for logging.
Definition: Log.h:48
ripple::DatabaseCon::Setup
Definition: DatabaseCon.h:85
ripple::LockedSociSession
LockedPointer< soci::session, std::recursive_mutex > LockedSociSession
Definition: DatabaseCon.h:80
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:95
ripple::DatabaseCon::Setup::startUp
Config::StartUpType startUp
Definition: DatabaseCon.h:89
ripple::LockedPointer::operator*
T & operator*()
Definition: DatabaseCon.h:65
ripple::Config::LOAD
@ LOAD
Definition: Config.h:122
ripple::DatabaseCon::Setup::dataDir
boost::filesystem::path dataDir
Definition: DatabaseCon.h:91
ripple::Config::StartUpType
StartUpType
Definition: Config.h:122
ripple::LockedPointer::LockedPointer
LockedPointer()=delete
ripple::LockedPointer
Definition: DatabaseCon.h:37
ripple::LockedPointer::LockedPointer
LockedPointer(T *it, mutex &m)
Definition: DatabaseCon.h:47
ripple::DatabaseCon::setupCheckpointing
void setupCheckpointing(JobQueue *, Logs &)
Definition: DatabaseCon.cpp:45
soci
Definition: DatabaseCon.h:30
ripple::DatabaseCon::lock_
LockedSociSession::mutex lock_
Definition: DatabaseCon.h:159
ripple::LockedPointer::it_
T * it_
Definition: DatabaseCon.h:43
ripple::LockedPointer::LockedPointer
LockedPointer(LockedPointer &&rhs) noexcept
Definition: DatabaseCon.h:50
ripple::LockedPointer::lock_
std::unique_lock< mutex > lock_
Definition: DatabaseCon.h:44
ripple::setup_DatabaseCon
DatabaseCon::Setup setup_DatabaseCon(Config const &c)
Definition: DatabaseCon.cpp:29
ripple::DatabaseCon::Setup::standAlone
bool standAlone
Definition: DatabaseCon.h:90
ripple::DatabaseCon::checkoutDb
LockedSociSession checkoutDb()
Definition: DatabaseCon.h:129
ripple::Config
Definition: Config.h:66
ripple::DatabaseCon::session_
soci::session session_
Definition: DatabaseCon.h:161
std::unique_lock< mutex >
ripple::DatabaseCon::init
void init(boost::filesystem::path const &pPath, std::array< char const *, N > const &pragma, std::array< char const *, M > const &initSQL)
Definition: DatabaseCon.h:140
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:123
ripple::LockedPointer::get
T * get()
Definition: DatabaseCon.h:60
ripple::LockedPointer::operator=
LockedPointer & operator=(LockedPointer const &rhs)=delete
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:162
ripple::LockedPointer::operator->
T * operator->()
Definition: DatabaseCon.h:70
ripple::DatabaseCon::Setup::Setup
Setup()=default
ripple::Config::REPLAY
@ REPLAY
Definition: Config.h:122
ripple::DatabaseCon
Definition: DatabaseCon.h:82
ripple::LockedPointer::mutex
TMutex mutex
Definition: DatabaseCon.h:40
mutex
std::unique_ptr
STL class.
ripple::Config::LOAD_FILE
@ LOAD_FILE
Definition: Config.h:122
ripple::open
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition: SociDB.cpp:99
string