From: Marcin Siodelski Date: Wed, 6 Feb 2019 20:38:40 +0000 (+0100) Subject: [#451,!227] Store "unspecified" triplets as NULL in the MySQL DB. X-Git-Tag: 458-config-backend-support-in-src-lib_base~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54758c985bc3517d9b53dec5590adb3a9f012cf0;p=thirdparty%2Fkea.git [#451,!227] Store "unspecified" triplets as NULL in the MySQL DB. --- diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc index 55febd7216..5d6cae5e28 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc @@ -356,11 +356,11 @@ public: std::string subnet_prefix = out_bindings[1]->getString(); auto prefix_pair = Subnet4::parsePrefix(subnet_prefix); // renew_timer - uint32_t renew_timer = out_bindings[13]->getIntegerOrDefault(0); + auto renew_timer = createTriplet(out_bindings[13]); // rebind_timer - uint32_t rebind_timer = out_bindings[11]->getIntegerOrDefault(0); + auto rebind_timer = createTriplet(out_bindings[11]); // valid_lifetime - uint32_t valid_lifetime = out_bindings[19]->getIntegerOrDefault(0); + auto valid_lifetime = createTriplet(out_bindings[19]); // Create subnet with basic settings. last_subnet.reset(new Subnet4(prefix_pair.first, prefix_pair.second, @@ -778,15 +778,15 @@ public: MySqlBinding::createInteger(static_cast(subnet->getMatchClientId())), MySqlBinding::createTimestamp(subnet->getModificationTime()), MySqlBinding::condCreateInteger(subnet->getSiaddr().toUint32()), - MySqlBinding::createInteger(subnet->getT2()), + createBinding(subnet->getT2()), createInputRelayBinding(subnet), - MySqlBinding::createInteger(subnet->getT1()), + createBinding(subnet->getT1()), createInputRequiredClassesBinding(subnet), MySqlBinding::createInteger(static_cast(subnet->getHostReservationMode())), MySqlBinding::condCreateString(subnet->getSname()), shared_network_binding, createInputContextBinding(subnet), - MySqlBinding::createInteger(subnet->getValid()) + createBinding(subnet->getValid()) }; MySqlTransaction transaction(conn_); @@ -1027,7 +1027,7 @@ public: // rebind_timer if (!out_bindings[6]->amNull()) { - last_network->setT2(out_bindings[6]->getInteger()); + last_network->setT2(createTriplet(out_bindings[6])); } // relay @@ -1048,7 +1048,7 @@ public: // renew_timer if (!out_bindings[8]->amNull()) { - last_network->setT1(out_bindings[8]->getInteger()); + last_network->setT1(createTriplet(out_bindings[8])); } // require_client_classes @@ -1080,7 +1080,7 @@ public: // valid_lifetime if (!out_bindings[12]->amNull()) { - last_network->setValid(out_bindings[12]->getInteger()); + last_network->setValid(createTriplet(out_bindings[12])); } shared_networks.push_back(last_network); @@ -1187,14 +1187,14 @@ public: MySqlBinding::condCreateString(shared_network->getIface()), MySqlBinding::createInteger(static_cast(shared_network->getMatchClientId())), MySqlBinding::createTimestamp(shared_network->getModificationTime()), - MySqlBinding::condCreateInteger(shared_network->getT2()), + createBinding(shared_network->getT2()), createInputRelayBinding(shared_network), - MySqlBinding::condCreateInteger(shared_network->getT1()), + createBinding(shared_network->getT1()), createInputRequiredClassesBinding(shared_network), MySqlBinding::createInteger(static_cast (shared_network->getHostReservationMode())), createInputContextBinding(shared_network), - MySqlBinding::condCreateInteger(shared_network->getValid()) + createBinding(shared_network->getValid()) }; MySqlTransaction transaction(conn_); diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_impl.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_impl.cc index 1152c7e9d3..42b7dc2bd8 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_impl.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_impl.cc @@ -86,6 +86,28 @@ MySqlConfigBackendImpl::~MySqlConfigBackendImpl() { } } +MySqlBindingPtr +MySqlConfigBackendImpl::createBinding(const Triplet& triplet) const { + if (triplet.unspecified()) { + return (MySqlBinding::createNull()); + } + return (MySqlBinding::createInteger(triplet.get())); +} + +Triplet +MySqlConfigBackendImpl::createTriplet(const MySqlBindingPtr& binding) const { + if (!binding) { + isc_throw(Unexpected, "MySQL configuration backend internal error: " + "binding is NULL when creating a triplet value"); + } + + if (binding->amNull()) { + return (Triplet()); + } + + return (Triplet(binding->getInteger())); +} + void MySqlConfigBackendImpl::createAuditRevision(const int index, const ServerSelector& server_selector, diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_impl.h b/src/hooks/dhcp/mysql_cb/mysql_cb_impl.h index fafc7f77df..0d1171de3c 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_impl.h +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_impl.h @@ -106,6 +106,25 @@ public: /// @brief Destructor. ~MySqlConfigBackendImpl(); + /// @brief Creates MySQL binding from a @c Triplet. + /// + /// @param triplet Triplet value from which the binding should be created. + /// @return Pointer to a null binding if the triplet is "unspecified" or + /// a pointer to a binding representing 32-bit unsigned integer value + /// otherwise. + db::MySqlBindingPtr createBinding(const Triplet& triplet) const; + + /// @brief Creates @c Triplet object from MySQL binding. + /// + /// @param binding Pointer to the MySQL binding. + /// @return Triplet value set to "unspecified" if the MySQL binding + /// represents a NULL value or a Triplet value encapsulating 32-bit + /// unsigned integer if the MySQL represents an integer. + /// @throw isc::Unexpected if the provided binding pointer is NULL. + /// @throw isc::InvalidOperation if the binding does not represent + /// a 32-bit unsigned integer. + Triplet createTriplet(const db::MySqlBindingPtr& binding) const; + /// @brief Returns server tags associated with the particular selector. /// /// @param server_selector Server selector. diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc index eed4f3e696..f0f1c6e49f 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc @@ -152,6 +152,10 @@ public: test_subnets_.push_back(subnet); subnet.reset(new Subnet4(IOAddress("192.0.3.0"), 24, 20, 30, 40, 2048)); + Triplet null_timer; + subnet->setT1(null_timer); + subnet->setT2(null_timer); + subnet->setValid(null_timer); test_subnets_.push_back(subnet); subnet.reset(new Subnet4(IOAddress("192.0.4.0"), 24, 30, 40, 60, 4096)); @@ -200,6 +204,10 @@ public: // Add more shared networks. shared_network.reset(new SharedNetwork4("level2")); + Triplet null_timer; + shared_network->setT1(null_timer); + shared_network->setT2(null_timer); + shared_network->setValid(null_timer); test_networks_.push_back(shared_network); shared_network.reset(new SharedNetwork4("level3"));