Skip to content

Commit

Permalink
Some custom fields are stored in the database as short codes but expo…
Browse files Browse the repository at this point in the history
…rted to users as labels.

The issue is described at https://lab.civicrm.org/dev/core/-/issues/877
A partial fix is at civicrm/civicrm-core#18146
This fix returns a varchar(255) even if 'maxlength' is set.
  • Loading branch information
kenwest committed Oct 6, 2020
1 parent e4eb526 commit c447a70
Showing 1 changed file with 17 additions and 43 deletions.
60 changes: 17 additions & 43 deletions php/CRM/Export/BAO/ExportProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -1459,12 +1459,23 @@ public function getSqlColumnDefinition($fieldName, $columnName) {
return "`$fieldName` varchar(255)";

case CRM_Utils_Type::T_STRING:
if (isset($queryFields[$columnName]['maxlength'])) {
return "`$fieldName` varchar({$queryFields[$columnName]['maxlength']})";
}
else {
if (isset($fieldSpec['maxlength'])) {
return "`$fieldName` varchar(255)";
}
$dataType = $fieldSpec['data_type'] ?? '';
// set the sql columns for custom data
switch ($dataType) {
case 'String':
// May be option labels, which could be up to 512 characters
$length = max(512, CRM_Utils_Array::value('text_length', $fieldSpec));
return "`$fieldName` varchar($length)";

case 'Memo':
return "`$fieldName` text";

default:
return "`$fieldName` varchar(255)";
}

case CRM_Utils_Type::T_TEXT:
case CRM_Utils_Type::T_LONGTEXT:
Expand All @@ -1486,47 +1497,10 @@ public function getSqlColumnDefinition($fieldName, $columnName) {
}
}
else {
if (substr($fieldName, -3, 3) == '_id') {
if (substr($fieldName, -3, 3) === '_id') {
return "`$fieldName` varchar(255)";
}
elseif (substr($fieldName, -5, 5) == '_note') {
return "`$fieldName` text";
}
else {
$changeFields = [
'groups',
'tags',
'notes',
];

if (in_array($fieldName, $changeFields)) {
return "`$fieldName` text";
}
else {
// set the sql columns for custom data
if (isset($queryFields[$columnName]['data_type'])) {

switch ($queryFields[$columnName]['data_type']) {
case 'String':
// May be option labels, which could be up to 512 characters
$length = max(512, CRM_Utils_Array::value('text_length', $queryFields[$columnName]));
return "`$fieldName` varchar($length)";

case 'Link':
return "`$fieldName` varchar(255)";

case 'Memo':
return "`$fieldName` text";

default:
return "`$fieldName` varchar(255)";
}
}
else {
return "`$fieldName` text";
}
}
}
return "`$fieldName` text";
}
}

Expand Down

0 comments on commit c447a70

Please sign in to comment.