--- /dev/null
+#!/bin/sh
+
+# Include utilities. Use installed version if available and
+# use build version if it isn't.
+if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
+ . @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh
+else
+ . @abs_top_builddir@/src/bin/admin/admin-utils.sh
+fi
+
+VERSION=`mysql_version "$@"`
+
+if [ "$VERSION" != "3.0" ]; then
+ printf "This script upgrades 3.0 to 4.0. Reported version is $VERSION. Skipping upgrade.\n"
+ exit 0
+fi
+
+mysql "$@" <<EOF
+# Add state column to the lease4 table.
+ALTER TABLE lease4
+ ADD COLUMN state INT UNSIGNED DEFAULT 0;
+
+# Add state column to the lease6 table.
+ALTER TABLE lease6
+ ADD COLUMN state INT UNSIGNED DEFAULT 0;
+
+# Create indexes for querying leases in a given state and segregated
+# by the expiration time. One of the applications is to retrieve all
+# expired leases. However, these indexes can be also used to retrieve
+# leases in a given state regardless of the expiration time.
+CREATE INDEX lease4_by_state_expire ON lease4 (state, expire);
+CREATE INDEX lease6_by_state_expire ON lease6 (state, expire);
+
+# Create table holding mapping of the lease states to their names.
+# This is not used in queries from the DHCP server but rather in
+# direct queries from the lease database management tools.
+CREATE TABLE IF NOT EXISTS lease_state (
+ state INT UNSIGNED PRIMARY KEY NOT NULL,
+ name VARCHAR(64) NOT NULL);
+
+# Insert currently defined state names.
+INSERT INTO lease_state VALUES (0, "default");
+INSERT INTO lease_state VALUES (1, "declined");
+INSERT INTO lease_state VALUES (2, "expired-reclaimed");
+
+# FUNCTION that returns a result set containing the column names for lease4 dumps
+DROP PROCEDURE IF EXISTS lease4DumpHeader;
+DELIMITER $$
+CREATE PROCEDURE lease4DumpHeader()
+BEGIN
+SELECT 'address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname,state';
+END $$
+DELIMITER ;
+
+# FUNCTION that returns a result set containing the data for lease4 dumps
+DROP PROCEDURE IF EXISTS lease4DumpData;
+DELIMITER $$
+CREATE PROCEDURE lease4DumpData()
+BEGIN
+SELECT
+ INET_NTOA(l.address),
+ IFNULL(HEX(l.hwaddr), ''),
+ IFNULL(HEX(l.client_id), ''),
+ l.valid_lifetime,
+ l.expire,
+ l.subnet_id,
+ l.fqdn_fwd,
+ l.fqdn_rev,
+ l.hostname,
+ s.name
+from
+ lease4 l
+ LEFT OUTER JOIN lease_state s on (l.state = s.state);
+END $$
+DELIMITER ;
+
+# FUNCTION that returns a result set containing the column names for lease6 dumps
+DROP PROCEDURE IF EXISTS lease6DumpHeader;
+DELIMITER $$
+CREATE PROCEDURE lease6DumpHeader()
+BEGIN
+SELECT 'address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,hwaddr,hwtype,hwaddr_source,state';
+END $$
+DELIMITER ;
+
+# FUNCTION that returns a result set containing the data for lease6 dumps
+DROP PROCEDURE IF EXISTS lease6DumpData;
+DELIMITER $$
+CREATE PROCEDURE lease6DumpData()
+BEGIN
+SELECT
+ l.address,
+ IFNULL(HEX(l.duid), ''),
+ l.valid_lifetime,
+ l.expire,
+ l.subnet_id,
+ l.pref_lifetime,
+ IFNULL(t.name, ''),
+ l.iaid,
+ l.prefix_len,
+ l.fqdn_fwd,
+ l.fqdn_rev,
+ l.hostname,
+ IFNULL(HEX(l.hwaddr), ''),
+ IFNULL(l.hwtype, ''),
+ IFNULL(l.hwaddr_source, ''),
+ IFNULL(s.name, '')
+FROM lease6 l
+ left outer join lease6_types t on (l.lease_type = t.lease_type)
+ left outer join lease_state s on (l.state = s.state);
+END $$
+DELIMITER ;
+
+# Update the schema version number
+UPDATE schema_version
+SET version = '4', minor = '0';
+# This line concludes database upgrade to version 4.0.
+EOF
+
+RESULT=$?
+
+exit $?
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 3.0
+ # Ok, we have a 1.0 database. Let's upgrade it to 4.0
${keaadmin} lease-upgrade mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
ERRCODE=$?
ERRCODE=$?
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
+ #table: lease_state table added (upgrade 3.0 -> 4.0)
+ mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
+ SELECT state,name from lease_state;
+EOF
+ ERRCODE=$?
+ assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
+
+ #table: state column added to lease4 (upgrade 3.0 -> 4.0)
+ mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
+ SELECT state from lease4;
+EOF
+ ERRCODE=$?
+ assert_eq 0 $ERRCODE "lease4 is missing state column. (returned status code %d, expected %d)"
+
+ #table: state column added to lease6 (upgrade 3.0 -> 4.0)
+ mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
+ SELECT state from lease6;
+EOF
+ ERRCODE=$?
+ assert_eq 0 $ERRCODE "lease6 is missing state column. (returned status code %d, expected %d)"
+
+ #table: stored procedures for lease dumps added (upgrade 3.0 -> 4.0)
+ mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
+ call lease4DumpHeader(); call lease4DumpData(); call lease6DumpHeader(); call lease6DumpHeader();
+EOF
+ ERRCODE=$?
+ assert_eq 0 $ERRCODE "lease dump stored procedures are missing or broken. (returned status code %d, expected %d)"
- # Verify that it reports version 3.0.
+ # Verify that it reports version 4.0.
version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name)
- assert_str_eq "3.0" ${version} "Expected kea-admin to return %s, returned value was %s"
+ assert_str_eq "4.0" ${version} "Expected kea-admin to return %s, returned value was %s"
# Let's wipe the whole database
mysql_wipe