From f41b3f7ed144aa7936a53115abb4f4acdaad81a8 Mon Sep 17 00:00:00 2001 From: Ravish Nair Date: Fri, 27 Sep 2013 17:06:25 +0530 Subject: [PATCH] -- fix for CRM-13417 ---------------------------------------- * CRM-13417: Dedupe Rule Creation error trapping fails on length selections for substrings of numeric fields or out of range numbers for text fields http://issues.civicrm.org/jira/browse/CRM-13417 --- CRM/Contact/Form/DedupeRules.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CRM/Contact/Form/DedupeRules.php b/CRM/Contact/Form/DedupeRules.php index dd4c322465..ea8154b811 100644 --- a/CRM/Contact/Form/DedupeRules.php +++ b/CRM/Contact/Form/DedupeRules.php @@ -265,6 +265,25 @@ UPDATE civicrm_dedupe_rule_group if (!isset($substrLenghts[$table])) { $substrLenghts[$table] = array(); } + + //CRM-13417 to avoid fatal error "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys, 1089" + $daoObj = new CRM_Core_DAO(); + $database = $daoObj->database(); + $schemaQuery = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = '{$database}' AND + TABLE_NAME = '{$table}' AND COLUMN_NAME = '{$field}';"; + $dao = CRM_Core_DAO::executeQuery($schemaQuery); + + while ($dao->fetch()) { + // set the length to null for all the fields where prefix length is not supported. eg. int,tinyint,date,enum etc dataTypes. + if ($dao->COLUMN_NAME == $field && !in_array($dao->DATA_TYPE, array('char', 'varchar', 'binary', 'varbinary', 'text', 'blob'))) { + $length = NULL; + } + elseif ($dao->COLUMN_NAME == $field && !empty($dao->CHARACTER_MAXIMUM_LENGTH) && ($length > $dao->CHARACTER_MAXIMUM_LENGTH)) { + //set the length to CHARACTER_MAXIMUM_LENGTH in case the length provided by the user is greater than the limit + $length = $dao->CHARACTER_MAXIMUM_LENGTH; + } + } $substrLenghts[$table][$field] = $length; } } -- 2.25.1