const DbCallback db_reconnect_callback)
: conn_(parameters,
IOServiceAccessorPtr(new IOServiceAccessor(&MySqlConfigBackendImpl::getIOService)),
- db_reconnect_callback), timer_name_(""),
+ db_reconnect_callback),
audit_revision_ref_count_(0), parameters_(parameters) {
// Create unique timer name per instance.
timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
timer_name_ += "]DbReconnectTimer";
+ MySqlConnection::ensureSchemaVersion(parameters, db_reconnect_callback, timer_name_);
+
// Create ReconnectCtl for this connection.
conn_.makeReconnectCtl(timer_name_);
- // Test schema version first.
- std::pair<uint32_t, uint32_t> code_version(MYSQL_SCHEMA_VERSION_MAJOR,
- MYSQL_SCHEMA_VERSION_MINOR);
-
- std::string timer_name;
- bool retry = false;
- if (parameters.count("retry-on-startup")) {
- if (parameters.at("retry-on-startup") == "true") {
- retry = true;
- }
- }
- if (retry) {
- timer_name = timer_name_;
- }
-
- IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
-
- std::pair<uint32_t, uint32_t> db_version =
- MySqlConnection::getVersion(parameters, ac, db_reconnect_callback, timer_name);
- if (code_version != db_version) {
- isc_throw(DbOpenError, "MySQL schema version mismatch: need version: "
- << code_version.first << "." << code_version.second
- << " found version: " << db_version.first << "."
- << db_version.second);
- }
-
// Open the database.
conn_.openDatabase();
size_t last_insert_id_index)
: conn_(parameters,
IOServiceAccessorPtr(new IOServiceAccessor(&PgSqlConfigBackendImpl::getIOService)),
- db_reconnect_callback), timer_name_(""),
- audit_revision_ref_count_(0), parameters_(parameters),
- last_insert_id_index_(last_insert_id_index) {
-
- // Create unique timer name per instance.
- timer_name_ = "PgSqlConfigBackend";
- timer_name_ += space;
- timer_name_ += "[";
- timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
- timer_name_ += "]DbReconnectTimer";
-
- // Create ReconnectCtl for this connection.
- conn_.makeReconnectCtl(timer_name_);
+ db_reconnect_callback),
+ audit_revision_ref_count_(0), parameters_(parameters),
+ last_insert_id_index_(last_insert_id_index) {
// Check TLS support.
size_t tls(0);
}
#endif
- // Test schema version first.
- std::pair<uint32_t, uint32_t> code_version(PGSQL_SCHEMA_VERSION_MAJOR,
- PGSQL_SCHEMA_VERSION_MINOR);
-
- std::string timer_name;
- bool retry = false;
- if (parameters.count("retry-on-startup")) {
- if (parameters.at("retry-on-startup") == "true") {
- retry = true;
- }
- }
- if (retry) {
- timer_name = timer_name_;
- }
+ // Create unique timer name per instance.
+ timer_name_ = "PgSqlConfigBackend";
+ timer_name_ += space;
+ timer_name_ += "[";
+ timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
+ timer_name_ += "]DbReconnectTimer";
- IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
+ PgSqlConnection::ensureSchemaVersion(parameters, db_reconnect_callback, timer_name_);
- std::pair<uint32_t, uint32_t> db_version =
- PgSqlConnection::getVersion(parameters, ac, db_reconnect_callback, timer_name);
- if (code_version != db_version) {
- isc_throw(DbOpenError, "PostgreSQL schema version mismatch: need version: "
- << code_version.first << "." << code_version.second
- << " found version: " << db_version.first << "."
- << db_version.second);
- }
+ // Create ReconnectCtl for this connection.
+ conn_.makeReconnectCtl(timer_name_);
// Open the database.
conn_.openDatabase();
}
MySqlHostDataSourceImpl::MySqlHostDataSourceImpl(const DatabaseConnection::ParameterMap& parameters)
- : parameters_(parameters), ip_reservations_unique_(true), unusable_(false),
- timer_name_("") {
+ : parameters_(parameters), ip_reservations_unique_(true), unusable_(false) {
// Create unique timer name per instance.
timer_name_ = "MySqlHostMgr[";
timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
timer_name_ += "]DbReconnectTimer";
- // Validate the schema version first.
- std::pair<uint32_t, uint32_t> code_version(MYSQL_SCHEMA_VERSION_MAJOR,
- MYSQL_SCHEMA_VERSION_MINOR);
-
- std::string timer_name;
- bool retry = false;
- if (parameters.count("retry-on-startup")) {
- if (parameters.at("retry-on-startup") == "true") {
- retry = true;
- }
- }
- if (retry) {
- timer_name = timer_name_;
- }
-
- std::pair<uint32_t, uint32_t> db_version = getVersion(timer_name);
- if (code_version != db_version) {
- isc_throw(DbOpenError,
- "MySQL schema version mismatch: need version: "
- << code_version.first << "." << code_version.second
- << " found version: " << db_version.first << "."
- << db_version.second);
- }
+ MySqlConnection::ensureSchemaVersion(parameters,
+ DbCallback(&MySqlHostDataSourceImpl::dbReconnect),
+ timer_name_);
// Create an initial context.
pool_.reset(new MySqlHostContextPool());
std::pair<uint32_t, uint32_t>
MySqlHostDataSourceImpl::getVersion(const std::string& timer_name) const {
- LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
- DHCPSRV_MYSQL_HOST_DB_GET_VERSION);
+ LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_HOST_DB_GET_VERSION);
IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
DbCallback cb(&MySqlHostDataSourceImpl::dbReconnect);
private:
// Note: All array lengths are equal to the corresponding variable in the
- // schema.
+ // schema.
// Note: Arrays are declared fixed length for speed of creation
uint32_t addr4_; ///< IPv4 address
MYSQL_BIND bind_[LEASE_COLUMNS]; ///< Bind array
// Check if the extended info tables are enabled.
setExtendedInfoTablesEnabled(parameters);
- // retry-on-startup?
- bool const retry(parameters.count("retry-on-startup") &&
- parameters.at("retry-on-startup") == "true");
-
- // retry-on-startup disabled. Ensure schema version with empty timer name / no retry.
- if (!retry) {
- ensureSchemaVersion();
- }
-
// Create unique timer name per instance.
timer_name_ = "MySqlLeaseMgr[";
timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
timer_name_ += "]DbReconnectTimer";
- // retry-on-startup enabled. Ensure schema version with timer name set / retries.
- if (retry) {
- ensureSchemaVersion();
- }
+ MySqlConnection::ensureSchemaVersion(parameters, DbCallback(&MySqlLeaseMgr::dbReconnect),
+ timer_name_);
// Create an initial context.
pool_.reset(new MySqlLeaseContextPool());
return (std::string("MySQL Database"));
}
-void
-MySqlLeaseMgr::ensureSchemaVersion() const {
- LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_GET_VERSION);
-
- IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
- DbCallback cb(&MySqlLeaseMgr::dbReconnect);
-
- return (MySqlConnection::ensureSchemaVersion(parameters_, ac, cb, timer_name_));
-}
-
std::pair<uint32_t, uint32_t>
MySqlLeaseMgr::getVersion(const string& timer_name) const {
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_GET_VERSION);
/// @return Description of the backend.
virtual std::string getDescription() const override;
- void ensureSchemaVersion() const;
-
/// @brief Returns backend version.
///
/// @param timer_name The DB reconnect timer name.
}
PgSqlHostDataSourceImpl::PgSqlHostDataSourceImpl(const DatabaseConnection::ParameterMap& parameters)
- : parameters_(parameters), ip_reservations_unique_(true), unusable_(false),
- timer_name_("") {
-
- // Create unique timer name per instance.
- timer_name_ = "PgSqlHostMgr[";
- timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
- timer_name_ += "]DbReconnectTimer";
+ : parameters_(parameters), ip_reservations_unique_(true), unusable_(false) {
// Check TLS support.
size_t tls(0);
}
#endif
- // Validate the schema version first.
- std::pair<uint32_t, uint32_t> code_version(PGSQL_SCHEMA_VERSION_MAJOR,
- PGSQL_SCHEMA_VERSION_MINOR);
-
- std::string timer_name;
- bool retry = false;
- if (parameters.count("retry-on-startup")) {
- if (parameters.at("retry-on-startup") == "true") {
- retry = true;
- }
- }
- if (retry) {
- timer_name = timer_name_;
- }
+ // Create unique timer name per instance.
+ timer_name_ = "PgSqlHostMgr[";
+ timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
+ timer_name_ += "]DbReconnectTimer";
- std::pair<uint32_t, uint32_t> db_version = getVersion(timer_name);
- if (code_version != db_version) {
- isc_throw(DbOpenError,
- "PostgreSQL schema version mismatch: need version: "
- << code_version.first << "." << code_version.second
- << " found version: " << db_version.first << "."
- << db_version.second);
- }
+ PgSqlConnection::ensureSchemaVersion(parameters_,
+ DbCallback(&PgSqlHostDataSourceImpl::dbReconnect),
+ timer_name_);
// Create an initial context.
pool_.reset(new PgSqlHostContextPool());
std::pair<uint32_t, uint32_t>
PgSqlHostDataSourceImpl::getVersion(const std::string& timer_name) const {
- LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
- DHCPSRV_PGSQL_HOST_DB_GET_VERSION);
+ LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_HOST_DB_GET_VERSION);
IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
DbCallback cb(&PgSqlHostDataSourceImpl::dbReconnect);
// Check if the extended info tables are enabled.
setExtendedInfoTablesEnabled(parameters);
- // retry-on-startup?
- bool const retry(parameters.count("retry-on-startup") &&
- parameters.at("retry-on-startup") == "true");
-
- // retry-on-startup disabled. Ensure schema version with empty timer name / no retry.
- if (!retry) {
- ensureSchemaVersion();
- }
-
- // Create unique timer name per instance.
- timer_name_ = "PgSqlLeaseMgr[";
- timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
- timer_name_ += "]DbReconnectTimer";
-
// Check TLS support.
size_t tls(0);
tls += parameters.count("trust-anchor");
}
#endif
- // retry-on-startup enabled. Ensure schema version with timer name set / retries.
- if (retry) {
- ensureSchemaVersion();
- }
+ // Create unique timer name per instance.
+ timer_name_ = "PgSqlLeaseMgr[";
+ timer_name_ += boost::lexical_cast<std::string>(reinterpret_cast<uint64_t>(this));
+ timer_name_ += "]DbReconnectTimer";
+
+ PgSqlConnection::ensureSchemaVersion(parameters_, DbCallback(&PgSqlLeaseMgr::dbReconnect),
+ timer_name_);
// Create an initial context.
pool_.reset(new PgSqlLeaseContextPool());
return (std::string("PostgreSQL Database"));
}
-void
-PgSqlLeaseMgr::ensureSchemaVersion() const {
- LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_GET_VERSION);
-
- IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
- DbCallback cb(&PgSqlLeaseMgr::dbReconnect);
-
- return (PgSqlConnection::ensureSchemaVersion(parameters_, ac, cb, timer_name_));
-}
-
std::pair<uint32_t, uint32_t>
PgSqlLeaseMgr::getVersion(const string& timer_name) const {
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_GET_VERSION);
/// @return Description of the backend.
virtual std::string getDescription() const override;
- void ensureSchemaVersion() const;
-
/// @brief Returns backend version.
///
/// @param timer_name The DB reconnect timer name.
void
MySqlConnection::ensureSchemaVersion(const ParameterMap& parameters,
- const IOServiceAccessorPtr& ac,
const DbCallback& cb,
- const string& timer_name) {
+ string timer_name) {
+ // retry-on-startup?
+ bool const retry(parameters.count("retry-on-startup") &&
+ parameters.at("retry-on-startup") == "true");
+ if (!retry) {
+ // If not, then we need timer_name to be empty to signal that retrying
+ // is not desired.
+ timer_name = string();
+ }
+
+ IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
+
pair<uint32_t, uint32_t> schema_version;
try {
schema_version = getVersion(parameters, ac, cb, timer_name);
/// version, and attempt to initialize the schema if there is an
/// error during retrieval.
///
+ /// Properly handles retrying of the database connection.
+ ///
/// @param parameters A data structure relating keywords and values
/// concerned with the database.
///
/// @throw isc::db::ScehamInitializationFailed if the initialization fails
static void
ensureSchemaVersion(const ParameterMap& parameters,
- const IOServiceAccessorPtr& ac = IOServiceAccessorPtr(),
const DbCallback& cb = DbCallback(),
- const std::string& timer_name = std::string());
+ std::string timer_name = std::string());
/// @brief Initialize schema.
///
void
PgSqlConnection::ensureSchemaVersion(const ParameterMap& parameters,
- const IOServiceAccessorPtr& ac,
const DbCallback& cb,
- const string& timer_name) {
+ string timer_name) {
+ // retry-on-startup?
+ bool const retry(parameters.count("retry-on-startup") &&
+ parameters.at("retry-on-startup") == "true");
+ if (!retry) {
+ // If not, then we need timer_name to be empty to signal that retrying
+ // is not desired.
+ timer_name = string();
+ }
+
+ IOServiceAccessorPtr ac(new IOServiceAccessor(&DatabaseConnection::getIOService));
+
pair<uint32_t, uint32_t> schema_version;
try {
schema_version = getVersion(parameters, ac, cb, timer_name);
/// version, and attempt to initialize the schema if there is an
/// error during retrieval.
///
+ /// Properly handles retrying of the database connection.
+ ///
/// @param parameters A data structure relating keywords and values
/// concerned with the database.
///
/// @throw isc::db::ScehamInitializationFailed if the initialization fails
static void
ensureSchemaVersion(const ParameterMap& parameters,
- const IOServiceAccessorPtr& ac = IOServiceAccessorPtr(),
const DbCallback& cb = DbCallback(),
- const std::string& timer_name = std::string());
+ std::string timer_name = std::string());
/// @brief Initialize schema.
///