]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2909] Mysql v6 addresses to binary
authorThomas Markwalder <tmark@isc.org>
Wed, 14 Jun 2023 15:02:55 +0000 (11:02 -0400)
committerThomas Markwalder <tmark@isc.org>
Wed, 21 Jun 2023 18:21:08 +0000 (14:21 -0400)
lease6.address and ipv6_reservations.address columns
changed from varbinary(39) to binary(16).

lease6.binaddr column removed

deleted:    src/share/api/binary-address6-upgrade.json
new file:   src/share/database/scripts/mysql/upgrade_018_to_019.sh.in

configure.ac
   added new mysql upgrade script

doc/sphinx/arm/hooks-lease-query.rst
    removed doc for binary-address6-upgrade command

src/bin/admin/tests/mysql_tests.sh.in
    modified to use inet6_aton/ntoa as now needed
    Updated to test upgrage

src/lib/dhcpsrv/lease_mgr.h
    LeaseMgr::upgradeBinaryAddress6() - no longer
    abstract, provides a dummy implemention

src/lib/dhcpsrv/mysql_host_data_source.cc
    Change v6 reservation address to binary

src/lib/dhcpsrv/mysql_lease_mgr.*
    Remove lease6.binaddr and uses
    Change lease6.address to binary

src/lib/mysql/mysql_constants.h
    Update schema version

src/share/api/api_files.mk
    Remove binary-address6-upgrade.json

src/share/database/scripts/mysql/Makefile.am
    Add upgrade script

src/share/database/scripts/mysql/dhcpdb_create.mysql
    Modify lease6, ipv6_reservations, and impacted functions

16 files changed:
configure.ac
doc/sphinx/api-files.txt
doc/sphinx/arm/hooks-lease-query.rst
src/bin/admin/tests/mysql_tests.sh.in
src/lib/dhcpsrv/lease_mgr.h
src/lib/dhcpsrv/mysql_host_data_source.cc
src/lib/dhcpsrv/mysql_lease_mgr.cc
src/lib/dhcpsrv/mysql_lease_mgr.h
src/lib/mysql/mysql_connection.cc
src/lib/mysql/mysql_constants.h
src/share/api/api_files.mk
src/share/api/binary-address6-upgrade.json [deleted file]
src/share/database/scripts/mysql/.gitignore
src/share/database/scripts/mysql/Makefile.am
src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/upgrade_018_to_019.sh.in [new file with mode: 0644]

index 74206e8c336afe40c9f2d9e6c973f23fc0c3de97..577ca3e6b5e9d8c175cfac2575c2bc88aa415e8b 100644 (file)
@@ -1700,6 +1700,8 @@ AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_016_to_017.sh],
                 [chmod +x src/share/database/scripts/mysql/upgrade_016_to_017.sh])
 AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_017_to_018.sh],
                 [chmod +x src/share/database/scripts/mysql/upgrade_017_to_018.sh])
+AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_018_to_019.sh],
+                [chmod +x src/share/database/scripts/mysql/upgrade_018_to_019.sh])
 AC_CONFIG_FILES([src/share/database/scripts/mysql/wipe_data.sh],
                 [chmod +x src/share/database/scripts/mysql/wipe_data.sh])
 AC_CONFIG_FILES([src/share/database/scripts/pgsql/Makefile])
index a23b09d7607282d3e4c023c91a1ed56ec349d9e6..b4b602e3b4793257def9168ed6acf44863e8662c 100644 (file)
@@ -1,4 +1,3 @@
-src/share/api/binary-address6-upgrade.json
 src/share/api/build-report.json
 src/share/api/cache-clear.json
 src/share/api/cache-flush.json
index edc0230d7bc5239b2ca853eba66b08d8d809f871..56f9742a4790589a059f610d4ab3e99f9d2e0657 100644 (file)
@@ -625,17 +625,7 @@ For DHCPv4 lease data, the command is:
         "command": "extended-info4-upgrade"
     }
 
-.. isccmd:: binary-address6-upgrade
-.. _command-binary-address6-upgrade:
-
-For DHCPv6 lease data, there are two commands, for upgrading the binary
-address used for by link address query the command is:
-
-::
-
-    {
-        "command": "binary-address6-upgrade"
-    }
+For DHCPv6 lease data, the command is:
 
 .. isccmd:: extended-info6-upgrade
 .. _command-extended-info6-upgrade:
index 21b22e5777d4ee91608f825384f546085e04e039..9fc9d69da138660099b961451a60ed66694e687a 100644 (file)
@@ -359,7 +359,7 @@ mysql_upgrade_12_to_13_test() {
 
     # Check lease6Dump*().
     run_command \
-        mysql_execute "INSERT INTO lease6 VALUES('::10',20,30,(SELECT FROM_UNIXTIME(1678900000)),40,50,1,60,70,1,1,'one,example,com',80,90,16,0,'{ \"a\": 1, \"b\": 2 }',0, NULL)"
+        mysql_execute "INSERT INTO lease6 VALUES(inet6_aton('::10'),20,30,(SELECT FROM_UNIXTIME(1678900000)),40,50,1,60,70,1,1,'one,example,com',80,90,16,0,'{ \"a\": 1, \"b\": 2 }',0)"
     assert_eq 0 "${EXIT_CODE}" 'INSERT INTO lease6 failed, expected exit code %d, actual %d'
     assert_str_eq '' "${OUTPUT}"
 
@@ -767,7 +767,7 @@ mysql_upgrade_17_to_18_test() {
     run_statement "hosts_255_long_dhcp_identifier" "$qry"
 
     #lease6 duid should support 130 long strings.
-    qry="insert into lease6 values('::10',12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL,0,NULL)"
+    qry="insert into lease6 values(inet6_aton('::10'),12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL,0)"
     run_statement "lease6_130_long_duid" "$qry"
 
     #lease4_pool_stat new table.
@@ -782,17 +782,6 @@ mysql_upgrade_17_to_18_test() {
         'SELECT subnet_id, pool_id, lease_type, state, leases FROM lease6_pool_stat'
     assert_eq 0 "${EXIT_CODE}" "lease6_pool_stat table is missing or broken. (expected status code %d, returned %d)"
 
-    #lease6 new binaddr column.
-    qry="select binaddr from lease6"
-    run_statement "lease6" "$qry"
-
-    qry="show indexes from lease6 where key_name = 'lease6_by_binaddr'"
-    run_command \
-        mysql_execute "${qry}"
-    assert_eq 0 "${EXIT_CODE}" "show indexes from lease6 failed. (expected status code %d, returned %d)"
-    count=$(echo "${OUTPUT}" | grep -Fci lease6_by_binaddr)
-    assert_eq 1 "${count}" "lease6_by_binaddr wrong or missing. (expected count %d, actual %d)"
-
     #lease6_relay_id new table.
     run_command \
         mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
@@ -806,6 +795,25 @@ mysql_upgrade_17_to_18_test() {
     assert_eq 0 "${EXIT_CODE}" "lease6_remote_id table is missing or broken. (expected status code %d, returned %d)"
 }
 
+mysql_upgrade_18_to_19_test() {
+    # Verify that lease6 address is binary.  This is sort of overkill as many of
+    # the prior upgrade tests manipulate lease6 records.
+    qry="insert into lease6 values(inet6_aton('3001::99'),'18219',30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL,0)"
+    run_statement "lease6_insert" "$qry"
+
+    qry="select inet6_ntoa(address) from lease6 where duid = '18219';"
+    run_statement "lease6_insert" "$qry" "3001::99"
+
+    # Verify that ipv6_reservations address is binary.
+    qry="\
+    insert into hosts(host_id, dhcp_identifier, dhcp_identifier_type) values (18219, '18219', 1); \
+    insert into ipv6_reservations (address, prefix_len, type, dhcp6_iaid, host_id) \
+        values (inet6_aton('3001::99'), 128, 1, 123, 18219); \
+    select inet6_ntoa(address) from ipv6_reservations where host_id = 18219;"
+
+    run_statement "ipv6_reservations_insert" "$qry" "3001::99"
+}
+
 mysql_upgrade_test() {
 
     test_start "mysql.upgrade"
@@ -827,7 +835,7 @@ mysql_upgrade_test() {
 
     # Verify that the upgraded schema reports the latest version.
     version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}")
-    assert_str_eq "18.0" "${version}" "Expected kea-admin to return %s, returned value was %s"
+    assert_str_eq "19.0" "${version}" "Expected kea-admin to return %s, returned value was %s"
 
     # Let's check that the new tables are indeed there.
 
@@ -1487,6 +1495,9 @@ SET @disable_audit = 0"
     # Check upgrade from 17.0 to 18.0.
     mysql_upgrade_17_to_18_test
 
+    # Check upgrade from 18.0 to 19.0.
+    mysql_upgrade_18_to_19_test
+
     # Let's wipe the whole database
     mysql_wipe
 
@@ -1591,9 +1602,9 @@ mysql_lease6_dump_test() {
 
     # Insert the reference record
     insert_sql="\
-insert into lease6 values('::10',203,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL,0,NULL);\
-insert into lease6 values('::11',213,30,(SELECT FROM_UNIXTIME(1643210000)),40,50,1,60,70,1,1,'',80,90,1,1,'{  }',0,NULL);\
-insert into lease6 values('::12',223,30,(SELECT FROM_UNIXTIME(1643212345)),40,50,1,60,70,1,1,'three,example,com',80,90,4,2,'{ \"a\": 1, \"b\": \"c\" }',0,NULL)"
+insert into lease6 values(inet6_aton('::10'),203,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL,0);\
+insert into lease6 values(inet6_aton('::11'),213,30,(SELECT FROM_UNIXTIME(1643210000)),40,50,1,60,70,1,1,'',80,90,1,1,'{  }',0);\
+insert into lease6 values(inet6_aton('::12'),223,30,(SELECT FROM_UNIXTIME(1643212345)),40,50,1,60,70,1,1,'three,example,com',80,90,4,2,'{ \"a\": 1, \"b\": \"c\" }',0)"
 
     run_command \
         mysql_execute "$insert_sql"
@@ -1873,7 +1884,7 @@ mysql_lease6_stat_per_type() {
     ltype=$1
 
     # insert a lease6 for addr and ltype, state assigned
-    qry="insert into lease6 (address, lease_type, subnet_id, state) values ($addr,$ltype,1,0)"
+    qry="insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('$addr'),$ltype,1,0)"
     run_statement "#2" "$qry"
 
     # assigned stat should be 1
@@ -1885,7 +1896,7 @@ mysql_lease6_stat_per_type() {
     run_statement "#4" "$qry" 1
 
     # update the lease, changing state to declined
-    qry="update lease6 set state = 1 where address = $addr"
+    qry="update lease6 set state = 1 where address = inet6_aton('$addr')"
     run_statement "#5" "$qry"
 
     # leases stat for assigned state should be 0
@@ -1905,7 +1916,7 @@ mysql_lease6_stat_per_type() {
     run_statement "#9" "$qry" 1
 
     # delete the lease
-    qry="delete from lease6 where address = $addr"
+    qry="delete from lease6 where address = inet6_aton('$addr')"
     run_statement "#10" "$qry"
 
     # leases count for declined state should be 0
@@ -1917,7 +1928,7 @@ mysql_lease6_stat_per_type() {
     run_statement "#12" "$qry" 0
 
     # insert a lease6 for addr and ltype, state assigned
-    qry="insert into lease6 (address, lease_type, subnet_id, pool_id, state) values ($addr1,$ltype,1,1,0)"
+    qry="insert into lease6 (address, lease_type, subnet_id, pool_id, state) values (inet6_aton('$addr1'),$ltype,1,1,0)"
     run_statement "#13" "$qry"
 
     # assigned stat should be 1
@@ -1929,7 +1940,7 @@ mysql_lease6_stat_per_type() {
     run_statement "#15" "$qry" 1
 
     # insert a lease6 for addr and ltype, state assigned
-    qry="insert into lease6 (address, lease_type, subnet_id, pool_id, state) values ($addr2,$ltype,1,2,0)"
+    qry="insert into lease6 (address, lease_type, subnet_id, pool_id, state) values (inet6_aton('$addr2'),$ltype,1,2,0)"
     run_statement "#16" "$qry"
 
     # assigned stat should be 2
@@ -1963,11 +1974,11 @@ mysql_lease6_stat_test() {
     qry="select count(subnet_id) from lease6_stat"
     run_statement "#1" "$qry"
 
-    # Test for address 111, NA lease type
-    mysql_lease6_stat_per_type "111" "112" "113" "0"
+    # Test for address ::11, NA lease type
+    mysql_lease6_stat_per_type "::11" "::12" "::13" "0"
 
-    # Test for address 222, PD lease type
-    mysql_lease6_stat_per_type "222" "223" "224" "1"
+    # Test for address ::22, PD lease type
+    mysql_lease6_stat_per_type "::22" "::23" "::24" "1"
 
     # Let's wipe the whole database
     mysql_wipe
@@ -2004,12 +2015,12 @@ mysql_lease_stat_upgrade_test() {
     run_statement "insert v4 leases" "$qry"
 
     qry=\
-"insert into lease6 (address, lease_type, subnet_id, state) values (111,0,40,0);\
- insert into lease6 (address, lease_type, subnet_id, state) values (222,0,40,1);\
- insert into lease6 (address, lease_type, subnet_id, state) values (333,1,40,0);\
- insert into lease6 (address, lease_type, subnet_id, state) values (444,1,50,0);\
- insert into lease6 (address, lease_type, subnet_id, state) values (555,1,50,0);\
- insert into lease6 (address, lease_type, subnet_id, state) values (666,1,40,2)"
+"insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::11'),0,40,0);\
+ insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::22'),0,40,1);\
+ insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::33'),1,40,0);\
+ insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::44'),1,50,0);\
+ insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::55'),1,50,0);\
+ insert into lease6 (address, lease_type, subnet_id, state) values (inet6_aton('::66'),1,40,2)"
     run_statement "insert v6 leases" "$qry"
 
     # Let's upgrade it to the latest version.
@@ -2149,7 +2160,7 @@ mysql_lease_stat_upgrade_test() {
     #
 
     # Insert a new lease subnet 50
-    qry="insert into lease6 (address, subnet_id, pool_id, lease_type, state) values (777,50,1,1,0)"
+    qry="insert into lease6 (address, subnet_id, pool_id, lease_type, state) values (inet6_aton('::77'),50,1,1,0)"
     run_statement "#6.11" "$qry"
 
     # Assigned count for subnet 50 should be 3
@@ -2165,7 +2176,7 @@ mysql_lease_stat_upgrade_test() {
     run_statement "#6.14" "$qry" 1
 
     # Update the state of the new lease to expired
-    qry="update lease6 set state = 2 where address = 777"
+    qry="update lease6 set state = 2 where address = inet6_aton('::77')"
     run_statement "#6.15" "$qry"
 
     # Assigned count for subnet 50 should be 2 again
@@ -2177,7 +2188,7 @@ mysql_lease_stat_upgrade_test() {
     run_statement "#6.17" "$qry" 0
 
     # Delete another PD lease.
-    qry="delete from lease6 where address = 555"
+    qry="delete from lease6 where address = inet6_aton('::55')"
     run_statement "#6.18" "$qry"
 
     # Assigned leases for subnet 50 should be 1
@@ -2778,8 +2789,8 @@ mysql_update_empty_duid_test() {
     mysql_upgrade_schema_to_version 16.0
 
     sql=\
-"insert into lease6 values('::10',203,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL);\
- insert into lease6 values('::11',UNHEX('00'),30,(SELECT FROM_UNIXTIME(1643210000)),40,50,1,60,70,1,1,'',80,90,1,1,'{  }')"
+"insert into lease6 values(inet6_aton('::10'),203,30,(SELECT FROM_UNIXTIME(1642000000)),40,50,1,60,70,1,1,'one.example.com',80,90,16,0,NULL);\
+ insert into lease6 values(inet6_aton('::11'),UNHEX('00'),30,(SELECT FROM_UNIXTIME(1643210000)),40,50,1,60,70,1,1,'',80,90,1,1,'{  }')"
 
     run_statement "insert v6 leases" "$sql"
 
@@ -2788,11 +2799,11 @@ mysql_update_empty_duid_test() {
         "${kea_admin}" db-upgrade mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
 
     # leases count for declined state should be 1 with DUID updated (0x000000)
-    qry="select count(*) from lease6 where address = '::11' and duid = 0x000000 and state = 1"
+    qry="select count(*) from lease6 where address = inet6_aton('::11') and duid = 0x000000 and state = 1"
     run_statement "#2" "$qry" 1
 
     # leases count for non declined state should be 1 with DUID unchanged (0x323033)
-    qry="select count(*) from lease6 where address = '::10' and duid = 0x323033 and state = 0"
+    qry="select count(*) from lease6 where address = inet6_aton('::10') and duid = 0x323033 and state = 0"
     run_statement "#3" "$qry" 1
 
     # Let's wipe the whole database
index a1259e54d6d03114d4cc448259468911a3cc795f..c4d286996e379cbc1e531db4b2f227ac2ba6f2c0 100644 (file)
@@ -1041,7 +1041,11 @@ public:
     ///
     /// @param page_size The page size used for retrieval.
     /// @return The number of updates in the database.
-    virtual size_t upgradeBinaryAddress6(const LeasePageSize& page_size) = 0;
+    /// @todo This will be obsolete once #2909 is completed for all backends
+    /// and lease-query hook lib
+    virtual size_t upgradeBinaryAddress6(const LeasePageSize& /* page_size */) {
+        return (0);
+    }
 
     /// @brief Build extended info v6 tables.
     ///
index 0c3d56e7f6c04400fc17a7bd95485d8eec4838f7..dd3b73ee73c757e0a5453666d851eab5125f1b96 100644 (file)
@@ -1463,9 +1463,8 @@ public:
                       << ". Only 0 or 2 are allowed.");
         }
 
-        ipv6_address_buffer_[ipv6_address_buffer_len_] = '\0';
-        std::string address = ipv6_address_buffer_;
-        IPv6Resrv r(type, IOAddress(address), prefix_len_);
+        IOAddress addr6 = IOAddress::fromBytes(AF_INET6, ipv6_address_buffer_);
+        IPv6Resrv r(type, addr6, prefix_len_);
         return (r);
     };
 
@@ -1535,10 +1534,10 @@ public:
         bind_[reservation_id_index_].buffer = reinterpret_cast<char*>(&reservation_id_);
         bind_[reservation_id_index_].is_unsigned = MLM_TRUE;
 
-        // IPv6 address/prefix VARCHAR(39)
-        ipv6_address_buffer_len_ = sizeof(ipv6_address_buffer_) - 1;
-        bind_[address_index_].buffer_type = MYSQL_TYPE_STRING;
-        bind_[address_index_].buffer = ipv6_address_buffer_;
+        // IPv6 address/prefix BINARY(16)
+        ipv6_address_buffer_len_ = 16;
+        bind_[address_index_].buffer_type = MYSQL_TYPE_BLOB;
+        bind_[address_index_].buffer = reinterpret_cast<char*>(ipv6_address_buffer_);
         bind_[address_index_].buffer_length = ipv6_address_buffer_len_;
         bind_[address_index_].length = &ipv6_address_buffer_len_;
 
@@ -1580,7 +1579,7 @@ private:
     my_bool reserv_type_null_;
 
     /// @brief Buffer holding IPv6 address/prefix in textual format.
-    char ipv6_address_buffer_[ADDRESS6_TEXT_MAX_LEN + 1];
+    uint8_t ipv6_address_buffer_[16];
 
     /// @brief Length of the textual address representation.
     unsigned long ipv6_address_buffer_len_;
@@ -1684,14 +1683,16 @@ public:
         // Set up the structures for the various components of the host structure.
 
         try {
-            // address VARCHAR(39)
-            address_ = resv.getPrefix().toText();
-            address_len_ = address_.length();
+            addr6_ = resv.getPrefix().toBytes();
+            if (addr6_.size() != 16) {
+                isc_throw(DbOperationError, "createBindForSend() - prefix is not 16 bytes long");
+            }
+
+            addr6_length_ = 16;
             bind_[0].buffer_type = MYSQL_TYPE_BLOB;
-            bind_[0].buffer = reinterpret_cast<char*>
-                (const_cast<char*>(address_.c_str()));
-            bind_[0].buffer_length = address_len_;
-            bind_[0].length = &address_len_;
+            bind_[0].buffer = reinterpret_cast<char*>(&addr6_[0]);
+            bind_[0].buffer_length = 16;
+            bind_[0].length = &addr6_length_;
 
             // prefix_len tinyint
             prefix_len_ = resv.getPrefixLen();
@@ -1772,6 +1773,15 @@ private:
     /// @brief Array of boolean values indicating if error occurred
     /// for respective columns.
     my_bool error_[RESRV_COLUMNS];
+
+    /// @brief Binary address data.
+    std::vector<uint8_t> addr6_;
+
+    /// @brief Binary address buffer.
+    uint8_t addr6_buffer_[16];
+
+    /// @brief Binary address length.
+    unsigned long addr6_length_;
 };
 
 /// @brief This class is used for inserting options into a database.
@@ -3312,13 +3322,16 @@ MySqlHostDataSource::del(const SubnetID& subnet_id,
     }
 
     // v6
-    std::string addr_str = addr.toText();
-    unsigned long addr_len = addr_str.size();
+    std::vector<uint8_t>addr6 = addr.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "del() - address is not 16 bytes long");
+    }
+
+    unsigned long addr6_length = 16;
     inbind[1].buffer_type = MYSQL_TYPE_BLOB;
-    inbind[1].buffer = reinterpret_cast<char*>
-                        (const_cast<char*>(addr_str.c_str()));
-    inbind[1].length = &addr_len;
-    inbind[1].buffer_length = addr_len;
+    inbind[1].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[1].buffer_length = 16;
+    inbind[1].length = &addr6_length;
 
     return (impl_->delStatement(ctx, MySqlHostDataSourceImpl::DEL_HOST_ADDR6, inbind));
 }
@@ -3846,14 +3859,16 @@ MySqlHostDataSource::get6(const asiolink::IOAddress& prefix,
     MYSQL_BIND inbind[2];
     memset(inbind, 0, sizeof(inbind));
 
-    std::string addr6 = prefix.toText();
-    unsigned long addr6_length = addr6.size();
+    std::vector<uint8_t>addr6 = prefix.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "get6() - prefix is not 16 bytes long");
+    }
 
+    unsigned long addr6_length = 16;
     inbind[0].buffer_type = MYSQL_TYPE_BLOB;
-    inbind[0].buffer = reinterpret_cast<char*>
-                        (const_cast<char*>(addr6.c_str()));
+    inbind[0].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[0].buffer_length = 16;
     inbind[0].length = &addr6_length;
-    inbind[0].buffer_length = addr6_length;
 
     uint8_t tmp = prefix_len;
     inbind[1].buffer_type = MYSQL_TYPE_TINY;
@@ -3894,14 +3909,16 @@ MySqlHostDataSource::get6(const SubnetID& subnet_id,
     inbind[0].buffer = reinterpret_cast<char*>(&subnet_buffer);
     inbind[0].is_unsigned = MLM_TRUE;
 
-    std::string addr6 = address.toText();
-    unsigned long addr6_length = addr6.size();
+    std::vector<uint8_t>addr6 = address.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "get6() - address is not 16 bytes long");
+    }
 
+    unsigned long addr6_length = 16;
     inbind[1].buffer_type = MYSQL_TYPE_BLOB;
-    inbind[1].buffer = reinterpret_cast<char*>
-                        (const_cast<char*>(addr6.c_str()));
+    inbind[1].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[1].buffer_length = 16;
     inbind[1].length = &addr6_length;
-    inbind[1].buffer_length = addr6_length;
 
     ConstHostCollection collection;
     impl_->getHostCollection(ctx, MySqlHostDataSourceImpl::GET_HOST_SUBID6_ADDR, inbind,
@@ -3937,14 +3954,16 @@ MySqlHostDataSource::getAll6(const SubnetID& subnet_id,
     inbind[0].buffer = reinterpret_cast<char*>(&subnet_buffer);
     inbind[0].is_unsigned = MLM_TRUE;
 
-    std::string addr6 = address.toText();
-    unsigned long addr6_length = addr6.size();
+    std::vector<uint8_t>addr6 = address.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "getAll6() - address is not 16 bytes long");
+    }
 
+    unsigned long addr6_length = 16;
     inbind[1].buffer_type = MYSQL_TYPE_BLOB;
-    inbind[1].buffer = reinterpret_cast<char*>
-                        (const_cast<char*>(addr6.c_str()));
+    inbind[1].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[1].buffer_length = 16;
     inbind[1].length = &addr6_length;
-    inbind[1].buffer_length = addr6_length;
 
     ConstHostCollection collection;
     impl_->getHostCollection(ctx, MySqlHostDataSourceImpl::GET_HOST_SUBID6_ADDR, inbind,
index bd128cd9f935bb5c2e9f980ae12199dc63081482..aa6affb28409df6299f3351d3f1def66aae78429 100644 (file)
@@ -350,17 +350,6 @@ tagged_statements = { {
                             "WHERE address > ? AND user_context IS NOT NULL "
                             "ORDER BY address "
                             "LIMIT ?"},
-    {MySqlLeaseMgr::GET_LEASE6_BINADDR_PAGE,
-                    "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, user_context, pool_id "
-                            "FROM lease6 "
-                            "WHERE address > ? AND binaddr IS NULL "
-                            "ORDER BY address "
-                            "LIMIT ?"},
     {MySqlLeaseMgr::GET_LEASE6_SUBID,
                     "SELECT address, duid, valid_lifetime, "
                         "expire, subnet_id, pref_lifetime, "
@@ -409,9 +398,8 @@ tagged_statements = { {
                         "hwaddr, hwtype, hwaddr_source, "
                         "state, user_context, pool_id "
                             "FROM lease6 "
-                            "WHERE binaddr IS NOT NULL "
-                            "AND binaddr BETWEEN ? AND ? "
-                            "ORDER BY binaddr "
+                            "WHERE address BETWEEN ? AND ? "
+                            "ORDER BY address "
                             "LIMIT ?"},
     {MySqlLeaseMgr::INSERT_LEASE4,
                     "INSERT INTO lease4(address, hwaddr, client_id, "
@@ -425,8 +413,8 @@ tagged_statements = { {
                         "lease_type, iaid, prefix_len, "
                         "fqdn_fwd, fqdn_rev, hostname, "
                         "hwaddr, hwtype, hwaddr_source, "
-                        "state, user_context, pool_id, binaddr) "
-                            "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"},
+                        "state, user_context, pool_id) "
+                            "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"},
     {MySqlLeaseMgr::UPDATE_LEASE4,
                     "UPDATE lease4 SET address = ?, hwaddr = ?, "
                         "client_id = ?, valid_lifetime = ?, expire = ?, "
@@ -441,7 +429,7 @@ tagged_statements = { {
                         "pref_lifetime = ?, lease_type = ?, iaid = ?, "
                         "prefix_len = ?, fqdn_fwd = ?, fqdn_rev = ?, "
                         "hostname = ?, hwaddr = ?, hwtype = ?, hwaddr_source = ?, "
-                        "state = ?, user_context = ?, pool_id = ?, binaddr = ? "
+                        "state = ?, user_context = ?, pool_id = ? "
                             "WHERE address = ? AND expire = ?"},
     {MySqlLeaseMgr::ALL_LEASE4_STATS,
                     "SELECT subnet_id, state, leases as state_count "
@@ -1182,10 +1170,9 @@ class MySqlLease6Exchange : public MySqlLeaseExchange {
     static const size_t STATE_COL = 15;
     static const size_t USER_CONTEXT_COL = 16;
     static const size_t POOL_ID_COL = 17;
-    static const size_t BINADDR_COL = 18;
     //@}
     /// @brief Number of columns in the table holding DHCPv6 leases.
-    static const size_t LEASE_COLUMNS = 19;
+    static const size_t LEASE_COLUMNS = 18;
 
 public:
 
@@ -1193,14 +1180,14 @@ public:
     ///
     /// The initialization of the variables here is only to satisfy cppcheck -
     /// all variables are initialized/set in the methods before they are used.
-    MySqlLease6Exchange() : addr6_length_(0), hwaddr_length_(0),
+    MySqlLease6Exchange() : addr6_length_(16), hwaddr_length_(0),
                             hwaddr_null_(MLM_FALSE), duid_length_(0),
                             iaid_(0), lease_type_(0), prefix_len_(0),
                             pref_lifetime_(0), subnet_id_(0), pool_id_(0),
                             valid_lifetime_(0), fqdn_fwd_(false), fqdn_rev_(false),
                             hostname_length_(0), hwtype_(0), hwaddr_source_(0),
                             state_(0), user_context_length_(0),
-                            user_context_null_(MLM_FALSE), binaddr_length_(16) {
+                            user_context_null_(MLM_FALSE) {
         memset(addr6_buffer_, 0, sizeof(addr6_buffer_));
         memset(duid_buffer_, 0, sizeof(duid_buffer_));
         memset(hostname_buffer_, 0, sizeof(hostname_buffer_));
@@ -1227,8 +1214,7 @@ public:
         columns_[STATE_COL] = "state";
         columns_[USER_CONTEXT_COL] = "user_context";
         columns_[POOL_ID_COL] = "pool_id";
-        columns_[BINADDR_COL] = "binaddr";
-        BOOST_STATIC_ASSERT(18 < LEASE_COLUMNS);
+        BOOST_STATIC_ASSERT(17 < LEASE_COLUMNS);
     }
 
     /// @brief Create MYSQL_BIND objects for Lease6 Pointer
@@ -1252,34 +1238,23 @@ public:
         memset(bind_, 0, sizeof(bind_));
 
         try {
-            // address: varchar(39)
-            addr6_ = lease_->addr_.toText();
-            addr6_length_ = addr6_.size();
-
-            // In the following statement, the string is being read.  However, the
-            // MySQL C interface does not use "const", so the "buffer" element
-            // is declared as "char*" instead of "const char*".  To resolve this,
-            // the "const" is discarded.  (Note that the address of addr6_.c_str()
-            // is guaranteed to be valid until the next non-const operation on
-            // addr6_.)
-            //
-            // The const_cast could be avoided by copying the string to a writable
-            // buffer and storing the address of that in the "buffer" element.
-            // However, this introduces a copy operation (with additional overhead)
-            // purely to get round the structures introduced by design of the
-            // MySQL interface (which uses the area pointed to by "buffer" as input
-            // when specifying query parameters and as output when retrieving data).
-            // For that reason, "const_cast" has been used.
-            bind_[0].buffer_type = MYSQL_TYPE_STRING;
-            bind_[0].buffer = const_cast<char*>(addr6_.c_str());
-            bind_[0].buffer_length = addr6_length_;
+            // address: binary(16)
+            addr6_ = lease->addr_.toBytes();
+            if (addr6_.size() != 16) {
+                isc_throw(DbOperationError, "lease6 address is not 16 bytes long");
+            }
+
+            addr6_length_ = 16;
+            bind_[0].buffer_type = MYSQL_TYPE_BLOB;
+            bind_[0].buffer = reinterpret_cast<char*>(&addr6_[0]);
+            bind_[0].buffer_length = 16;
             bind_[0].length = &addr6_length_;
             // bind_[0].is_null = &MLM_FALSE; // commented out for performance
                                               // reasons, see memset() above
 
             // duid: varchar(130)
             if (!lease_->duid_) {
-                isc_throw(DbOperationError, "lease6 for address " << addr6_
+                isc_throw(DbOperationError, "lease6 for address " << lease->addr_.toText()
                           << " is missing mandatory client-id.");
             }
             duid_ = lease_->duid_->getDuid();
@@ -1479,25 +1454,11 @@ public:
             // bind_[17].is_null = &MLM_FALSE; // commented out for performance
                                                // reasons, see memset() above
 
-            // binaddr: binary(16)
-            binaddr_ = lease->addr_.toBytes();
-            if (binaddr_.size() != 16) {
-                isc_throw(DbOperationError, "lease6 address is not 16 bytes long");
-            }
-
-            binaddr_length_ = 16;
-            bind_[18].buffer_type = MYSQL_TYPE_BLOB;
-            bind_[18].buffer = reinterpret_cast<char*>(&binaddr_[0]);
-            bind_[18].buffer_length = 16;
-            bind_[18].length = &binaddr_length_;
-            // bind_[18].is_null = &MLM_FALSE; // commented out for performance
-                                               // reasons, see memset() above
-
             // Add the error flags
             setErrorIndicators(bind_, error_, LEASE_COLUMNS);
 
             // .. and check that we have the numbers correct at compile time.
-            BOOST_STATIC_ASSERT(18 < LEASE_COLUMNS);
+            BOOST_STATIC_ASSERT(17 < LEASE_COLUMNS);
 
         } catch (const std::exception& ex) {
             isc_throw(DbOperationError,
@@ -1527,13 +1488,10 @@ public:
         // code that explicitly sets is_null is there, but is commented out.
         memset(bind_, 0, sizeof(bind_));
 
-        // address: varchar(39)
-        // A Lease6_ address has a maximum of 39 characters.  The array is
-        // one byte longer than this to guarantee that we can always null
-        // terminate it whatever is returned.
-        addr6_length_ = sizeof(addr6_buffer_) - 1;
-        bind_[0].buffer_type = MYSQL_TYPE_STRING;
-        bind_[0].buffer = addr6_buffer_;
+        // address: binary(16)
+        addr6_length_ = 16;
+        bind_[0].buffer_type = MYSQL_TYPE_BLOB;
+        bind_[0].buffer = reinterpret_cast<char*>(addr6_buffer_);
         bind_[0].buffer_length = addr6_length_;
         bind_[0].length = &addr6_length_;
         // bind_[0].is_null = &MLM_FALSE; // commented out for performance
@@ -1666,7 +1624,7 @@ public:
         setErrorIndicators(bind_, error_, LEASE_COLUMNS);
 
         // .. and check that we have the numbers correct at compile time.
-        BOOST_STATIC_ASSERT(18 < LEASE_COLUMNS);
+        BOOST_STATIC_ASSERT(17 < LEASE_COLUMNS);
 
         // Add the data to the vector.  Note the end element is one after the
         // end of the array.
@@ -1684,12 +1642,9 @@ public:
     ///
     /// @throw isc::BadValue Unable to convert Lease Type value in database
     Lease6Ptr getLeaseData() {
-        // The address buffer is declared larger than the buffer size passed
-        // to the access function so that we can always append a null byte.
-        // Create the IOAddress object corresponding to the received data.
-        addr6_buffer_[addr6_length_] = '\0';
-        std::string address = addr6_buffer_;
-        IOAddress addr(address);
+        // Convert lease from network-order bytes to IOAddress.
+        IOAddress addr = IOAddress::fromBytes(AF_INET6, addr6_buffer_);
+        std::string address = addr.toText();
 
         // Set the lease type in a variable of the appropriate data type, which
         // has been initialized with an arbitrary (but valid) value.
@@ -1797,9 +1752,9 @@ private:
     // Note: All array lengths are equal to the corresponding variable in the
     // schema.
     // Note: arrays are declared fixed length for speed of creation
-    std::string          addr6_;                                   ///< Address
-    char                 addr6_buffer_[ADDRESS6_TEXT_MAX_LEN + 1]; ///< Address buffer
-    unsigned long        addr6_length_;                            ///< Length of address
+    std::vector<uint8_t> addr6_;                                   ///< Binary address
+    uint8_t              addr6_buffer_[16];                        ///< Binary address buffer
+    unsigned long        addr6_length_;                            ///< Binary address length
     MYSQL_BIND           bind_[LEASE_COLUMNS];                     ///< Bind array
     std::string          columns_[LEASE_COLUMNS];                  ///< Column names
     my_bool              error_[LEASE_COLUMNS];                    ///< Error array
@@ -1829,8 +1784,6 @@ private:
     char                 user_context_[USER_CONTEXT_MAX_LEN];      ///< User context
     unsigned long        user_context_length_;                     ///< Length of user context
     my_bool              user_context_null_;                       ///< Used when user context is null
-    std::vector<uint8_t> binaddr_;                                 ///< Binary address
-    unsigned long        binaddr_length_;                          ///< Length of binary data
 };
 
 /// @brief MySql derivation of the statistical lease data query
@@ -2307,6 +2260,7 @@ MySqlLeaseMgr::createContext() const {
         }
     }
 
+
     // Prepare all statements likely to be used.
     ctx->conn_.prepareStatements(tagged_statements.begin(),
                                  tagged_statements.end());
@@ -2858,14 +2812,16 @@ MySqlLeaseMgr::getLease6(Lease::Type lease_type,
     MYSQL_BIND inbind[2];
     memset(inbind, 0, sizeof(inbind));
 
-    std::string addr6 = addr.toText();
-    unsigned long addr6_length = addr6.size();
+    // address: binary(16)
+    std::vector<uint8_t>addr6 = addr.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "lease6 address is not 16 bytes long");
+    }
 
-    // See the earlier description of the use of "const_cast" when accessing
-    // the address for an explanation of the reason.
-    inbind[0].buffer_type = MYSQL_TYPE_STRING;
-    inbind[0].buffer = const_cast<char*>(addr6.c_str());
-    inbind[0].buffer_length = addr6_length;
+    unsigned long addr6_length = 16;
+    inbind[0].buffer_type = MYSQL_TYPE_BLOB;
+    inbind[0].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[0].buffer_length = 16;
     inbind[0].length = &addr6_length;
 
     // LEASE_TYPE
@@ -3111,20 +3067,17 @@ MySqlLeaseMgr::getLeases6(const IOAddress& lower_bound_address,
     MYSQL_BIND inbind[2];
     memset(inbind, 0, sizeof(inbind));
 
-    // In IPv6 we compare addresses represented as strings. The IPv6 zero address
-    // is ::, so it is greater than any other address. In this special case, we
-    // just use 0 for comparison which should be lower than any real IPv6 address.
-    std::string lb_address_data = "0";
-    if (!lower_bound_address.isV6Zero()) {
-        lb_address_data = lower_bound_address.toText();
+    // Bind lower bound address
+    std::vector<uint8_t>lb_addr = lower_bound_address.toBytes();
+    if (lb_addr.size() != 16) {
+        isc_throw(DbOperationError, "getLeases6() - lower bound address is not 16 bytes long");
     }
 
-    // Bind lower bound address
-    unsigned long lb_address_data_size = lb_address_data.size();
-    inbind[0].buffer_type = MYSQL_TYPE_STRING;
-    inbind[0].buffer = const_cast<char*>(lb_address_data.c_str());
-    inbind[0].buffer_length = lb_address_data_size;
-    inbind[0].length = &lb_address_data_size;
+    unsigned long lb_addr_length = 16;
+    inbind[0].buffer_type = MYSQL_TYPE_BLOB;
+    inbind[0].buffer = reinterpret_cast<char*>(&lb_addr[0]);
+    inbind[0].buffer_length = 16;
+    inbind[0].length = &lb_addr_length;
 
     // Bind page size value
     uint32_t ps = static_cast<uint32_t>(page_size.page_size_);
@@ -3309,14 +3262,16 @@ MySqlLeaseMgr::updateLease6(const Lease6Ptr& lease) {
     MYSQL_BIND inbind[2];
     memset(inbind, 0, sizeof(inbind));
 
-    std::string addr6 = lease->addr_.toText();
-    unsigned long addr6_length = addr6.size();
+    // Bind the where clause address parameter.
+    std::vector<uint8_t>addr6 = lease->addr_.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "updateLease6() - address is not 16 bytes long");
+    }
 
-    // See the earlier description of the use of "const_cast" when accessing
-    // the address for an explanation of the reason.
-    inbind[0].buffer_type = MYSQL_TYPE_STRING;
-    inbind[0].buffer = const_cast<char*>(addr6.c_str());
-    inbind[0].buffer_length = addr6_length;
+    unsigned long addr6_length = 16;
+    inbind[0].buffer_type = MYSQL_TYPE_BLOB;
+    inbind[0].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[0].buffer_length = 16;
     inbind[0].length = &addr6_length;
 
     bind.push_back(inbind[0]);
@@ -3435,14 +3390,16 @@ MySqlLeaseMgr::deleteLease(const Lease6Ptr& lease) {
     MYSQL_BIND inbind[2];
     memset(inbind, 0, sizeof(inbind));
 
-    std::string addr6 = addr.toText();
-    unsigned long addr6_length = addr6.size();
+    // Bind the where clause address parameter.
+    std::vector<uint8_t>addr6 = addr.toBytes();
+    if (addr6.size() != 16) {
+        isc_throw(DbOperationError, "deleteLease6() - address is not 16 bytes long");
+    }
 
-    // See the earlier description of the use of "const_cast" when accessing
-    // the address for an explanation of the reason.
-    inbind[0].buffer_type = MYSQL_TYPE_STRING;
-    inbind[0].buffer = const_cast<char*>(addr6.c_str());
-    inbind[0].buffer_length = addr6_length;
+    unsigned long addr6_length = 16;
+    inbind[0].buffer_type = MYSQL_TYPE_BLOB;
+    inbind[0].buffer = reinterpret_cast<char*>(&addr6[0]);
+    inbind[0].buffer_length = 16;
     inbind[0].length = &addr6_length;
 
     // See the expire code of createBindForSend for the
@@ -4266,86 +4223,6 @@ MySqlLeaseMgr::getLeases6ByLink(const IOAddress& link_addr,
     return (result);
 }
 
-size_t
-MySqlLeaseMgr::upgradeBinaryAddress6(const LeasePageSize& page_size) {
-    auto check = CfgMgr::instance().getCurrentCfg()->
-        getConsistency()->getExtendedInfoSanityCheck();
-
-    size_t pages = 0;
-    size_t updated = 0;
-    IOAddress start_addr = IOAddress::IPV6_ZERO_ADDRESS();
-    for (;;) {
-        LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
-                  DHCPSRV_MYSQL_UPGRADE_BINARY_ADDRESS6_PAGE)
-            .arg(pages)
-            .arg(start_addr.toText())
-            .arg(updated);
-
-        // Prepare WHERE clause.
-        MYSQL_BIND inbind[2];
-        memset(inbind, 0, sizeof(inbind));
-
-        // Bind start address.
-        std::string start_addr_str = "0";
-        if (!start_addr.isV6Zero()) {
-            start_addr_str = start_addr.toText();
-        }
-        unsigned long start_addr_size = start_addr_str.size();
-        inbind[0].buffer_type = MYSQL_TYPE_STRING;
-        inbind[0].buffer = const_cast<char*>(start_addr_str.c_str());
-        inbind[0].buffer_length = start_addr_size;
-        inbind[0].length = &start_addr_size;
-
-        // Bind page size value.
-        uint32_t ps = static_cast<uint32_t>(page_size.page_size_);
-        inbind[1].buffer_type = MYSQL_TYPE_LONG;
-        inbind[1].buffer = reinterpret_cast<char*>(&ps);
-        inbind[1].is_unsigned = MLM_TRUE;
-
-        Lease6Collection leases;
-
-        // Get a context.
-        {
-            MySqlLeaseContextAlloc get_context(*this);
-            MySqlLeaseContextPtr ctx = get_context.ctx_;
-
-            getLeaseCollection(ctx, GET_LEASE6_BINADDR_PAGE, inbind, leases);
-        }
-
-        if (leases.empty()) {
-            // Done.
-            break;
-        }
-
-        ++pages;
-        start_addr = leases.back()->addr_;
-        for (auto lease : leases) {
-            try {
-                // Update to the same lease will fill the new column i.e.
-                // refresh does the job...
-                updateLease6(lease);
-                ++updated;
-            } catch (const NoSuchLease&) {
-                // The lease was modified in parallel:
-                // as its extended info was processed just ignore.
-                continue;
-            } catch (const std::exception& ex) {
-                // Something when wrong, for instance extract failed.
-                LOG_ERROR(dhcpsrv_logger,
-                          DHCPSRV_MYSQL_UPGRADE_BINARY_ADDRESS6_ERROR)
-                    .arg(lease->addr_.toText())
-                    .arg(ex.what());
-            }
-        }
-    }
-
-    LOG_INFO(dhcpsrv_logger, DHCPSRV_MYSQL_UPGRADE_BINARY_ADDRESS6)
-        .arg(pages)
-        .arg(updated);
-
-    return (updated);
-}
-
 size_t
 MySqlLeaseMgr::buildExtendedInfoTables6(bool /* update */, bool /* current */) {
     isc_throw(isc::NotImplemented,
index e1abd88bd22a20dcb503a43689380f88e1359070..c7cf421dd9aef31a99b098d56b7a0365bcede64b 100644 (file)
@@ -746,7 +746,6 @@ public:
         GET_LEASE6_DUID_IAID_SUBID,  // Get lease6 by DUID, IAID and subnet ID
         GET_LEASE6_PAGE,             // Get page of leases beginning with an address
         GET_LEASE6_UCTX_PAGE,        // Get page of leases with user context
-        GET_LEASE6_BINADDR_PAGE,     // Get page of leases with null binary address
         GET_LEASE6_SUBID,            // Get IPv6 leases by subnet ID
         GET_LEASE6_DUID,             // Get IPv6 leases by DUID
         GET_LEASE6_HOSTNAME,         // Get IPv6 leases by hostname
@@ -1164,17 +1163,6 @@ private:
     /// @return The number of updates in the database.
     virtual size_t upgradeExtendedInfo4(const LeasePageSize& page_size) override;
 
-    /// @brief Upgrade binary address (v6).
-    ///
-    /// On SQL backends for all leases with null binary address set this
-    /// new column. Memfile uses IOAddress objects so does not need it.
-    /// This function implements the new BLQ hook command named
-    /// "binary-address6-upgrade".
-    ///
-    /// @param page_size The page size used for retrieval.
-    /// @return The number of updates in the database.
-    virtual size_t upgradeBinaryAddress6(const LeasePageSize& page_size) override;
-
     /// @brief Build extended info v6 tables.
     ///
     /// @param update Update extended info in database.
index 9db0da5416cf695559199e014e6f3b8450b440b9..652793e64d21e1443dbd9f547afccdb8cc55e1f9 100644 (file)
@@ -331,7 +331,6 @@ MySqlConnection::getVersion(const ParameterMap& parameters) {
 
         // Discard the statement and its resources
         mysql_stmt_close(stmt);
-
         return (std::make_pair(version, minor));
 
     } catch (const std::exception&) {
index 26a3557bce20d44de3b2b15323646096bf9bd5b2..0f2cc1c8fcaa3cf03a0f5f70a24568d4233a4b4f 100644 (file)
@@ -52,7 +52,7 @@ const int MLM_MYSQL_FETCH_FAILURE = 0;
 
 /// @name Current database schema version values.
 //@{
-const uint32_t MYSQL_SCHEMA_VERSION_MAJOR = 18;
+const uint32_t MYSQL_SCHEMA_VERSION_MAJOR = 19;
 const uint32_t MYSQL_SCHEMA_VERSION_MINOR = 0;
 
 //@}
index e78c47b63ab8956104da1f96ee2280427afd285f..f10286bdb0ed0eda0233bcff1d189a31f63b201c 100644 (file)
@@ -1,4 +1,3 @@
-api_files += $(top_srcdir)/src/share/api/binary-address6-upgrade.json
 api_files += $(top_srcdir)/src/share/api/build-report.json
 api_files += $(top_srcdir)/src/share/api/cache-clear.json
 api_files += $(top_srcdir)/src/share/api/cache-flush.json
diff --git a/src/share/api/binary-address6-upgrade.json b/src/share/api/binary-address6-upgrade.json
deleted file mode 100644 (file)
index 6a2247d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-    "access": "write",
-    "avail": "2.3.8",
-    "brief": [
-        "This command fills the binary address column for all IPv6 leases where it is NULL in the SQL lease database."
-    ],
-    "cmd-syntax": [
-        "{",
-        "    \"command\": \"binary-address6-upgrade\"",
-        "    }",
-        "}"
-    ],
-    "description": "See <xref linkend=\"command-binary-address6-upgrade\"/>",
-    "hook": "lease_query",
-    "name": "binary-address6-upgrade",
-    "resp-comment": [
-        "This command should be used when some old IPv6 leases are present in the lease database using a SQL backend."
-    ],
-    "resp-syntax": [
-        "{",
-        "  \"arguments\": {",
-        "  },",
-        "  \"result\": 0,",
-        "  \"text\": \"to be done\"",
-        "}"
-    ],
-    "support": [
-        "kea-dhcp6"
-    ]
-}
index d6056d5a66ee4c05e6bc3f404dfbbca1fe0a2659..195dfc384199cadf3aa85a771b3826153ef4a8a5 100644 (file)
@@ -26,4 +26,5 @@
 /upgrade_015_to_016.sh
 /upgrade_016_to_017.sh
 /upgrade_017_to_018.sh
+/upgrade_018_to_019.sh
 /wipe_data.sh
index 3b6ae7242c6ea13a3aceae3e0409cd65a4fdfb19..8849bf18fe6e31d2807dea6074d5edf7c29f6d47 100644 (file)
@@ -37,6 +37,7 @@ mysql_SCRIPTS += upgrade_014_to_015.sh
 mysql_SCRIPTS += upgrade_015_to_016.sh
 mysql_SCRIPTS += upgrade_016_to_017.sh
 mysql_SCRIPTS += upgrade_017_to_018.sh
+mysql_SCRIPTS += upgrade_018_to_019.sh
 mysql_SCRIPTS += wipe_data.sh
 
 DISTCLEANFILES = ${mysql_SCRIPTS}
index 259e703d887ae4569ee4c0d92192ecfb71b69d2f..d5be31209ac1e8534c755df940dff80f8d652cfa 100644 (file)
@@ -5677,6 +5677,120 @@ UPDATE schema_version
 
 -- This line concludes the schema upgrade to version 18.0.
 
+-- This line starts the schema upgrade to version 19.0.
+-- Drop binaddr column and index.
+DROP INDEX lease6_by_binaddr ON lease6;
+ALTER TABLE lease6
+    DROP COLUMN binaddr;
+
+-- Change data type of lease6.address column.
+ALTER TABLE lease6 MODIFY COLUMN address BINARY(16);
+
+-- Change data type of ipv6_reservations.address column.
+ALTER TABLE ipv6_reservations MODIFY COLUMN address BINARY(16);
+
+-- Convert binary lease6 address to text
+DROP PROCEDURE IF EXISTS lease6DumpData;
+DELIMITER $$
+CREATE PROCEDURE lease6DumpData()
+BEGIN
+    SELECT
+        INET6_NTOA(address),
+        IFNULL(colonSeparatedHex(HEX(duid)), ''),
+        valid_lifetime,
+        UNIX_TIMESTAMP(expire),
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        REPLACE(hostname, ',', '&#x2c'),
+        IFNULL(colonSeparatedHex(HEX(hwaddr)), ''),
+        state,
+        REPLACE(IFNULL(user_context, ''), ',', '&#x2c'),
+        hwtype,
+        hwaddr_source,
+        pool_id
+    FROM lease6
+    ORDER BY address;
+END $$
+DELIMITER ;
+
+-- Drop and create lease6Upload stored procedure with conversion to
+-- address to binary
+DROP PROCEDURE IF EXISTS lease6Upload;
+DELIMITER $$
+CREATE PROCEDURE lease6Upload(
+    IN address VARCHAR(39),
+    IN duid VARCHAR(130),
+    IN valid_lifetime INT UNSIGNED,
+    IN expire BIGINT UNSIGNED,
+    IN subnet_id INT UNSIGNED,
+    IN pref_lifetime INT UNSIGNED,
+    IN lease_type TINYINT,
+    IN iaid INT UNSIGNED,
+    IN prefix_len TINYINT UNSIGNED,
+    IN fqdn_fwd TINYINT,
+    IN fqdn_rev TINYINT,
+    IN hostname VARCHAR(255),
+    IN hwaddr VARCHAR(64),
+    IN state INT UNSIGNED,
+    IN user_context TEXT,
+    IN hwtype SMALLINT,
+    IN hwaddr_source INT UNSIGNED,
+    IN pool_id INT UNSIGNED
+)
+BEGIN
+    INSERT INTO lease6 (
+        address,
+        duid,
+        valid_lifetime,
+        expire,
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        hostname,
+        hwaddr,
+        state,
+        user_context,
+        hwtype,
+        hwaddr_source,
+        pool_id
+    ) VALUES (
+        INET6_ATON(address),
+        UNHEX(REPLACE(duid, ':', '')),
+        valid_lifetime,
+        FROM_UNIXTIME(expire),
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        REPLACE(hostname, '&#x2c', ','),
+        UNHEX(REPLACE(hwaddr, ':', '')),
+        state,
+        REPLACE(user_context, '&#x2c', ','),
+        hwtype,
+        hwaddr_source,
+        pool_id
+    );
+END $$
+DELIMITER ;
+
+-- Update the schema version number.
+UPDATE schema_version
+    SET version = '19', minor = '0';
+
+-- This line concludes the schema upgrade to version 19.0.
+
 # Notes:
 #
 # Indexes
diff --git a/src/share/database/scripts/mysql/upgrade_018_to_019.sh.in b/src/share/database/scripts/mysql/upgrade_018_to_019.sh.in
new file mode 100644 (file)
index 0000000..78eaf04
--- /dev/null
@@ -0,0 +1,168 @@
+#!/bin/sh
+
+# Copyright (C) 2023 Internet Systems Consortium, Inc. ("ISC")
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# shellcheck disable=SC1091
+# SC1091: Not following: ... was not specified as input (see shellcheck -x).
+
+# Exit with error if commands exit with non-zero and if undefined variables are
+# used.
+set -eu
+
+# shellcheck disable=SC2034
+# SC2034: ... appears unused. Verify use (or export if used externally).
+prefix="@prefix@"
+
+# Include utilities. Use installed version if available and
+# use build version if it isn't.
+if test -f "@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
+
+# Check version.
+version=$(mysql_version "${@}")
+if test "${version}" != "18.0"; then
+    printf 'This script upgrades 18.0 to 19.0. '
+    printf 'Reported version is %s. Skipping upgrade.\n' "${version}"
+    exit 0
+fi
+
+# Get the schema name from database argument. We need this to
+# query information_schema for the right database.
+for arg in "${@}"
+do
+    if ! printf '%s' "${arg}" | grep -Eq -- '^--'
+    then
+        schema="$arg"
+        break
+    fi
+done
+
+# Make sure we have the schema.
+if [ -z "$schema" ]
+then
+    printf "Could not find database schema name in cmd line args: %s\n" "${*}"
+    exit 255
+fi
+
+mysql "$@" <<EOF
+-- This line starts the schema upgrade to version 19.0.
+-- Drop binaddr column and index.
+DROP INDEX lease6_by_binaddr ON lease6;
+ALTER TABLE lease6
+    DROP COLUMN binaddr;
+
+-- Change data type of lease6.address column.
+ALTER TABLE lease6 MODIFY COLUMN address BINARY(16);
+
+-- Change data type of ipv6_reservations.address column.
+ALTER TABLE ipv6_reservations MODIFY COLUMN address BINARY(16);
+
+-- Convert binary lease6 address to text
+DROP PROCEDURE IF EXISTS lease6DumpData;
+DELIMITER $$
+CREATE PROCEDURE lease6DumpData()
+BEGIN
+    SELECT
+        INET6_NTOA(address),
+        IFNULL(colonSeparatedHex(HEX(duid)), ''),
+        valid_lifetime,
+        UNIX_TIMESTAMP(expire),
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        REPLACE(hostname, ',', '&#x2c'),
+        IFNULL(colonSeparatedHex(HEX(hwaddr)), ''),
+        state,
+        REPLACE(IFNULL(user_context, ''), ',', '&#x2c'),
+        hwtype,
+        hwaddr_source,
+        pool_id
+    FROM lease6
+    ORDER BY address;
+END $$
+DELIMITER ;
+
+-- Drop and create lease6Upload stored procedure with conversion to
+-- address to binary
+DROP PROCEDURE IF EXISTS lease6Upload;
+DELIMITER $$
+CREATE PROCEDURE lease6Upload(
+    IN address VARCHAR(39),
+    IN duid VARCHAR(130),
+    IN valid_lifetime INT UNSIGNED,
+    IN expire BIGINT UNSIGNED,
+    IN subnet_id INT UNSIGNED,
+    IN pref_lifetime INT UNSIGNED,
+    IN lease_type TINYINT,
+    IN iaid INT UNSIGNED,
+    IN prefix_len TINYINT UNSIGNED,
+    IN fqdn_fwd TINYINT,
+    IN fqdn_rev TINYINT,
+    IN hostname VARCHAR(255),
+    IN hwaddr VARCHAR(64),
+    IN state INT UNSIGNED,
+    IN user_context TEXT,
+    IN hwtype SMALLINT,
+    IN hwaddr_source INT UNSIGNED,
+    IN pool_id INT UNSIGNED
+)
+BEGIN
+    INSERT INTO lease6 (
+        address,
+        duid,
+        valid_lifetime,
+        expire,
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        hostname,
+        hwaddr,
+        state,
+        user_context,
+        hwtype,
+        hwaddr_source,
+        pool_id
+    ) VALUES (
+        INET6_ATON(address),
+        UNHEX(REPLACE(duid, ':', '')),
+        valid_lifetime,
+        FROM_UNIXTIME(expire),
+        subnet_id,
+        pref_lifetime,
+        lease_type,
+        iaid,
+        prefix_len,
+        fqdn_fwd,
+        fqdn_rev,
+        REPLACE(hostname, '&#x2c', ','),
+        UNHEX(REPLACE(hwaddr, ':', '')),
+        state,
+        REPLACE(user_context, '&#x2c', ','),
+        hwtype,
+        hwaddr_source,
+        pool_id
+    );
+END $$
+DELIMITER ;
+
+-- Update the schema version number.
+UPDATE schema_version
+    SET version = '19', minor = '0';
+
+-- This line concludes the schema upgrade to version 19.0.
+EOF