addDependency('container'); } protected function getContainer() /** @phpstan-ignore-line */ { return $this->getInjection('container'); } public function jobConvertToMb4() /** @phpstan-ignore-line */ { $container = $this->getContainer(); /* @var $em \Espo\ORM\EntityManager */ $em = $container->get('entityManager'); $sqlExecutor = $em->getSqlExecutor(); $ormMeta = $container->get('ormMetadata')->getData(true); $databaseSchema = $container->get('schema'); $maxIndexLength = $databaseSchema->getDatabaseHelper()->getMaxIndexLength(); if ($maxIndexLength > 1000) { $maxIndexLength = 1000; } $sth = $sqlExecutor->execute("SELECT `name` FROM `account` WHERE LENGTH(name) > 249"); if (!$sth->fetch()) { $sqlExecutor->execute("ALTER TABLE `account` MODIFY `name` VARCHAR(249)"); } $fieldListExceededIndexMaxLength = SchemaUtils::getFieldListExceededIndexMaxLength($ormMeta, $maxIndexLength); foreach ($ormMeta as $entityName => $entityParams) { $tableName = \Espo\Core\Utils\Util::toUnderScore($entityName); // Get table columns params /** @phpstan-ignore-next-line */ $query = "SHOW FULL COLUMNS FROM `". $tableName ."` WHERE `Collation` <> 'utf8mb4_unicode_ci'"; try { $sth = $sqlExecutor->execute($query); } catch (\Exception $e) { $GLOBALS['log']->debug('Utf8mb4: Table does not exist - ' . $e->getMessage()); continue; } $columnParams = []; $rowList = $sth->fetchAll(); 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; } /** @phpstan-ignore-next-line */ if (!isset($columnParams[$columnName]) || empty($columnParams[$columnName]['Type'])) { continue; } $query = null; switch ($fieldParams['type']) { case 'varchar': case 'text': case 'jsonObject': case 'jsonArray': /** @phpstan-ignore-next-line */ $query = "ALTER TABLE `".$tableName."` ". /** @phpstan-ignore-next-line */ "CHANGE COLUMN `". $columnName ."` `". $columnName ."` ". $columnParams[$columnName]['Type'] . /** @phpstan-ignore-next-line */ " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"; break; } if (!empty($query)) { $GLOBALS['log']->debug('Utf8mb4: execute the query - [' . $query . '].'); try { $sqlExecutor->execute($query); } 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(); } $this->getContainer()->get('dataManager')->rebuild(); } }