From f5078cc04221e916b7d41ca8c598a06bdd8a42ed Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Sat, 6 May 2017 13:02:35 +1000 Subject: [PATCH] NFC Add in function to check if Foreign key is there to make upgrade more stable --- CRM/Core/BAO/SchemaHandler.php | 31 +++++++++++++++------ CRM/Upgrade/Incremental/php/FourSeven.php | 33 ++++++++--------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/CRM/Core/BAO/SchemaHandler.php b/CRM/Core/BAO/SchemaHandler.php index fbf194411a..51b5b77a87 100644 --- a/CRM/Core/BAO/SchemaHandler.php +++ b/CRM/Core/BAO/SchemaHandler.php @@ -640,15 +640,13 @@ MODIFY {$columnName} varchar( $length ) } /** - * Remove a foreign key from a table if it exists. - * - * @param $table_name - * @param $constraint_name - * - * @return bool + * Check if a foreign key Exists + * @param string $table_name + * @param string $constraint_name + * @return bool TRUE if FK is found */ - public static function safeRemoveFK($table_name, $constraint_name) { - + public static function checkFKExists($table_name, $constraint_name) { + $found = FALSE; $config = CRM_Core_Config::singleton(); $dbUf = DB::parseDSN($config->dsn); $query = " @@ -666,6 +664,23 @@ MODIFY {$columnName} varchar( $length ) $dao = CRM_Core_DAO::executeQuery($query, $params); if ($dao->fetch()) { + $found = TRUE; + } + return $found; + } + + /** + * Remove a foreign key from a table if it exists. + * + * @param $table_name + * @param $constraint_name + * + * @return bool + */ + public static function safeRemoveFK($table_name, $constraint_name) { + $check = self::checkFKExists($table_name, $constraint_name); + + if ($check) { CRM_Core_DAO::executeQuery("ALTER TABLE {$table_name} DROP FOREIGN KEY {$constraint_name}", array()); return TRUE; } diff --git a/CRM/Upgrade/Incremental/php/FourSeven.php b/CRM/Upgrade/Incremental/php/FourSeven.php index cbfbc839a7..abe4aa6599 100644 --- a/CRM/Upgrade/Incremental/php/FourSeven.php +++ b/CRM/Upgrade/Incremental/php/FourSeven.php @@ -1093,13 +1093,16 @@ FROM `civicrm_dashboard_contact` JOIN `civicrm_contact` WHERE civicrm_dashboard_ if ($count = 1) { CRM_Core_DAO::executeQuery("UPDATE civicrm_sms_provider SET domain_id = (SELECT id FROM civicrm_domain)"); } - CRM_Core_DAO::executeQuery("SET FOREIGN_KEY_CHECKS = 0;"); - CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_sms_provider` - ADD CONSTRAINT FK_civicrm_sms_provider_domain_id - FOREIGN KEY (`domain_id`) REFERENCES `civicrm_domain`(`id`) - ON DELETE SET NULL"); + $check = CRM_Core_BAO_SchemaHandler::checkFKExists('civicrm_sms_provider', 'FK_civicrm_sms_provider_domain_id'); + if (!$check) { + CRM_Core_DAO::executeQuery("SET FOREIGN_KEY_CHECKS = 0;"); + CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_sms_provider` + ADD CONSTRAINT FK_civicrm_sms_provider_domain_id + FOREIGN KEY (`domain_id`) REFERENCES `civicrm_domain`(`id`) + ON DELETE SET NULL"); - CRM_Core_DAO::executeQuery("SET FOREIGN_KEY_CHECKS = 1;"); + CRM_Core_DAO::executeQuery("SET FOREIGN_KEY_CHECKS = 1;"); + } return TRUE; } @@ -1126,22 +1129,8 @@ FROM `civicrm_dashboard_contact` JOIN `civicrm_contact` WHERE civicrm_dashboard_ * CRM-19986 fix schema differnces in civicrm_action_schedule */ public static function fixSchemaOnCiviCRMActionSchedule() { - $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('civicrm_action_schedule', 'String'), - 3 => array('FK_civicrm_action_schedule_sms_template_id', 'String'), - ); - $dao = CRM_Core_DAO::executeQuery($query, $params); - if (!$dao->fetch()) { + $check = CRM_Core_BAO_SchemaHandler::checkFKExists('civicrm_action_schedule', 'FK_civicrm_action_schedule_sms_template_id'); + if (!$check) { CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_action_schedule` ADD CONSTRAINT FK_civicrm_action_schedule_sms_template_id FOREIGN KEY (`sms_template_id`) REFERENCES `civicrm_msg_template`(`id`) -- 2.25.1