From 1455956f187bfa6c451b77f8a9cef3a2a6f1a3c5 Mon Sep 17 00:00:00 2001 From: Shish Date: Tue, 7 Feb 2012 19:18:58 +0000 Subject: [PATCH] putting foreign key additions into auto-upgrade ext --- ext/upgrade/main.php | 58 +++++++++++++++++++++++++++++---------- install.php | 64 -------------------------------------------- 2 files changed, 44 insertions(+), 78 deletions(-) diff --git a/ext/upgrade/main.php b/ext/upgrade/main.php index 4d8f32b9..81b79f70 100644 --- a/ext/upgrade/main.php +++ b/ext/upgrade/main.php @@ -10,6 +10,8 @@ class Upgrade extends SimpleExtension { public function onInitExt(InitExtEvent $event) { global $config, $database; + if($config->get_bool("in_upgrade")) return; + if(!is_numeric($config->get_string("db_version"))) { $config->set_int("db_version", 2); } @@ -18,28 +20,56 @@ class Upgrade extends SimpleExtension { // cry :S } - if($config->get_int("db_version") < 7) { - /* - // mysql-adodb specific - if($database->engine->name == "mysql") { - $tables = $database->db->MetaTables(); - foreach($tables as $table) { - log_info("upgrade", "converting $table to innodb"); - $database->execute("ALTER TABLE $table TYPE=INNODB"); - } - } - */ - $config->set_int("db_version", 7); - log_info("upgrade", "Database at version 7"); - } + // v7 is convert to innodb with adodb + // now done again as v9 with PDO if($config->get_int("db_version") < 8) { // if this fails, don't try again + $config->set_bool("in_upgrade", true); $config->set_int("db_version", 8); $database->execute($database->engine->scoreql_to_sql( "ALTER TABLE images ADD COLUMN locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N" )); log_info("upgrade", "Database at version 8"); + $config->set_bool("in_upgrade", false); + } + + if($config->get_int("db_version") < 9) { + $config->set_bool("in_upgrade", true); + if($database->db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { + $tables = $database->get_col("SHOW TABLES"); + foreach($tables as $table) { + log_info("upgrade", "converting $table to innodb"); + $database->execute("ALTER TABLE $table TYPE=INNODB"); + } + } + $config->set_int("db_version", 9); + log_info("upgrade", "Database at version 9"); + $config->set_bool("in_upgrade", false); + } + + if($config->get_int("db_version") < 10) { + $config->set_bool("in_upgrade", true); + + log_info("upgrade", "Cleaning user favourites"); + $database->Execute("DELETE FROM user_favorites WHERE user_id NOT IN (SELECT id FROM users)"); + $database->Execute("DELETE FROM user_favorites WHERE image_id NOT IN (SELECT id FROM images)"); + + log_info("upgrade", "Adding foreign keys to user favourites"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"); + $database->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"); + + log_info("upgrade", "Adding foreign keys to private messages"); + $database->Execute("ALTER TABLE private_message + ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, + ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;"); + + log_info("upgrade", "Adding foreign keys to images"); + $database->Execute("ALTER TABLE images ADD CONSTRAINT foreign_images_owner_id FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT"); + + $config->set_int("db_version", 10); + log_info("upgrade", "Database at version 10"); + $config->set_bool("in_upgrade", false); } } diff --git a/install.php b/install.php index a14c4c7a..89d6e50c 100755 --- a/install.php +++ b/install.php @@ -102,17 +102,6 @@ if(is_readable("config.php")) { "; */ - echo "

Database Fix for User deletion

"; - echo "

This is a database fix for those who instaled shimmie before 2012 January 22rd.

"; - echo "

This is only for users with MySQL databases!

"; - echo "

Note: Some things needs to be done manually, to work properly.
"; - echo "Please BACKUP YOUR DATABASE before performing this fix!
"; - echo "WARNING: ONLY PROCEED IF YOU KNOW WHAT YOU ARE DOING!

"; - echo " -
- -
- "; echo "

Log Out

"; echo " @@ -125,9 +114,6 @@ if(is_readable("config.php")) { session_destroy(); echo "

Logged Out

You have been logged out.

Main Shimmie Page"; } - else if($_GET["action"] == "Database_user_deletion_fix") { - Database_user_deletion_fix(); - } } else { echo "

Login

@@ -427,56 +413,6 @@ EOD; exit; } } // }}} - -function Database_user_deletion_fix() { // {{{ - try { - $db = new Database(); - - if ($db->db->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'mysql') { - echo "

Database is not MySQL - Aborting changes.

"; - echo 'Go Back'; - throw new PDOException("Database is not MySQL."); - } else { - echo "

Performing Database Fix Operations


"; - } - - echo "Fixing user_favorites table....

"; - - ($db->Execute("ALTER TABLE user_favorites ENGINE=InnoDB;")) ? print_r("ok
") : print_r("failed
"); - echo "adding Foreign key to user ids...

"; - - ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT foreign_user_favorites_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;"))? print_r("ok
"):print_r("failed
"); - echo "cleaning, the table from deleted image favorites...
"; - - $rows = $db->get_all("SELECT * FROM user_favorites WHERE image_id NOT IN ( SELECT id FROM images );"); - - foreach( $rows as $key => $value) - $db->Execute("DELETE FROM user_favorites WHERE image_id = :image_id;", array("image_id" => $value["image_id"])); - - echo "adding forign key to image ids...

"; - - ($db->Execute("ALTER TABLE user_favorites ADD CONSTRAINT user_favorites_image_id FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE;"))? print_r("ok
"):print_r("failed
"); - - echo "adding foreign keys to private messages...

"; - - ($db->Execute("ALTER TABLE private_message - ADD CONSTRAINT foreign_private_message_from_id FOREIGN KEY (from_id) REFERENCES users(id) ON DELETE CASCADE, - ADD CONSTRAINT foreign_private_message_to_id FOREIGN KEY (to_id) REFERENCES users(id) ON DELETE CASCADE;")) ? print_r("ok
"):print_r("failed
"); - - echo "

Just one more step...which you need to do manually:
"; - echo "You need to go to your database and Delete the foreign key on the owner_id in the images table.

"; - echo "How to remove foreign keys

"; - echo "and finally execute this querry:

"; - echo "ALTER TABLE images ADD CONSTRAINT foreign_images_owner_id FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT;

"; - echo "if this is all sucesfull you are done!"; - - } - catch (PDOException $e) - { - // FIXME: Make the error message user friendly - exit($e->getMessage()); - } -} // }}} ?>