From 6817a54aa036b1e31f823bb7bd2364dfe2349c2d Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Fri, 2 Mar 2018 13:00:25 +0200 Subject: [PATCH] Job for changing mysql column characters --- application/Espo/Services/MysqlCharacter.php | 135 +++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 application/Espo/Services/MysqlCharacter.php diff --git a/application/Espo/Services/MysqlCharacter.php b/application/Espo/Services/MysqlCharacter.php new file mode 100644 index 0000000000..b5786f0449 --- /dev/null +++ b/application/Espo/Services/MysqlCharacter.php @@ -0,0 +1,135 @@ +addDependency('container'); + } + + protected function getContainer() + { + return $this->getInjection('container'); + } + + public function jobConvertToMb4() + { + $container = $this->getContainer(); + + $pdo = $container->get('entityManager')->getPDO(); + $ormMeta = $container->get('ormMetadata')->getData(true); + + $databaseSchema = $container->get('schema'); + $maxIndexLength = $databaseSchema->getMaxIndexLength(); + if ($maxIndexLength > 1000) { + $maxIndexLength = 1000; + } + + $fieldListExceededIndexMaxLength = \Espo\Core\Utils\Database\Schema\Utils::getFieldListExceededIndexMaxLength($ormMeta, $maxIndexLength); + + foreach ($ormMeta as $entityName => $entityParams) { + + $tableName = \Espo\Core\Utils\Util::toUnderScore($entityName); + + //Get table columns params + $query = "SHOW FULL COLUMNS FROM `". $tableName ."` WHERE `Collation` <> 'utf8mb4_unicode_ci'"; + + try { + $sth = $pdo->prepare($query); + $sth->execute(); + } catch (\Exception $e) { + $GLOBALS['log']->debug('Utf8mb4: Table does not exist - ' . $e->getMessage()); + continue; + } + + $columnParams = array(); + $rowList = $sth->fetchAll(\PDO::FETCH_ASSOC); + foreach ($rowList as $row) { + $columnParams[ $row['Field'] ] = $row; + } + //END: get table columns params + + foreach ($entityParams['fields'] as $fieldName => $fieldParams) { + + $columnName = \Espo\Core\Utils\Util::toUnderScore($fieldName); + + if (isset($fieldParams['notStorable']) && $fieldParams['notStorable']) { + continue; + } + + if (isset($fieldListExceededIndexMaxLength[$entityName]) && in_array($fieldName, $fieldListExceededIndexMaxLength[$entityName])) { + continue; + } + + if (!isset($columnParams[$columnName]) || empty($columnParams[$columnName]['Type'])) { + continue; + } + + $query = null; + + switch ($fieldParams['type']) { + case 'varchar': + case 'text': + case 'jsonObject': + case 'jsonArray': + $query = "ALTER TABLE `".$tableName."` + CHANGE COLUMN `". $columnName ."` `". $columnName ."` ". $columnParams[$columnName]['Type'] ." + CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + "; + break; + } + + if (!empty($query)) { + $GLOBALS['log']->debug('Utf8mb4: execute the query - [' . $query . '].'); + + try { + $sth = $pdo->prepare($query); + $sth->execute(); + } catch (\Exception $e) { + $GLOBALS['log']->warning('Utf8mb4: FAILED executing the query - [' . $query . '], details: '. $e->getMessage() .'.'); + } + } + } + } + + $config = $container->get('config'); + $database = $config->get('database'); + if (!isset($database['charset']) || $database['charset'] != 'utf8mb4') { + $database['charset'] = 'utf8mb4'; + $config->set('database', $database); + $config->save(); + } + + $fileManager = $container->get('fileManager'); + $fileManager->unlink('application/Espo/Services/MysqlCharacter.php'); + } +} \ No newline at end of file