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