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;
}
}