From: Marcin Siodelski Date: Wed, 30 Jan 2019 21:01:24 +0000 (+0100) Subject: [#429,!217] Extended dhcpX_global_parameter: added parameter_type. X-Git-Tag: 429-Updated-StampedValue-to-support-reals_base~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63e0cbda5c0167eefbcaae0dd95f66ba5e42beec;p=thirdparty%2Fkea.git [#429,!217] Extended dhcpX_global_parameter: added parameter_type. --- diff --git a/src/bin/admin/tests/mysql_tests.sh.in b/src/bin/admin/tests/mysql_tests.sh.in index 06357b65f5..bacb3522bd 100644 --- a/src/bin/admin/tests/mysql_tests.sh.in +++ b/src/bin/admin/tests/mysql_tests.sh.in @@ -258,7 +258,7 @@ mysql_upgrade_test() { assert_str_eq "1.0" ${version} "Expected kea-admin to return %s, returned value was %s" - # Ok, we have a 1.0 database. Let's upgrade it to 7.0 + # Ok, we have a 1.0 database. Let's upgrade it to 8.0 ${keaadmin} lease-upgrade mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir ERRCODE=$? @@ -491,7 +491,7 @@ EOF run_statement "dhcp4_audit" "$qry" # table: dhcp4_global_parameter - qry="select id, name, value, modification_ts from dhcp4_global_parameter" + qry="select id, name, value, parameter_type, modification_ts from dhcp4_global_parameter" run_statement "dhcp4_global_parameter" "$qry" # table: dhcp4_global_parameter_server @@ -547,7 +547,7 @@ EOF run_statement "dhcp6_audit" "$qry" # table: dhcp6_global_parameter - qry="select id, name, value, modification_ts from dhcp6_global_parameter" + qry="select id, name, value, parameter_type, modification_ts from dhcp6_global_parameter" run_statement "dhcp6_global_parameter" "$qry" # table: dhcp6_global_parameter_server @@ -642,6 +642,10 @@ EOF # New triggers aren't tested here because the extensive tests are # provided with the backend implementations. + # parameter_data_type must exist and must have 4 rows. + qry="SELECT COUNT(*) FROM parameter_data_type"; + run_statement "parameter_data_type count" "$qry" 4; + # Verify upgraded schema reports version 8.0 version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir) assert_str_eq "8.0" ${version} "Expected kea-admin to return %s, returned value was %s" diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc index 02bedf31ef..0b7ae95e71 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc @@ -152,6 +152,7 @@ public: MySqlBinding::createInteger(), // id MySqlBinding::createString(GLOBAL_PARAMETER_NAME_BUF_LENGTH), // name MySqlBinding::createString(GLOBAL_PARAMETER_VALUE_BUF_LENGTH), // value + MySqlBinding::createInteger(), // parameter_type MySqlBinding::createTimestamp() // modification_ts }; @@ -159,9 +160,44 @@ public: [¶meters] (MySqlBindingCollection& out_bindings) { if (!out_bindings[1]->getString().empty()) { - StampedValuePtr stamped_value(new StampedValue(out_bindings[1]->getString(), - out_bindings[2]->getString())); - stamped_value->setModificationTime(out_bindings[3]->getTimestamp()); + std::string name = out_bindings[1]->getString(); + std::string value = out_bindings[2]->getString(); + uint8_t parameter_type = out_bindings[3]->getInteger(); + + StampedValuePtr stamped_value; + + try { + switch (static_cast(parameter_type)) { + case Element::string: + stamped_value = StampedValue::create(name, value); + break; + + case Element::integer: + stamped_value = StampedValue::create(name, + Element::create(boost::lexical_cast(value))); + break; + + case Element::boolean: + stamped_value = StampedValue::create(name, + Element::create((value == "1") ? true : false)); + break; + + case Element::real: + stamped_value = StampedValue::create(name, + Element::create(boost::lexical_cast(value))); + break; + + default: + isc_throw(TypeError, "invalid type of the parameter '" + << name << "' fetched from the database"); + } + + } catch (const boost::bad_lexical_cast& ex) { + isc_throw(BadValue, "actual type of the value '" << name + << "' is different than marked in the database"); + } + + stamped_value->setModificationTime(out_bindings[4]->getTimestamp()); parameters.insert(stamped_value); } }); @@ -209,6 +245,7 @@ public: MySqlBindingCollection in_bindings = { MySqlBinding::createString(value->getName()), MySqlBinding::createString(value->getValue()), + MySqlBinding::createInteger(value->getType()), MySqlBinding::createTimestamp(value->getModificationTime()), MySqlBinding::createString(tag), MySqlBinding::createString(value->getName()) diff --git a/src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h b/src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h index 7e5fa0c312..f2eba3eabe 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h +++ b/src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h @@ -35,6 +35,7 @@ namespace { " g.id," \ " g.name," \ " g.value," \ + " g.parameter_type," \ " g.modification_ts " \ "FROM " #table_prefix "_global_parameter AS g " \ "INNER JOIN " #table_prefix "_global_parameter_server AS a " \ @@ -217,8 +218,9 @@ namespace { "INSERT INTO " #table_prefix "_global_parameter(" \ " name," \ " value," \ + " parameter_type," \ " modification_ts" \ - ") VALUES (?, ?, ?)" + ") VALUES (?, ?, ?, ?)" #endif #ifndef MYSQL_INSERT_GLOBAL_PARAMETER_SERVER @@ -322,6 +324,7 @@ namespace { "SET" \ " g.name = ?," \ " g.value = ?," \ + " g.parameter_type = ?," \ " g.modification_ts = ? " \ "WHERE s.tag = ? AND g.name = ?" #endif diff --git a/src/share/database/scripts/mysql/dhcpdb_create.mysql b/src/share/database/scripts/mysql/dhcpdb_create.mysql index 825df9ad67..3672f53c7f 100644 --- a/src/share/database/scripts/mysql/dhcpdb_create.mysql +++ b/src/share/database/scripts/mysql/dhcpdb_create.mysql @@ -1849,6 +1849,38 @@ CREATE TRIGGER dhcp4_options_ADEL AFTER DELETE ON dhcp4_options END $$ DELIMITER ; +-- ----------------------------------------------------- +-- Table `parameter_data_type` +-- Reflects an enum used by Kea to define supported +-- data types for the simple configuration parameters, +-- e.g. global parameters used by DHCP servers. +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS parameter_data_type ( + id TINYINT UNSIGNED NOT NULL PRIMARY KEY, + name VARCHAR(32) NOT NULL +) ENGINE = InnoDB; + +START TRANSACTION; +INSERT INTO parameter_data_type VALUES (0, 'integer'); +INSERT INTO parameter_data_type VALUES (1, 'real'); +INSERT INTO parameter_data_type VALUES (2, 'boolean'); +INSERT INTO parameter_data_type VALUES (4, 'string'); +COMMIT; + +ALTER TABLE dhcp4_global_parameter + ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL; + +ALTER TABLE dhcp4_global_parameter + ADD CONSTRAINT fk_dhcp4_global_parameter_type FOREIGN KEY (parameter_type) + REFERENCES parameter_data_type (id); + +ALTER TABLE dhcp6_global_parameter + ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL; + +ALTER TABLE dhcp6_global_parameter + ADD CONSTRAINT fk_dhcp6_global_parameter_type FOREIGN KEY (parameter_type) + REFERENCES parameter_data_type (id); + # Update the schema version number UPDATE schema_version diff --git a/src/share/database/scripts/mysql/dhcpdb_drop.mysql b/src/share/database/scripts/mysql/dhcpdb_drop.mysql index 7fcb8734ee..945e59dc9b 100644 --- a/src/share/database/scripts/mysql/dhcpdb_drop.mysql +++ b/src/share/database/scripts/mysql/dhcpdb_drop.mysql @@ -59,6 +59,7 @@ DROP TABLE IF EXISTS dhcp6_shared_network_server; DROP TABLE IF EXISTS dhcp6_subnet; DROP TABLE IF EXISTS dhcp6_subnet_server; DROP TABLE IF EXISTS modification; +DROP TABLE IF EXISTS parameter_data_type; DROP PROCEDURE IF EXISTS createAuditRevisionDHCP4; DROP PROCEDURE IF EXISTS createAuditEntryDHCP4; DROP TRIGGER IF EXISTS dhcp4_global_parameter_AINS; diff --git a/src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh.in b/src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh.in index 064492aa6f..3bf915266f 100644 --- a/src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh.in +++ b/src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh.in @@ -532,6 +532,38 @@ CREATE TRIGGER dhcp4_options_ADEL AFTER DELETE ON dhcp4_options END $$ DELIMITER ; +-- ----------------------------------------------------- +-- Table parameter_data_type +-- Reflects an enum used by Kea to define supported +-- data types for the simple configuration parameters, +-- e.g. global parameters used by DHCP servers. +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS parameter_data_type ( + id TINYINT UNSIGNED NOT NULL PRIMARY KEY, + name VARCHAR(32) NOT NULL +) ENGINE = InnoDB; + +START TRANSACTION; +INSERT INTO parameter_data_type VALUES (0, 'integer'); +INSERT INTO parameter_data_type VALUES (1, 'real'); +INSERT INTO parameter_data_type VALUES (2, 'boolean'); +INSERT INTO parameter_data_type VALUES (4, 'string'); +COMMIT; + +ALTER TABLE dhcp4_global_parameter + ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL; + +ALTER TABLE dhcp4_global_parameter + ADD CONSTRAINT fk_dhcp4_global_parameter_type FOREIGN KEY (parameter_type) + REFERENCES parameter_data_type (id); + +ALTER TABLE dhcp6_global_parameter + ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL; + +ALTER TABLE dhcp6_global_parameter + ADD CONSTRAINT fk_dhcp6_global_parameter_type FOREIGN KEY (parameter_type) + REFERENCES parameter_data_type (id); + # Update the schema version number UPDATE schema_version