MySqlConfigBackendImpl::
MySqlConfigBackendImpl(const DatabaseConnection::ParameterMap& parameters,
const DbCallback db_reconnect_callback)
- : conn_(parameters, MySqlConfigBackendImpl::getIOService(), db_reconnect_callback),
- timer_name_(""), audit_revision_created_(false), parameters_(parameters) {
+ : conn_(parameters,
+ IOServiceAccessCallbackPtr(new IOServiceAccessCallback(MySqlConfigBackendImpl::getIOService)),
+ db_reconnect_callback), timer_name_(""),
+ audit_revision_created_(false), parameters_(parameters) {
// Test schema version first.
std::pair<uint32_t, uint32_t> code_version(MYSQL_SCHEMA_VERSION_MAJOR,
MYSQL_SCHEMA_VERSION_MINOR);
#ifndef DATABASE_CONNECTION_H
#define DATABASE_CONNECTION_H
+#include <asiolink/io_service.h>
#include <cc/data.h>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
/// @brief Defines a callback prototype for propagating events upward
typedef std::function<bool (ReconnectCtlPtr db_reconnect_ctl)> DbCallback;
+/// @brief Callback which returns the IOService that can be used to recover the
+/// connection.
+typedef std::function<isc::asiolink::IOServicePtr ()> IOServiceAccessCallback;
+
+/// @brief Pointer to an instance of IOServiceAccessCallbackPtr
+typedef boost::shared_ptr<IOServiceAccessCallback> IOServiceAccessCallbackPtr;
+
/// @brief Common database connection class.
///
/// This class provides functions that are common for establishing
// MySqlLeaseContext Constructor
MySqlLeaseContext::MySqlLeaseContext(const DatabaseConnection::ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service,
+ IOServiceAccessCallbackPtr io_service_access_callback,
DbCallback db_reconnect_callback)
- : conn_(parameters, io_service, db_reconnect_callback) {
+ : conn_(parameters, io_service_access_callback, db_reconnect_callback) {
}
// MySqlLeaseContextAlloc Constructor and Destructor
MySqlLeaseContextPtr
MySqlLeaseMgr::createContext() const {
MySqlLeaseContextPtr ctx(new MySqlLeaseContext(parameters_,
- LeaseMgr::getIOService(),
- &MySqlLeaseMgr::dbReconnect));
+ IOServiceAccessCallbackPtr(new IOServiceAccessCallback(&LeaseMgr::getIOService)),
+ &MySqlLeaseMgr::dbReconnect));
// Open the database.
ctx->conn_.openDatabase();
/// @brief Constructor
///
/// @param parameters See MySqlLeaseMgr constructor.
- /// @param io_service The IOService object, used for all ASIO operations.
+ /// @param io_service_access_callback The IOService access callback.
/// @param db_reconnect_callback The connection recovery callback.
MySqlLeaseContext(const db::DatabaseConnection::ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service,
+ db::IOServiceAccessCallbackPtr io_service_access_callback,
db::DbCallback db_reconnect_callback);
/// The exchange objects are used for transfer of data to/from the database.
// PgSqlLeaseContext Constructor
PgSqlLeaseContext::PgSqlLeaseContext(const DatabaseConnection::ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service,
+ IOServiceAccessCallbackPtr io_service_access_callback,
DbCallback db_reconnect_callback)
- : conn_(parameters, io_service, db_reconnect_callback) {
+ : conn_(parameters, io_service_access_callback, db_reconnect_callback) {
}
// PgSqlLeaseContextAlloc Constructor and Destructor
PgSqlLeaseContextPtr
PgSqlLeaseMgr::createContext() const {
PgSqlLeaseContextPtr ctx(new PgSqlLeaseContext(parameters_,
- LeaseMgr::getIOService(),
- &PgSqlLeaseMgr::dbReconnect));
+ IOServiceAccessCallbackPtr(new IOServiceAccessCallback(&LeaseMgr::getIOService)),
+ &PgSqlLeaseMgr::dbReconnect));
// Open the database.
ctx->conn_.openDatabase();
/// @brief Constructor
///
/// @param parameters See PgSqlLeaseMgr constructor.
- /// @param io_service The IOService object, used for all ASIO operations.
+ /// @param io_service_access_callback The IOService access callback.
/// @param db_reconnect_callback The connection recovery callback.
PgSqlLeaseContext(const db::DatabaseConnection::ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service,
+ db::IOServiceAccessCallbackPtr io_service_access_callback,
db::DbCallback db_reconnect_callback);
/// The exchange objects are used for transfer of data to/from the database.
/// Initialize MySqlConnection object with parameters needed for connection.
///
/// @param parameters Specify the connection details.
- /// @param io_service The IOService object, used for all ASIO operations.
+ /// @param io_access_callback The IOService access callback.
/// @param callback The connection recovery callback.
MySqlConnection(const ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service = isc::asiolink::IOServicePtr(),
+ IOServiceAccessCallbackPtr io_access_callback = IOServiceAccessCallbackPtr(),
DbCallback callback = DbCallback())
- : DatabaseConnection(parameters), io_service_(io_service),
- callback_(callback) {
+ : DatabaseConnection(parameters),
+ io_service_access_callback_(io_access_callback),
+ io_service_(), callback_(callback) {
}
/// @brief Destructor
///
/// @note The recover function must be run on the IO Service thread.
void startRecoverDbConnection() {
+ if (!io_service_ && io_service_access_callback_) {
+ io_service_ = (*io_service_access_callback_)();
+ }
if (callback_ && io_service_) {
io_service_->post(std::bind(callback_, reconnectCtl()));
}
/// and will be from MySqlHostDataSource.
MySqlHolder mysql_;
+ /// @brief Callback which returns the IOService that can be used to recover
+ /// the connection.
+ IOServiceAccessCallbackPtr io_service_access_callback_;
+
/// @brief IOService object, used for all ASIO operations.
isc::asiolink::IOServicePtr io_service_;
/// Initialize PgSqlConnection object with parameters needed for connection.
///
/// @param parameters Specify the connection details.
- /// @param io_service The IOService object, used for all ASIO operations.
+ /// @param io_access_callback The IOService access callback.
/// @param callback The connection recovery callback.
PgSqlConnection(const ParameterMap& parameters,
- const isc::asiolink::IOServicePtr& io_service = isc::asiolink::IOServicePtr(),
+ IOServiceAccessCallbackPtr io_access_callback = IOServiceAccessCallbackPtr(),
DbCallback callback = DbCallback())
- : DatabaseConnection(parameters), io_service_(io_service),
- callback_(callback) {
+ : DatabaseConnection(parameters),
+ io_service_access_callback_(io_access_callback),
+ io_service_(), callback_(callback) {
}
/// @brief Destructor
///
/// @note The recover function must be run on the IO Service thread.
void startRecoverDbConnection() {
+ if (!io_service_ && io_service_access_callback_) {
+ io_service_ = (*io_service_access_callback_)();
+ }
if (callback_ && io_service_) {
io_service_->post(std::bind(callback_, reconnectCtl()));
}
return (conn_);
}
+ /// @brief Callback which returns the IOService that can be used to recover
+ /// the connection.
+ IOServiceAccessCallbackPtr io_service_access_callback_;
+
/// @brief IOService object, used for all ASIO operations.
isc::asiolink::IOServicePtr io_service_;