r2178 - handle base-len unique key issue for IPv4 networks
authorDenis Ovsienko <infrastation@yandex.ru>
Thu, 28 Aug 2008 22:39:33 +0000 (22:39 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 28 Aug 2008 22:39:33 +0000 (22:39 +0000)
 - rename EXT_IPV4_VIEW

install/init-dictbase.sql
install/init-structure.sql
upgrade.php

index 6b08f24..d9e3a20 100644 (file)
@@ -256,7 +256,7 @@ INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, descriptio
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_AUTO_RELEASE','1','uint','no','no','Auto-release IPv4 addresses on allocation');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('SHOW_LAST_TAB','no','string','yes','no','Remember last tab shown for each page');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('COOKIE_TTL','1209600','uint','yes','no','Cookies lifetime in seconds');
-INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('EXT_IPV4_VIEW','yes','string','no','no','Display parent network info for IPv4 addresses');
+INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('EXT_IPV4_VIEW','yes','string','no','no','Extended IPv4 view');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('DB_VERSION','0.16.2','string','no','yes','Database version.');
 
 INSERT INTO `Script` VALUES ('RackCode','allow {$userid_1}');
index a694870..2a15d33 100644 (file)
@@ -96,7 +96,8 @@ CREATE TABLE `IPRanges` (
   `ip` int(10) unsigned NOT NULL,
   `mask` int(10) unsigned NOT NULL,
   `name` char(255) default NULL,
-  PRIMARY KEY  (`id`)
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `base-len` (`ip`,`mask`)
 ) ENGINE=MyISAM;
 
 CREATE TABLE `IPRealServer` (
index 228af6f..cbd5e06 100644 (file)
@@ -24,6 +24,7 @@ function getDBUpgradePath ($v1, $v2)
                '0.16.0',
                '0.16.1',
                '0.16.2',
+               '0.16.3',
        );
        if (!in_array ($v1, $versionhistory) || !in_array ($v2, $versionhistory))
        {
@@ -1382,6 +1383,39 @@ CREATE TABLE `TagTree` (
                        $query[] = "ALTER TABLE RackSpace ADD KEY `RackSpace_object_id` (`object_id`)";
                        $query[] = "update Config set varvalue = '0.16.2' where varname = 'DB_VERSION'";
                        break;
+               case '0.16.3':
+                       // The network table list used to allow duplicate "prefix-masklen" pairs, which was a bad idea.
+                       // The code, which verified each new network to be "unique", didn't work for "upper" IPv4 space.
+                       // To enable the relevant index now, it is necessary to process all ghost networks, which could
+                       // be accumulated over the time, and move all tags assigned to them to the "master" record, which
+                       // we recognize to be the one with the lowest ID.
+                       $q = 'select ip, mask, count(*) as c from IPRanges group by ip, mask having c > 1';
+                       $r = $dbxlink->query ($q);
+                       // Let's hope there's not many dupes, cause sub-queries won't work.
+                       $dupes = $r->fetchAll (PDO::FETCH_ASSOC);
+                       unset ($r);
+                       foreach ($dupes as $d)
+                       {
+                               $firstid = 0;
+                               $q = "select id from IPRanges where ip = ${d['ip']} and mask = ${d['mask']} order by id";
+                               $r = $dbxlink->query ($q);
+                               while ($row = $r->fetch (PDO::FETCH_ASSOC))
+                               {
+                                       if (!$firstid)
+                                       {
+                                               $firstid = $row['id'];
+                                               continue;
+                                       }
+                                       // Rewrite tags, but don't rebuild the chains. Let regular code sort it out.
+                                       $query[] = "update TagStorage set target_id = ${firstid} where target_id = ${row['id']} and target_realm = 'ipv4net'";
+                                       $query[] = "delete from IPRanges where id = ${row['id']}";
+                               }
+                               unset ($r);
+                       }
+                       $query[] = 'alter table IPRanges add unique `base-len` (`ip`, `mask`)';
+                       $query[] = "update Config set description = 'Extended IPv4 view' where varname = 'EXT_IPV4_VIEW'";
+                       $query[] = "update Config set varvalue = '0.16.3' where varname = 'DB_VERSION'";
+                       break;
                default:
                        showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
                        die;