// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include "config.h" #include #include #include #ifdef HAVE_MYSQL #include #endif #ifdef HAVE_PGSQL #include #endif #include #include #include #include #include #include #include #include #include using namespace std; namespace isc { namespace dhcp { HostDataSourcePtr& HostDataSourceFactory::getHostDataSourcePtr() { static HostDataSourcePtr hostDataSourcePtr; return (hostDataSourcePtr); } void HostDataSourceFactory::create(const std::string& dbaccess) { // Parse the access string and create a redacted string for logging. DatabaseConnection::ParameterMap parameters = DatabaseConnection::parse(dbaccess); // Get the databaase type and open the corresponding database DatabaseConnection::ParameterMap::iterator it = parameters.find("type"); if (it == parameters.end()) { isc_throw(InvalidParameter, "Host database configuration does not " "contain the 'type' keyword"); } std::string db_type = it->second; #ifdef HAVE_MYSQL if (db_type == "mysql") { LOG_INFO(dhcpsrv_logger, DHCPSRV_MYSQL_HOST_DB) .arg(DatabaseConnection::redactedAccessString(parameters)); getHostDataSourcePtr().reset(new MySqlHostDataSource(parameters)); return; } #endif #ifdef HAVE_PGSQL if (db_type == "postgresql") { LOG_INFO(dhcpsrv_logger, DHCPSRV_PGSQL_HOST_DB) .arg(DatabaseConnection::redactedAccessString(parameters)); getHostDataSourcePtr().reset(new PgSqlHostDataSource(parameters)); return; } #endif // Get here on no match. isc_throw(InvalidType, "Hosts database access parameter 'type': " << db_type << " is invalid"); } void HostDataSourceFactory::destroy() { // Destroy current host data source instance. This is a no-op if no host // data source is available. if (getHostDataSourcePtr()) { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE, HOSTS_CFG_CLOSE_HOST_DATA_SOURCE) .arg(getHostDataSourcePtr()->getType()); } getHostDataSourcePtr().reset(); } #if 0 BaseHostDataSource& HostDataSourceFactory::instance() { BaseHostDataSource* hdsptr = getHostDataSourcePtr().get(); if (hdsptr == NULL) { isc_throw(NoHostDataSourceManager, "no current host data source instance is available"); } return (*hdsptr); } #endif }; // namespace dhcp }; // namespace isc