Author: arkurth
Date: Wed Mar 12 20:52:38 2014
New Revision: 1576901

URL: http://svn.apache.org/r1576901
Log:
VCL-753
Added unique key across changelog userid, reservationid, and remoteIP.

Modified:
    vcl/trunk/mysql/update-vcl.sql
    vcl/trunk/mysql/vcl.sql

Modified: vcl/trunk/mysql/update-vcl.sql
URL: 
http://svn.apache.org/viewvc/vcl/trunk/mysql/update-vcl.sql?rev=1576901&r1=1576900&r2=1576901&view=diff
==============================================================================
--- vcl/trunk/mysql/update-vcl.sql (original)
+++ vcl/trunk/mysql/update-vcl.sql Wed Mar 12 20:52:38 2014
@@ -543,6 +543,108 @@ BEGIN
   END IF;
 END$$
 
+-- --------------------------------------------------------
+
+/*
+Procedure   : Add3ColUniqueIndexIfNotExist
+Parameters  : tableName, columnName1, columnName2, columnName2
+Description : Adds a unique index to an existing table if a primary or unique
+              index does not already exist for the column. Any non-unique
+              indices are dropped before the unique index is added.
+*/
+
+DROP PROCEDURE IF EXISTS `Add3ColUniqueIndexIfNotExist`$$
+CREATE PROCEDURE `Add3ColUniqueIndexIfNotExist`(
+  IN tableName tinytext,
+  IN columnName1 tinytext,
+  IN columnName2 tinytext,
+  IN columnName3 tinytext
+)
+BEGIN
+  DECLARE done INT DEFAULT 0;
+  DECLARE nonunique_index_name CHAR(16);
+  
+  DECLARE select_index_names CURSOR FOR
+    SELECT
+    i1.INDEX_NAME
+    FROM
+    information_schema.STATISTICS i1,
+    information_schema.STATISTICS i2
+    LEFT JOIN information_schema.STATISTICS i3 ON (
+      i3.TABLE_SCHEMA = i2.TABLE_SCHEMA
+      AND i3.TABLE_NAME = i2.TABLE_NAME
+      AND i3.INDEX_NAME = i2.INDEX_NAME
+      AND i3.SEQ_IN_INDEX = 3
+    )
+    WHERE
+    i1.TABLE_SCHEMA = Database()
+    AND i1.TABLE_NAME = tableName
+    AND i1.SEQ_IN_INDEX = 1
+    AND i1.COLUMN_NAME IN (columnName1, columnName2, columnName3)
+    AND i2.TABLE_SCHEMA = i1.TABLE_SCHEMA
+    AND i2.TABLE_NAME = i1.TABLE_NAME
+    AND i2.INDEX_NAME = i1.INDEX_NAME
+    AND i2.SEQ_IN_INDEX = 2
+    AND i2.COLUMN_NAME IN (columnName1, columnName2, columnName3)
+    AND (i3.COLUMN_NAME IS NULL OR i3.COLUMN_NAME IN (columnName1, 
columnName2, columnName3));
+
+  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
+
+  OPEN select_index_names;
+  
+  REPEAT
+    FETCH select_index_names INTO nonunique_index_name;
+    IF NOT done THEN
+      SET @drop_nonunique_index = CONCAT('ALTER TABLE `', Database(), '`.', 
tableName, ' DROP INDEX ', nonunique_index_name);
+      PREPARE drop_nonunique_index FROM @drop_nonunique_index;
+      EXECUTE drop_nonunique_index;
+    END IF;
+  UNTIL done END REPEAT;
+  
+  CLOSE select_index_names;
+  
+  IF NOT EXISTS (
+    SELECT
+    i1.INDEX_NAME,
+    i1.COLUMN_NAME AS c1,
+    i2.COLUMN_NAME AS c2,
+    i3.COLUMN_NAME AS c3
+    
+    FROM
+    information_schema.STATISTICS i1,
+    information_schema.STATISTICS i2,
+    information_schema.STATISTICS i3
+    
+    WHERE
+    i1.TABLE_SCHEMA = Database()
+    AND i1.TABLE_SCHEMA = i2.TABLE_SCHEMA
+    AND i1.TABLE_SCHEMA = i3.TABLE_SCHEMA
+    
+    AND i1.TABLE_NAME = tableName
+    AND i1.TABLE_NAME = i2.TABLE_NAME
+    AND i1.TABLE_NAME = i3.TABLE_NAME
+    
+    AND i1.INDEX_NAME = i2.INDEX_NAME
+    AND i1.INDEX_NAME = i3.INDEX_NAME
+    
+    AND i1.COLUMN_NAME != i2.COLUMN_NAME
+    AND i1.COLUMN_NAME != i3.COLUMN_NAME
+    
+    AND i1.SEQ_IN_INDEX = 1
+    AND i2.SEQ_IN_INDEX = 2
+    AND i3.SEQ_IN_INDEX = 3
+    
+    AND i1.COLUMN_NAME IN (columnName1, columnName2, columnName3)
+    AND i2.COLUMN_NAME IN (columnName1, columnName2, columnName3)
+    AND i3.COLUMN_NAME IN (columnName1, columnName2, columnName3)
+  )
+  THEN
+    SET @add_unique_index = CONCAT('ALTER TABLE `', Database(), '`.', 
tableName, ' ADD UNIQUE (', columnName1, ',', columnName2, ',', columnName3, 
')');
+    PREPARE add_unique_index FROM @add_unique_index;
+    EXECUTE add_unique_index;
+  END IF;
+END$$
+
 /* ============= End of Stored Procedures ===============*/
 
 -- --------------------------------------------------------
@@ -591,6 +693,8 @@ CALL AddColumnIfNotExists('changelog', '
 CALL AddIndexIfNotExists('changelog', 'userid');
 CALL AddIndexIfNotExists('changelog', 'reservationid');
 
+CALL Add3ColUniqueIndexIfNotExist('changelog', 'reservationid', 'userid', 
'remoteIP');
+
 -- --------------------------------------------------------
 
 -- 

Modified: vcl/trunk/mysql/vcl.sql
URL: 
http://svn.apache.org/viewvc/vcl/trunk/mysql/vcl.sql?rev=1576901&r1=1576900&r2=1576901&view=diff
==============================================================================
--- vcl/trunk/mysql/vcl.sql (original)
+++ vcl/trunk/mysql/vcl.sql Wed Mar 12 20:52:38 2014
@@ -168,7 +168,8 @@ CREATE TABLE IF NOT EXISTS `changelog` (
   PRIMARY KEY  (`id`),
   KEY `logid` (`logid`),
   KEY `userid` (`userid`),
-  KEY `reservationid` (`reservationid`)
+  KEY `reservationid` (`reservationid`),
+  UNIQUE KEY reservation_user_remoteIP (userid,reservationid,remoteIP)
 ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
 
 -- --------------------------------------------------------


Reply via email to