Handle changes in MySQL behavior between migrations

Signed-off-by: James Ren <[email protected]>

--- autotest/database/db_utils.py       2010-06-09 10:36:04.000000000 -0700
+++ autotest/database/db_utils.py       2010-06-09 10:36:04.000000000 -0700
@@ -92,6 +92,20 @@
                     '%s missing from database, stopping' % name)
 
 
+def check_index_exists(manager, table_name, index_name):
+    """
+    Checks if a particular index exists on the table
+
+    @param manager the migration manager
+    @param table_name the table to check
+    @param index_name the index to check
+    """
+    query = ('SELECT 1 FROM information_schema.statistics '
+             'WHERE table_schema = %s AND table_name = %s AND index_name = %s')
+    rows = manager.execute(query, manager.get_db_name(), table_name, 
index_name)
+    return bool(rows)
+
+
 DJANGO_AUTH_TABLES = ('auth_group', 'auth_group_permissions', 
'auth_permission')
 
 def auth_tables_exist(manager):
--- autotest/frontend/migrations/062_drone_sets_unique.py       2010-06-09 
10:36:04.000000000 -0700
+++ autotest/frontend/migrations/062_drone_sets_unique.py       2010-06-09 
10:36:04.000000000 -0700
@@ -1,3 +1,6 @@
+import common
+from autotest_lib.database import db_utils
+
 UP_SQL = """
 CREATE INDEX afe_drone_sets_drones_droneset_ibfk
 ON afe_drone_sets_drones (droneset_id);
@@ -8,7 +11,11 @@
 ALTER TABLE afe_drone_sets_drones
 ADD CONSTRAINT afe_drone_sets_drones_unique
 UNIQUE KEY (drone_id);
+"""
 
+# On first migration to 62, this key will be deleted automatically. However, if
+# you migrate to 62, then down to 61, then back to 62, this key will remain.
+DROP_KEY_SQL = """
 ALTER TABLE afe_drone_sets_drones
 DROP KEY afe_drone_sets_drones_drone_ibfk;
 """
@@ -38,3 +45,7 @@
                       'set. Please remove all duplicates before running this '
                       'migration.')
     manager.execute_script(UP_SQL)
+
+    if db_utils.check_index_exists(manager, 'afe_drone_sets_drones',
+                                   'afe_drone_sets_drones_drone_ibfk'):
+        manager.execute(DROP_KEY_SQL)
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to