Kea  2.1.7-git
database_connection.h
Go to the documentation of this file.
1 // Copyright (C) 2015-2022 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef DATABASE_CONNECTION_H
8 #define DATABASE_CONNECTION_H
9 
10 #include <asiolink/io_service.h>
11 #include <cc/data.h>
12 #include <boost/noncopyable.hpp>
13 #include <boost/shared_ptr.hpp>
14 #include <exceptions/exceptions.h>
15 #include <util/reconnect_ctl.h>
16 #include <functional>
17 #include <map>
18 #include <string>
19 
20 namespace isc {
21 namespace db {
22 
24 class NoDatabaseName : public Exception {
25 public:
26  NoDatabaseName(const char* file, size_t line, const char* what) :
27  isc::Exception(file, line, what) {}
28 };
29 
31 class DbOpenError : public Exception {
32 public:
33  DbOpenError(const char* file, size_t line, const char* what) :
34  isc::Exception(file, line, what) {}
35 };
36 
38 class DbOperationError : public Exception {
39 public:
40  DbOperationError(const char* file, size_t line, const char* what) :
41  isc::Exception(file, line, what) {}
42 };
43 
47 public:
48  DbConnectionUnusable(const char* file, size_t line, const char* what) :
49  isc::Exception(file, line, what) {}
50 };
51 
52 
56 class InvalidType : public Exception {
57 public:
58  InvalidType(const char* file, size_t line, const char* what) :
59  isc::Exception(file, line, what) {}
60 };
61 
65 class DbInvalidTimeout : public Exception {
66 public:
67  DbInvalidTimeout(const char* file, size_t line, const char* what) :
68  isc::Exception(file, line, what) {}
69 };
70 
74 class DbInvalidReadOnly : public Exception {
75 public:
76  DbInvalidReadOnly(const char* file, size_t line, const char* what) :
77  isc::Exception(file, line, what) {}
78 };
79 
81 typedef std::function<bool (util::ReconnectCtlPtr db_reconnect_ctl)> DbCallback;
82 
90 typedef std::function<isc::asiolink::IOServicePtr ()> IOServiceAccessor;
91 
93 typedef boost::shared_ptr<IOServiceAccessor> IOServiceAccessorPtr;
94 
103 class DatabaseConnection : public boost::noncopyable {
104 public:
105 
112  static const time_t MAX_DB_TIME;
113 
115  typedef std::map<std::string, std::string> ParameterMap;
116 
122  DatabaseConnection(const ParameterMap& parameters,
123  DbCallback callback = DbCallback())
124  : parameters_(parameters), callback_(callback), unusable_(false) {
125  }
126 
128  virtual ~DatabaseConnection(){};
129 
134  virtual void makeReconnectCtl(const std::string& timer_name);
135 
140  return (reconnect_ctl_);
141  }
142 
148  std::string getParameter(const std::string& name) const;
149 
159  static ParameterMap parse(const std::string& dbaccess);
160 
169  static std::string redactedAccessString(const ParameterMap& parameters);
170 
177  bool configuredReadOnly() const;
178 
183  static bool invokeDbLostCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
184 
189  static bool invokeDbRecoveredCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
190 
195  static bool invokeDbFailedCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
196 
201  static isc::data::ElementPtr toElement(const ParameterMap& params);
202 
207  static isc::data::ElementPtr toElementDbAccessString(const std::string& dbaccess);
208 
211  static DbCallback db_lost_callback_;
212 
215  static DbCallback db_recovered_callback_;
216 
219  static DbCallback db_failed_callback_;
220 
223  void checkUnusable() {
224  if (unusable_) {
225  isc_throw (DbConnectionUnusable, "Attempt to use an invalid connection");
226  }
227  }
228 
232  bool isUnusable() {
233  return (unusable_);
234  }
235 
236 protected:
238  void markUnusable() { unusable_ = true; }
239 
240 private:
241 
247  ParameterMap parameters_;
248 
249 protected:
250 
252  DbCallback callback_;
253 
254 private:
255 
262  bool unusable_;
263 
265  util::ReconnectCtlPtr reconnect_ctl_;
266 };
267 
268 } // namespace db
269 } // namespace isc
270 
271 #endif // DATABASE_CONNECTION_H
std::function< bool(util::ReconnectCtlPtr db_reconnect_ctl)> DbCallback
Defines a callback prototype for propagating events upward.
DbOpenError(const char *file, size_t line, const char *what)
static DbCallback db_lost_callback_
Optional callback function to invoke if an opened connection is lost.
boost::shared_ptr< ReconnectCtl > ReconnectCtlPtr
Pointer to an instance of ReconnectCtl.
NoDatabaseName(const char *file, size_t line, const char *what)
boost::shared_ptr< Element > ElementPtr
Definition: data.h:24
Common database connection class.
DbOperationError(const char *file, size_t line, const char *what)
void checkUnusable()
Throws an exception if the connection is not usable.
static const time_t MAX_DB_TIME
Defines maximum value for time that can be reliably stored.
DbInvalidTimeout(const char *file, size_t line, const char *what)
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Invalid type exception.
static DbCallback db_failed_callback_
Optional callback function to invoke if an opened connection recovery failed.
Exception thrown on failure to open database.
bool isUnusable()
Flag which indicates if connection is unusable.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Exception thrown if name of database is not specified.
DatabaseConnection(const ParameterMap &parameters, DbCallback callback=DbCallback())
Constructor.
virtual ~DatabaseConnection()
Destructor.
DbConnectionUnusable(const char *file, size_t line, const char *what)
static DbCallback db_recovered_callback_
Optional callback function to invoke if an opened connection recovery succeeded.
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-lfc.
void markUnusable()
Sets the unusable flag to true.
DbInvalidReadOnly(const char *file, size_t line, const char *what)
Exception thrown when a specific connection has been rendered unusable either through loss of connect...
Invalid &#39;readonly&#39; value specification.
util::ReconnectCtlPtr reconnectCtl()
The reconnect settings.
std::function< isc::asiolink::IOServicePtr()> IOServiceAccessor
Function which returns the IOService that can be used to recover the connection.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
InvalidType(const char *file, size_t line, const char *what)
Exception thrown on failure to execute a database function.
boost::shared_ptr< IOServiceAccessor > IOServiceAccessorPtr
Pointer to an instance of IOServiceAccessor.
DbCallback callback_
The callback used to recover the connection.