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=$?
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
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
# 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"
MySqlBinding::createInteger<uint64_t>(), // id
MySqlBinding::createString(GLOBAL_PARAMETER_NAME_BUF_LENGTH), // name
MySqlBinding::createString(GLOBAL_PARAMETER_VALUE_BUF_LENGTH), // value
+ MySqlBinding::createInteger<uint8_t>(), // parameter_type
MySqlBinding::createTimestamp() // modification_ts
};
[¶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<uint8_t>();
+
+ StampedValuePtr stamped_value;
+
+ try {
+ switch (static_cast<Element::types>(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<int64_t>(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<double>(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);
}
});
MySqlBindingCollection in_bindings = {
MySqlBinding::createString(value->getName()),
MySqlBinding::createString(value->getValue()),
+ MySqlBinding::createInteger<uint8_t>(value->getType()),
MySqlBinding::createTimestamp(value->getModificationTime()),
MySqlBinding::createString(tag),
MySqlBinding::createString(value->getName())
" 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 " \
"INSERT INTO " #table_prefix "_global_parameter(" \
" name," \
" value," \
+ " parameter_type," \
" modification_ts" \
- ") VALUES (?, ?, ?)"
+ ") VALUES (?, ?, ?, ?)"
#endif
#ifndef MYSQL_INSERT_GLOBAL_PARAMETER_SERVER
"SET" \
" g.name = ?," \
" g.value = ?," \
+ " g.parameter_type = ?," \
" g.modification_ts = ? " \
"WHERE s.tag = ? AND g.name = ?"
#endif
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
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;
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