Kea 2.7.6
database_connection.h
Go to the documentation of this file.
1// Copyright (C) 2015-2024 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>
15#include <util/reconnect_ctl.h>
16#include <functional>
17#include <map>
18#include <string>
19
20namespace isc {
21namespace db {
22
24class NoDatabaseName : public Exception {
25public:
26 NoDatabaseName(const char* file, size_t line, const char* what) :
27 isc::Exception(file, line, what) {}
28};
29
31class DbOpenError : public Exception {
32public:
33 DbOpenError(const char* file, size_t line, const char* what) :
34 isc::Exception(file, line, what) {}
35};
36
39public:
40 DbOpenErrorWithRetry(const char* file, size_t line, const char* what) :
41 isc::Exception(file, line, what) {}
42};
43
46public:
47 DbOperationError(const char* file, size_t line, const char* what) :
48 isc::Exception(file, line, what) {}
49};
50
54public:
55 DbConnectionUnusable(const char* file, size_t line, const char* what) :
56 isc::Exception(file, line, what) {}
57};
58
62class InvalidType : public Exception {
63public:
64 InvalidType(const char* file, size_t line, const char* what) :
65 isc::Exception(file, line, what) {}
66};
67
72public:
73 DbInvalidTimeout(const char* file, size_t line, const char* what) :
74 isc::Exception(file, line, what) {}
75};
76
80class DbInvalidPort : public Exception {
81public:
82 DbInvalidPort(const char* file, size_t line, const char* what) :
83 isc::Exception(file, line, what) {}
84};
85
90public:
91 DbInvalidReadOnly(const char* file, size_t line, const char* what) :
92 isc::Exception(file, line, what) {}
93};
94
97public:
98 SchemaInitializationFailed(const char* file, size_t line, const char* what) :
99 isc::Exception(file, line, what) {}
100};
101
103typedef std::function<bool (util::ReconnectCtlPtr db_reconnect_ctl)> DbCallback;
104
113
115typedef boost::shared_ptr<IOServiceAccessor> IOServiceAccessorPtr;
116
125class DatabaseConnection : public boost::noncopyable {
126public:
127
134 static const time_t MAX_DB_TIME;
135
137 typedef std::map<std::string, std::string> ParameterMap;
138
145 DbCallback callback = DbCallback())
146 : parameters_(parameters), callback_(callback), unusable_(false) {
147 }
148
151
156 virtual void makeReconnectCtl(const std::string& timer_name);
157
162 return (reconnect_ctl_);
163 }
164
170 std::string getParameter(const std::string& name) const;
171
181 static ParameterMap parse(const std::string& dbaccess);
182
191 static std::string redactedAccessString(const ParameterMap& parameters);
192
199 bool configuredReadOnly() const;
200
205 static bool invokeDbLostCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
206
211 static bool invokeDbRecoveredCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
212
217 static bool invokeDbFailedCallback(const util::ReconnectCtlPtr& db_reconnect_ctl);
218
223 static isc::data::ElementPtr toElement(const ParameterMap& params);
224
229 static isc::data::ElementPtr toElementDbAccessString(const std::string& dbaccess);
230
234 static void setIOService(const isc::asiolink::IOServicePtr& io_service) {
235 io_service_ = io_service;
236 }
237
240 return (io_service_);
241 }
242
246
250
254
261 static bool retry_;
262
266 if (unusable_) {
267 isc_throw (DbConnectionUnusable, "Attempt to use an invalid connection");
268 }
269 }
270
274 bool isUnusable() {
275 return (unusable_);
276 }
277
279 static bool test_mode_;
280
282 class EnterTest {
283 public:
284
290
296 };
297
298protected:
299
301 void markUnusable() { unusable_ = true; }
302
303private:
304
310 ParameterMap parameters_;
311
312protected:
313
316
317private:
318
325 bool unusable_;
326
328 util::ReconnectCtlPtr reconnect_ctl_;
329
331 static isc::asiolink::IOServicePtr io_service_;
332};
333
351
352} // namespace db
353} // namespace isc
354
355#endif // DATABASE_CONNECTION_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
RAII device to set the test mode.
Common database connection class.
virtual ~DatabaseConnection()
Destructor.
bool configuredReadOnly() const
Convenience method checking if database should be opened with read only access.
std::string getParameter(const std::string &name) const
Returns value of a connection parameter.
util::ReconnectCtlPtr reconnectCtl()
The reconnect settings.
static bool invokeDbLostCallback(const util::ReconnectCtlPtr &db_reconnect_ctl)
Invokes the connection's lost connectivity callback.
static std::string redactedAccessString(const ParameterMap &parameters)
Redact database access string.
static void setIOService(const isc::asiolink::IOServicePtr &io_service)
Sets IO service to be used by the database backends.
void markUnusable()
Sets the unusable flag to true.
static bool invokeDbFailedCallback(const util::ReconnectCtlPtr &db_reconnect_ctl)
Invokes the connection's restore failed connectivity callback.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
static isc::data::ElementPtr toElement(const ParameterMap &params)
Unparse a parameter map.
static isc::data::ElementPtr toElementDbAccessString(const std::string &dbaccess)
Unparse an access string.
static DbCallback db_recovered_callback_
Optional callback function to invoke if an opened connection recovery succeeded.
virtual void makeReconnectCtl(const std::string &timer_name)
Instantiates a ReconnectCtl based on the connection's reconnect parameters.
DatabaseConnection(const ParameterMap &parameters, DbCallback callback=DbCallback())
Constructor.
static ParameterMap parse(const std::string &dbaccess)
Parse database access string.
static bool test_mode_
Test mode flag (default false).
static bool retry_
Flag which indicates if the database connection should be retried on fail.
static bool invokeDbRecoveredCallback(const util::ReconnectCtlPtr &db_reconnect_ctl)
Invokes the connection's restored connectivity callback.
static DbCallback db_failed_callback_
Optional callback function to invoke if an opened connection recovery failed.
void checkUnusable()
Throws an exception if the connection is not usable.
static DbCallback db_lost_callback_
Optional callback function to invoke if an opened connection is lost.
bool isUnusable()
Flag which indicates if connection is unusable.
static isc::asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service.
static const time_t MAX_DB_TIME
Defines maximum value for time that can be reliably stored.
DbCallback callback_
The callback used to recover the connection.
RAII class to enable DB reconnect retries on server startup.
Exception thrown when a specific connection has been rendered unusable either through loss of connect...
DbConnectionUnusable(const char *file, size_t line, const char *what)
Invalid port number.
DbInvalidPort(const char *file, size_t line, const char *what)
Invalid 'readonly' value specification.
DbInvalidReadOnly(const char *file, size_t line, const char *what)
DbInvalidTimeout(const char *file, size_t line, const char *what)
Exception thrown on failure to open database but permit retries.
DbOpenErrorWithRetry(const char *file, size_t line, const char *what)
Exception thrown on failure to open database.
DbOpenError(const char *file, size_t line, const char *what)
Exception thrown on failure to execute a database function.
DbOperationError(const char *file, size_t line, const char *what)
Invalid type exception.
InvalidType(const char *file, size_t line, const char *what)
Exception thrown if name of database is not specified.
NoDatabaseName(const char *file, size_t line, const char *what)
Thrown when an initialization of the schema failed.
SchemaInitializationFailed(const char *file, size_t line, const char *what)
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
boost::shared_ptr< IOServiceAccessor > IOServiceAccessorPtr
Pointer to an instance of IOServiceAccessor.
std::function< bool(util::ReconnectCtlPtr db_reconnect_ctl)> DbCallback
Defines a callback prototype for propagating events upward.
std::function< isc::asiolink::IOServicePtr()> IOServiceAccessor
Function which returns the IOService that can be used to recover the connection.
boost::shared_ptr< ReconnectCtl > ReconnectCtlPtr
Pointer to an instance of ReconnectCtl.
Defines the logger used by the top-level component of kea-lfc.