From 169475b7a2628015771a762b44d8e7c73a2602d4 Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Fri, 1 Jul 2016 12:30:46 +1000 Subject: [PATCH] CRM-19038 NFC shift safeDropFK code to SchemaHandler Class from Upgrade Code --- CRM/Core/BAO/SchemaHandler.php | 30 +++++++++++++++ CRM/Upgrade/Incremental/php/FourSeven.php | 38 ++----------------- .../CRM/Core/BAO/SchemaHandlerTest.php | 16 ++++++++ 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/CRM/Core/BAO/SchemaHandler.php b/CRM/Core/BAO/SchemaHandler.php index a390e7de3d..c8c8200105 100644 --- a/CRM/Core/BAO/SchemaHandler.php +++ b/CRM/Core/BAO/SchemaHandler.php @@ -598,4 +598,34 @@ MODIFY {$columnName} varchar( $length ) return FALSE; } + /** + * Remove a foreign key from a table if it exists + * + * @param $table_name + * @param $constraint_name + */ + public static function safeRemoveFK($table_name, $constraint_name) { + + $config = CRM_Core_Config::singleton(); + $dbUf = DB::parseDSN($config->dsn); + $query = " + SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = %1 + AND TABLE_NAME = %2 + AND CONSTRAINT_NAME = %3 + AND CONSTRAINT_TYPE = 'FOREIGN KEY' + "; + $params = array( + 1 => array($dbUf['database'], 'String'), + 2 => array($table_name, 'String'), + 3 => array($constraint_name, 'String'), + ); + $dao = CRM_Core_DAO::executeQuery($query, $params); + + if ($dao->fetch()) { + CRM_Core_DAO::executeQuery("ALTER TABLE {$table_name} DROP FOREIGN KEY {$constraint_name}", array()); + } + + } + } diff --git a/CRM/Upgrade/Incremental/php/FourSeven.php b/CRM/Upgrade/Incremental/php/FourSeven.php index 9a7f81e160..ab9fee7780 100644 --- a/CRM/Upgrade/Incremental/php/FourSeven.php +++ b/CRM/Upgrade/Incremental/php/FourSeven.php @@ -666,36 +666,6 @@ FROM `civicrm_dashboard_contact` JOIN `civicrm_contact` WHERE civicrm_dashboard_ return TRUE; } - /** - * Remove a foreign key from a table if it exists - * - * @param $table_name - * @param $constraint_name - */ - public function safeRemoveFK($table_name, $constraint_name) { - - $config = CRM_Core_Config::singleton(); - $dbUf = DB::parseDSN($config->dsn); - $query = " - SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS - WHERE TABLE_SCHEMA = %1 - AND TABLE_NAME = %2 - AND CONSTRAINT_NAME = %3 - AND CONSTRAINT_TYPE = 'FOREIGN KEY' - "; - $params = array( - 1 => array($dbUf['database'], 'String'), - 2 => array($table_name, 'String'), - 3 => array($constraint_name, 'String'), - ); - $dao = CRM_Core_DAO::executeQuery($query, $params); - - if ($dao->fetch()) { - CRM_Core_DAO::executeQuery("ALTER TABLE {$table_name} DROP FOREIGN KEY {$constraint_name}", array()); - } - - } - /** * CRM-18345 Don't delete mailing data on email/phone deletion * Implemented here in CRM-18526 @@ -707,10 +677,10 @@ FROM `civicrm_dashboard_contact` JOIN `civicrm_contact` WHERE civicrm_dashboard_ public function upgradeMailingFKs(CRM_Queue_TaskContext $ctx) { // Safely drop the foreign keys - self::safeRemoveFK('civicrm_mailing_event_queue', 'FK_civicrm_mailing_event_queue_email_id'); - self::safeRemoveFK('civicrm_mailing_event_queue', 'FK_civicrm_mailing_event_queue_phone_id'); - self::safeRemoveFK('civicrm_mailing_recipients', 'FK_civicrm_mailing_recipients_email_id'); - self::safeRemoveFK('civicrm_mailing_recipients', 'FK_civicrm_mailing_recipients_phone_id'); + CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_event_queue', 'FK_civicrm_mailing_event_queue_email_id'); + CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_event_queue', 'FK_civicrm_mailing_event_queue_phone_id'); + CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_recipients', 'FK_civicrm_mailing_recipients_email_id'); + CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_recipients', 'FK_civicrm_mailing_recipients_phone_id'); // Set up the new foreign keys CRM_Core_DAO::executeQuery("SET FOREIGN_KEY_CHECKS = 0;"); diff --git a/tests/phpunit/CRM/Core/BAO/SchemaHandlerTest.php b/tests/phpunit/CRM/Core/BAO/SchemaHandlerTest.php index 00a86bbc2d..90089fb1ca 100644 --- a/tests/phpunit/CRM/Core/BAO/SchemaHandlerTest.php +++ b/tests/phpunit/CRM/Core/BAO/SchemaHandlerTest.php @@ -148,4 +148,20 @@ class CRM_Core_BAO_SchemaHandlerTest extends CiviUnitTestCase { } } + /** + * Test to see if we can drop foreign key + * + */ + public function testSafeDropForeignKey() { + $tests = array('FK_civicrm_mailing_recipients_email_id', 'FK_civicrm_mailing_recipients_id'); + foreach ($tests as $test) { + if ($test == 'FK_civicrm_mailing_recipients_id') { + $this->assertFalse(CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_recipients', $test)); + } + else { + $this->assertTrue(CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_mailing_recipients', $test)); + } + } + } + } -- 2.25.1