From bf131b7a0e2c13fdca549d036bb8ae37b64847ee Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Fri, 1 May 2020 14:29:28 +0300 Subject: [PATCH] Added 'dbType' => 'longtext' for text fields --- .../DBAL/FieldTypes/JsonArrayType.php | 8 +-- .../DBAL/FieldTypes/JsonObjectType.php | 8 +-- .../Database/DBAL/FieldTypes/LongtextType.php | 52 +++++++++++++++++++ .../Database/DBAL/FieldTypes/TextType.php | 45 ++++++++++++++++ .../Utils/Database/DBAL/Schema/Comparator.php | 21 ++++---- .../DBAL/Schema/MySqlSchemaManager.php | 2 +- .../Database/Schema/tables/preferences.php | 3 +- 7 files changed, 112 insertions(+), 27 deletions(-) create mode 100644 application/Espo/Core/Utils/Database/DBAL/FieldTypes/LongtextType.php create mode 100644 application/Espo/Core/Utils/Database/DBAL/FieldTypes/TextType.php diff --git a/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonArrayType.php b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonArrayType.php index d963273004..36550886d4 100644 --- a/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonArrayType.php +++ b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonArrayType.php @@ -29,7 +29,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes; -class JsonArrayType extends \Doctrine\DBAL\Types\TextType +class JsonArrayType extends TextType { const JSON_ARRAY = 'jsonArray'; @@ -37,10 +37,4 @@ class JsonArrayType extends \Doctrine\DBAL\Types\TextType { return self::JSON_ARRAY; } - - public static function getDbTypeName() - { - return 'TEXT'; - } - } diff --git a/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonObjectType.php b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonObjectType.php index f112af8d88..26daf8d5e0 100644 --- a/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonObjectType.php +++ b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/JsonObjectType.php @@ -29,7 +29,7 @@ namespace Espo\Core\Utils\Database\DBAL\FieldTypes; -class JsonObjectType extends \Doctrine\DBAL\Types\TextType +class JsonObjectType extends TextType { const JSON_OBJECT = 'jsonObject'; @@ -37,10 +37,4 @@ class JsonObjectType extends \Doctrine\DBAL\Types\TextType { return self::JSON_OBJECT; } - - public static function getDbTypeName() - { - return 'TEXT'; - } - } diff --git a/application/Espo/Core/Utils/Database/DBAL/FieldTypes/LongtextType.php b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/LongtextType.php new file mode 100644 index 0000000000..fb430322d6 --- /dev/null +++ b/application/Espo/Core/Utils/Database/DBAL/FieldTypes/LongtextType.php @@ -0,0 +1,52 @@ +getType() != $column2->getType() ) { //espo: fix problem with executing query for custom types @@ -82,15 +83,6 @@ class Comparator extends \Doctrine\DBAL\Schema\Comparator } } - if ($column1->getType() instanceof \Doctrine\DBAL\Types\TextType) { - $length1 = $column1->getLength() ?: 16777215/* mediumtext length*/; - $length2 = $column2->getLength() ?: 16777215; - - if ($length1 != -1 && $length2 != -1 && $length2 > $length1) { - $changedProperties[] = 'length'; - } - } - if ($column1->getType() instanceof \Doctrine\DBAL\Types\DecimalType) { if (($column1->getPrecision()?:10) != ($column2->getPrecision()?:10)) { $changedProperties[] = 'precision'; @@ -124,7 +116,7 @@ class Comparator extends \Doctrine\DBAL\Schema\Comparator $changedProperties = array_merge($changedProperties, $diffKeys); - /** Espo: do not change a field length while changing other parameters */ + /** Espo: do not change a field length downwards */ if (!empty($changedProperties) && !in_array('length', $changedProperties) && $column1->getType() instanceof \Doctrine\DBAL\Types\StringType) { $length1 = $column1->getLength() ?: 255; $length2 = $column2->getLength() ?: 255; @@ -134,6 +126,15 @@ class Comparator extends \Doctrine\DBAL\Schema\Comparator $column2->setLength($length1); } } + + if (in_array('type', $changedProperties) && $column1->getType() instanceof \Doctrine\DBAL\Types\TextType && isset($column1DbTypeName) && isset($column2DbTypeName)) { + $constName1 = '\Espo\Core\Utils\Database\DBAL\Platforms\MySqlPlatform::LENGTH_LIMIT_' . strtoupper($column1DbTypeName); + $constName2 = '\Espo\Core\Utils\Database\DBAL\Platforms\MySqlPlatform::LENGTH_LIMIT_' . strtoupper($column2DbTypeName); + + if (defined($constName1) && defined($constName2) && constant($constName1) >= constant($constName2)) { + $changedProperties = array_diff($changedProperties, ['type']); + } + } /** Espo: end */ return $changedProperties; diff --git a/application/Espo/Core/Utils/Database/DBAL/Schema/MySqlSchemaManager.php b/application/Espo/Core/Utils/Database/DBAL/Schema/MySqlSchemaManager.php index bd70317930..96e5fad554 100644 --- a/application/Espo/Core/Utils/Database/DBAL/Schema/MySqlSchemaManager.php +++ b/application/Espo/Core/Utils/Database/DBAL/Schema/MySqlSchemaManager.php @@ -209,7 +209,7 @@ class MySqlSchemaManager extends \Doctrine\DBAL\Schema\MySqlSchemaManager case 'text': case 'mediumtext': case 'longtext': - $length = $this->_platform->getClobTypeLength($dbType); + $length = null; break; /* Espo: end */ } diff --git a/application/Espo/Core/Utils/Database/Schema/tables/preferences.php b/application/Espo/Core/Utils/Database/Schema/tables/preferences.php index b6a5fe06fc..b777c52395 100644 --- a/application/Espo/Core/Utils/Database/Schema/tables/preferences.php +++ b/application/Espo/Core/Utils/Database/Schema/tables/preferences.php @@ -46,8 +46,7 @@ return [ 'type' => 'id', ], 'data' => [ - 'type' => 'text', - 'len' => 16777216, + 'type' => 'text' ] ] ],