r3064 - InnoDB: employ foreign keys in TagTree, TagStorage
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 21 Aug 2009 15:11:08 +0000 (15:11 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 21 Aug 2009 15:11:08 +0000 (15:11 +0000)
 - commitCreateTag(): handle FK error condition properly
 - commitUpdateTag(): idem

inc/database.php
install/init-structure.sql
upgrade.php

index 216ffbe0eec4a72c32ed4697e62a4b5e7aaaf505..910de1df002745c3500c6466d21d78ad67907e12 100644 (file)
@@ -2927,13 +2927,18 @@ function commitCreateTag ($tagname = '', $parent_id = 0)
                        'parent_id' => $parent_id
                )
        );
-       global $dbxlink;
        if ($result)
                return '';
-       elseif ($dbxlink->errorCode() == 23000)
-               return "name '${tag_name}' is already used";
-       else
-               return "SQL query failed in " . __FUNCTION__;
+       global $dbxlink;
+       if ($dbxlink->errorCode() == 23000) // integrity constraint violation
+       {
+               $ei = $dbxlink->errorInfo();
+               if ($ei[1] == 1062)
+                       return 'tag name must be unique';
+               if ($ei[1] == 1452)
+                       return "parent tag id ${parent_id} does not exist";
+       }
+       return "SQL query failed in " . __FUNCTION__;
 }
 
 function commitDestroyTag ($tagid = 0)
@@ -2956,10 +2961,15 @@ function commitUpdateTag ($tag_id, $tag_name, $parent_id)
        $result = $dbxlink->exec ($query);
        if ($result !== FALSE)
                return '';
-       elseif ($dbxlink->errorCode() == 23000)
-               return "name '${tag_name}' is already used";
-       else
-               return 'SQL query failed in ' . __FUNCTION__;
+       if ($dbxlink->errorCode() == 23000)
+       {
+               $ei = $dbxlink->errorInfo();
+               if ($ei[1] == 1062)
+                       return 'tag name must be unique';
+               if ($ei[1] == 1452)
+                       return "parent tag id ${parent_id} does not exist";
+       }
+       return 'SQL query failed in ' . __FUNCTION__;
 }
 
 // Drop the whole chain stored.
index 61f192fba22bc6c09fed5856d579c068feb11e21..def6d8fad475027bbff52165c22ece23a705ba51 100644 (file)
@@ -301,21 +301,25 @@ CREATE TABLE `Script` (
   PRIMARY KEY  (`script_name`)
 ) TYPE=MyISAM;
 
-CREATE TABLE `TagStorage` (
-  `entity_realm` enum('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'object',
-  `entity_id` int(10) unsigned NOT NULL,
-  `tag_id` int(10) unsigned NOT NULL,
-  UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`),
-  KEY `entity_id` (`entity_id`)
-) TYPE=MyISAM;
-
 CREATE TABLE `TagTree` (
   `id` int(10) unsigned NOT NULL auto_increment,
   `parent_id` int(10) unsigned default NULL,
   `valid_realm` set('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'file,ipv4net,ipv4vs,ipv4rspool,object,rack,user',
   `tag` char(255) default NULL,
   PRIMARY KEY  (`id`),
-  UNIQUE KEY `tag` (`tag`)
+  UNIQUE KEY `tag` (`tag`),
+  KEY `TagTree-K-parent_id` (`parent_id`),
+  CONSTRAINT `TagTree-K-parent_id` FOREIGN KEY (`parent_id`) REFERENCES `TagTree` (`id`)
+) TYPE=MyISAM;
+
+CREATE TABLE `TagStorage` (
+  `entity_realm` enum('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'object',
+  `entity_id` int(10) unsigned NOT NULL,
+  `tag_id` int(10) unsigned NOT NULL,
+  UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`),
+  KEY `entity_id` (`entity_id`),
+  KEY `TagStorage-FK-tag_id` (`tag_id`),
+  CONSTRAINT `TagStorage-FK-tag_id` FOREIGN KEY (`tag_id`) REFERENCES `TagTree` (`id`)
 ) TYPE=MyISAM;
 
 CREATE TABLE `UserAccount` (
index d1bcf1a09481265abe5dc56c0a1600fb1b67c2fd..61ed45c2c32b986e75b1399a08e973e7571c6814 100644 (file)
@@ -36,6 +36,7 @@ function getDBUpgradePath ($v1, $v2)
                '0.17.2',
                '0.17.3',
                '0.17.4',
+               '0.17.5',
        );
        if (!in_array ($v1, $versionhistory) or !in_array ($v2, $versionhistory))
                return NULL;
@@ -291,6 +292,13 @@ CREATE TABLE `LDAPCache` (
                        $query = array_merge ($query, reloadDictionary ($batchid));
                        $query[] = "UPDATE Config SET varvalue = '0.17.4' WHERE varname = 'DB_VERSION'";
                        break;
+               case '0.17.5':
+                       $query[] = "ALTER TABLE TagTree ENGINE=InnoDB";
+                       $query[] = "ALTER TABLE TagStorage ENGINE=InnoDB";
+                       $query[] = "ALTER TABLE TagStorage ADD CONSTRAINT `TagStorage-FK-tag_id` FOREIGN KEY (tag_id) REFERENCES TagTree (id)";
+                       $query[] = "ALTER TABLE TagTree ADD CONSTRAINT `TagTree-K-parent_id` FOREIGN KEY (parent_id) REFERENCES TagTree (id)";
+                       $query[] = "UPDATE Config SET varvalue = '0.17.5' WHERE varname = 'DB_VERSION'";
+                       break;
                default:
                        showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
                        die;