lease_mgr_factory.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright (C) 2012-2015 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. #include <config.h>
  7. #include <dhcpsrv/dhcpsrv_log.h>
  8. #include <dhcpsrv/lease_mgr_factory.h>
  9. #include <dhcpsrv/memfile_lease_mgr.h>
  10. #ifdef HAVE_MYSQL
  11. #include <dhcpsrv/mysql_lease_mgr.h>
  12. #endif
  13. #ifdef HAVE_PGSQL
  14. #include <dhcpsrv/pgsql_lease_mgr.h>
  15. #endif
  16. #ifdef HAVE_CQL
  17. #include <dhcpsrv/cql_lease_mgr.h>
  18. #endif
  19. #include <boost/algorithm/string.hpp>
  20. #include <boost/foreach.hpp>
  21. #include <algorithm>
  22. #include <iostream>
  23. #include <iterator>
  24. #include <map>
  25. #include <sstream>
  26. #include <utility>
  27. using namespace std;
  28. namespace isc {
  29. namespace dhcp {
  30. boost::scoped_ptr<LeaseMgr>&
  31. LeaseMgrFactory::getLeaseMgrPtr() {
  32. static boost::scoped_ptr<LeaseMgr> leaseMgrPtr;
  33. return (leaseMgrPtr);
  34. }
  35. void
  36. LeaseMgrFactory::create(const std::string& dbaccess) {
  37. const std::string type = "type";
  38. // Parse the access string and create a redacted string for logging.
  39. DatabaseConnection::ParameterMap parameters = DatabaseConnection::parse(dbaccess);
  40. std::string redacted = DatabaseConnection::redactedAccessString(parameters);
  41. // Is "type" present?
  42. if (parameters.find(type) == parameters.end()) {
  43. LOG_ERROR(dhcpsrv_logger, DHCPSRV_NOTYPE_DB).arg(dbaccess);
  44. isc_throw(InvalidParameter, "Database configuration parameters do not "
  45. "contain the 'type' keyword");
  46. }
  47. // Yes, check what it is.
  48. #ifdef HAVE_MYSQL
  49. if (parameters[type] == string("mysql")) {
  50. LOG_INFO(dhcpsrv_logger, DHCPSRV_MYSQL_DB).arg(redacted);
  51. getLeaseMgrPtr().reset(new MySqlLeaseMgr(parameters));
  52. return;
  53. }
  54. #endif
  55. #ifdef HAVE_PGSQL
  56. if (parameters[type] == string("postgresql")) {
  57. LOG_INFO(dhcpsrv_logger, DHCPSRV_PGSQL_DB).arg(redacted);
  58. getLeaseMgrPtr().reset(new PgSqlLeaseMgr(parameters));
  59. return;
  60. }
  61. #endif
  62. #ifdef HAVE_CQL
  63. if (parameters[type] == string("cql")) {
  64. LOG_INFO(dhcpsrv_logger, DHCPSRV_CQL_DB).arg(redacted);
  65. getLeaseMgrPtr().reset(new CqlLeaseMgr(parameters));
  66. return;
  67. }
  68. #endif
  69. if (parameters[type] == string("memfile")) {
  70. LOG_INFO(dhcpsrv_logger, DHCPSRV_MEMFILE_DB).arg(redacted);
  71. getLeaseMgrPtr().reset(new Memfile_LeaseMgr(parameters));
  72. return;
  73. }
  74. // Get here on no match
  75. LOG_ERROR(dhcpsrv_logger, DHCPSRV_UNKNOWN_DB).arg(parameters[type]);
  76. isc_throw(InvalidType, "Database access parameter 'type' does "
  77. "not specify a supported database backend:" << parameters[type]);
  78. }
  79. void
  80. LeaseMgrFactory::destroy() {
  81. // Destroy current lease manager. This is a no-op if no lease manager
  82. // is available.
  83. if (getLeaseMgrPtr()) {
  84. LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE, DHCPSRV_CLOSE_DB)
  85. .arg(getLeaseMgrPtr()->getType());
  86. }
  87. getLeaseMgrPtr().reset();
  88. }
  89. LeaseMgr&
  90. LeaseMgrFactory::instance() {
  91. LeaseMgr* lmptr = getLeaseMgrPtr().get();
  92. if (lmptr == NULL) {
  93. isc_throw(NoLeaseManager, "no current lease manager is available");
  94. }
  95. return (*lmptr);
  96. }
  97. }; // namespace dhcp
  98. }; // namespace isc