/** * Get COLLATION, ROW_FORMAT, COMMENT and ENGINE table options on MySQL connections. * * @param string[] $tableNames * @return array[] * @throws \InvalidArgumentException */ protected function getTableOptions(array $tableNames) : array { $tableOptions = []; if (strpos($this->connection->getServerVersion(), 'MySQL') !== 0) { foreach ($tableNames as $tableName) { $tableOptions[$tableName] = []; } return $tableOptions; } $queryBuilder = $this->connection->createQueryBuilder(); $result = $queryBuilder->select('TABLE_NAME AS table', 'ENGINE AS engine', 'ROW_FORMAT AS row_format', 'TABLE_COLLATION AS collate', 'TABLE_COMMENT AS comment')->from('information_schema.TABLES')->where($queryBuilder->expr()->eq('TABLE_TYPE', $queryBuilder->createNamedParameter('BASE TABLE', \PDO::PARAM_STR)), $queryBuilder->expr()->eq('TABLE_SCHEMA', $queryBuilder->createNamedParameter($this->connection->getDatabase(), \PDO::PARAM_STR)))->execute(); while ($row = $result->fetch()) { $index = $row['table']; unset($row['table']); $tableOptions[$index] = $row; } return $tableOptions; }
/** * @test */ public function createQueryBuilderReturnsInstanceOfTypo3QueryBuilder() { $this->assertInstanceOf(QueryBuilder::class, $this->connection->createQueryBuilder()); }
/** * Checks the character set of the database and reports an error if it is not utf-8. * * @param Connection $connection to the database to be checked * @return Status\StatusInterface */ protected function checkMysqlDatabaseUtf8Status(Connection $connection) { /** @var QueryBuilder $queryBuilder */ $queryBuilder = $connection->createQueryBuilder(); $defaultDatabaseCharset = (string) $queryBuilder->select('DEFAULT_CHARACTER_SET_NAME')->from('information_schema.SCHEMATA')->where($queryBuilder->expr()->eq('SCHEMA_NAME', $queryBuilder->createNamedParameter($connection->getDatabase(), \PDO::PARAM_STR)))->setMaxResults(1)->execute()->fetchColumn(); // also allow utf8mb4 if (strpos($defaultDatabaseCharset, 'utf8') !== 0) { $status = new Status\ErrorStatus(); $status->setTitle('MySQL database character set check failed'); $status->setMessage('Checking database character set failed, got key "' . $defaultDatabaseCharset . '" instead of "utf8" or "utf8mb4"'); } else { $status = new Status\OkStatus(); $status->setTitle('Your database uses utf-8. All good.'); } return $status; }