From 05e38eadbeb3de19e5b26003c2b401e00bb71df4 Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 18 Oct 2026 00:08:23 +0200 Subject: =?UTF-8?q?sortie=20de=20vendor=20du=20d=C3=A9p=C3=B4t,=20oubli=20?= =?UTF-8?q?dans=20config-template.ini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbal/src/Schema/MySQLSchemaManager.php | 548 --------------------- 1 file changed, 548 deletions(-) delete mode 100644 vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php (limited to 'vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php') diff --git a/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php b/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php deleted file mode 100644 index 249be13..0000000 --- a/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php +++ /dev/null @@ -1,548 +0,0 @@ - - */ -class MySQLSchemaManager extends AbstractSchemaManager -{ - /** @see https://mariadb.com/kb/en/library/string-literals/#escape-sequences */ - private const MARIADB_ESCAPE_SEQUENCES = [ - '\\0' => "\0", - "\\'" => "'", - '\\"' => '"', - '\\b' => "\b", - '\\n' => "\n", - '\\r' => "\r", - '\\t' => "\t", - '\\Z' => "\x1a", - '\\\\' => '\\', - '\\%' => '%', - '\\_' => '_', - - // Internally, MariaDB escapes single quotes using the standard syntax - "''" => "'", - ]; - - private ?DefaultTableOptions $defaultTableOptions = null; - - /** - * {@inheritDoc} - */ - protected function _getPortableTableDefinition(array $table): string - { - return $table['TABLE_NAME']; - } - - /** - * {@inheritDoc} - */ - protected function _getPortableViewDefinition(array $view): View - { - return new View($view['TABLE_NAME'], $view['VIEW_DEFINITION']); - } - - /** - * {@inheritDoc} - */ - protected function _getPortableTableIndexesList(array $tableIndexes, string $tableName): array - { - foreach ($tableIndexes as $k => $v) { - $v = array_change_key_case($v, CASE_LOWER); - if ($v['key_name'] === 'PRIMARY') { - $v['primary'] = true; - } else { - $v['primary'] = false; - } - - if (str_contains($v['index_type'], 'FULLTEXT')) { - $v['flags'] = ['FULLTEXT']; - } elseif (str_contains($v['index_type'], 'SPATIAL')) { - $v['flags'] = ['SPATIAL']; - } - - // Ignore prohibited prefix `length` for spatial index - if (! str_contains($v['index_type'], 'SPATIAL')) { - $v['length'] = isset($v['sub_part']) ? (int) $v['sub_part'] : null; - } - - $tableIndexes[$k] = $v; - } - - return parent::_getPortableTableIndexesList($tableIndexes, $tableName); - } - - /** - * {@inheritDoc} - */ - protected function _getPortableDatabaseDefinition(array $database): string - { - return $database['Database']; - } - - /** - * {@inheritDoc} - */ - protected function _getPortableTableColumnDefinition(array $tableColumn): Column - { - $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); - - $dbType = strtolower($tableColumn['type']); - $dbType = strtok($dbType, '(), '); - assert(is_string($dbType)); - - $length = $tableColumn['length'] ?? strtok('(), '); - - $fixed = false; - - if (! isset($tableColumn['name'])) { - $tableColumn['name'] = ''; - } - - $scale = 0; - $precision = null; - - $type = $this->platform->getDoctrineTypeMapping($dbType); - - switch ($dbType) { - case 'char': - case 'binary': - $fixed = true; - break; - - case 'float': - case 'double': - case 'real': - case 'numeric': - case 'decimal': - if ( - preg_match( - '([A-Za-z]+\(([0-9]+),([0-9]+)\))', - $tableColumn['type'], - $match, - ) === 1 - ) { - $precision = (int) $match[1]; - $scale = (int) $match[2]; - $length = null; - } - - break; - - case 'tinytext': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_TINYTEXT; - break; - - case 'text': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_TEXT; - break; - - case 'mediumtext': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMTEXT; - break; - - case 'tinyblob': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_TINYBLOB; - break; - - case 'blob': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_BLOB; - break; - - case 'mediumblob': - $length = AbstractMySQLPlatform::LENGTH_LIMIT_MEDIUMBLOB; - break; - - case 'tinyint': - case 'smallint': - case 'mediumint': - case 'int': - case 'integer': - case 'bigint': - case 'year': - $length = null; - break; - } - - if ($this->platform instanceof MariaDBPlatform) { - $columnDefault = $this->getMariaDBColumnDefault($this->platform, $tableColumn['default']); - } else { - $columnDefault = $tableColumn['default']; - } - - $options = [ - 'length' => $length !== null ? (int) $length : null, - 'unsigned' => str_contains($tableColumn['type'], 'unsigned'), - 'fixed' => $fixed, - 'default' => $columnDefault, - 'notnull' => $tableColumn['null'] !== 'YES', - 'scale' => $scale, - 'precision' => $precision, - 'autoincrement' => str_contains($tableColumn['extra'], 'auto_increment'), - ]; - - if (isset($tableColumn['comment'])) { - $options['comment'] = $tableColumn['comment']; - } - - $column = new Column($tableColumn['field'], Type::getType($type), $options); - - if (isset($tableColumn['characterset'])) { - $column->setPlatformOption('charset', $tableColumn['characterset']); - } - - if (isset($tableColumn['collation'])) { - $column->setPlatformOption('collation', $tableColumn['collation']); - } - - return $column; - } - - /** - * Return Doctrine/Mysql-compatible column default values for MariaDB 10.2.7+ servers. - * - * - Since MariaDb 10.2.7 column defaults stored in information_schema are now quoted - * to distinguish them from expressions (see MDEV-10134). - * - CURRENT_TIMESTAMP, CURRENT_TIME, CURRENT_DATE are stored in information_schema - * as current_timestamp(), currdate(), currtime() - * - Quoted 'NULL' is not enforced by Maria, it is technically possible to have - * null in some circumstances (see https://jira.mariadb.org/browse/MDEV-14053) - * - \' is always stored as '' in information_schema (normalized) - * - * @link https://mariadb.com/kb/en/library/information-schema-columns-table/ - * @link https://jira.mariadb.org/browse/MDEV-13132 - * - * @param string|null $columnDefault default value as stored in information_schema for MariaDB >= 10.2.7 - */ - private function getMariaDBColumnDefault(MariaDBPlatform $platform, ?string $columnDefault): ?string - { - if ($columnDefault === 'NULL' || $columnDefault === null) { - return null; - } - - if (preg_match('/^\'(.*)\'$/', $columnDefault, $matches) === 1) { - return strtr($matches[1], self::MARIADB_ESCAPE_SEQUENCES); - } - - return match ($columnDefault) { - 'current_timestamp()' => $platform->getCurrentTimestampSQL(), - 'curdate()' => $platform->getCurrentDateSQL(), - 'curtime()' => $platform->getCurrentTimeSQL(), - default => $columnDefault, - }; - } - - /** - * {@inheritDoc} - */ - protected function _getPortableTableForeignKeysList(array $tableForeignKeys): array - { - $list = []; - foreach ($tableForeignKeys as $value) { - $value = array_change_key_case($value, CASE_LOWER); - if (! isset($list[$value['constraint_name']])) { - if (! isset($value['delete_rule']) || $value['delete_rule'] === 'RESTRICT') { - $value['delete_rule'] = null; - } - - if (! isset($value['update_rule']) || $value['update_rule'] === 'RESTRICT') { - $value['update_rule'] = null; - } - - $list[$value['constraint_name']] = [ - 'name' => $value['constraint_name'], - 'local' => [], - 'foreign' => [], - 'foreignTable' => $value['referenced_table_name'], - 'onDelete' => $value['delete_rule'], - 'onUpdate' => $value['update_rule'], - ]; - } - - $list[$value['constraint_name']]['local'][] = $value['column_name']; - $list[$value['constraint_name']]['foreign'][] = $value['referenced_column_name']; - } - - return parent::_getPortableTableForeignKeysList($list); - } - - /** - * {@inheritDoc} - */ - protected function _getPortableTableForeignKeyDefinition(array $tableForeignKey): ForeignKeyConstraint - { - return new ForeignKeyConstraint( - $tableForeignKey['local'], - $tableForeignKey['foreignTable'], - $tableForeignKey['foreign'], - $tableForeignKey['name'], - [ - 'onDelete' => $tableForeignKey['onDelete'], - 'onUpdate' => $tableForeignKey['onUpdate'], - ], - ); - } - - /** @throws Exception */ - public function createComparator(): Comparator - { - return new MySQL\Comparator( - $this->platform, - new CachingCharsetMetadataProvider( - new ConnectionCharsetMetadataProvider($this->connection), - ), - new CachingCollationMetadataProvider( - new ConnectionCollationMetadataProvider($this->connection), - ), - $this->getDefaultTableOptions(), - ); - } - - protected function selectTableNames(string $databaseName): Result - { - $sql = <<<'SQL' -SELECT TABLE_NAME -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = ? - AND TABLE_TYPE = 'BASE TABLE' -ORDER BY TABLE_NAME -SQL; - - return $this->connection->executeQuery($sql, [$databaseName]); - } - - protected function selectTableColumns(string $databaseName, ?string $tableName = null): Result - { - $columnTypeSQL = $this->platform->getColumnTypeSQLSnippet('c', $databaseName); - - $sql = 'SELECT'; - - if ($tableName === null) { - $sql .= ' c.TABLE_NAME,'; - } - - $sql .= <<connection->executeQuery($sql, $params); - } - - protected function selectIndexColumns(string $databaseName, ?string $tableName = null): Result - { - $sql = 'SELECT'; - - if ($tableName === null) { - $sql .= ' TABLE_NAME,'; - } - - $sql .= <<<'SQL' - NON_UNIQUE AS Non_Unique, - INDEX_NAME AS Key_name, - COLUMN_NAME AS Column_Name, - SUB_PART AS Sub_Part, - INDEX_TYPE AS Index_Type -FROM information_schema.STATISTICS -SQL; - - $conditions = ['TABLE_SCHEMA = ?']; - $params = [$databaseName]; - - if ($tableName !== null) { - $conditions[] = 'TABLE_NAME = ?'; - $params[] = $tableName; - } - - $sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY SEQ_IN_INDEX'; - - return $this->connection->executeQuery($sql, $params); - } - - protected function selectForeignKeyColumns(string $databaseName, ?string $tableName = null): Result - { - $sql = 'SELECT DISTINCT'; - - if ($tableName === null) { - $sql .= ' k.TABLE_NAME,'; - } - - $sql .= <<<'SQL' - k.CONSTRAINT_NAME, - k.COLUMN_NAME, - k.REFERENCED_TABLE_NAME, - k.REFERENCED_COLUMN_NAME, - k.ORDINAL_POSITION, - c.UPDATE_RULE, - c.DELETE_RULE -FROM information_schema.key_column_usage k -INNER JOIN information_schema.referential_constraints c -ON c.CONSTRAINT_NAME = k.CONSTRAINT_NAME -AND c.TABLE_NAME = k.TABLE_NAME -SQL; - - $conditions = ['k.TABLE_SCHEMA = ?']; - $params = [$databaseName]; - - if ($tableName !== null) { - $conditions[] = 'k.TABLE_NAME = ?'; - $params[] = $tableName; - } - - // The schema name is passed multiple times in the WHERE clause instead of using a JOIN condition - // in order to avoid performance issues on MySQL older than 8.0 and the corresponding MariaDB versions - // caused by https://bugs.mysql.com/bug.php?id=81347 - $conditions[] = 'c.CONSTRAINT_SCHEMA = ?'; - $params[] = $databaseName; - - $conditions[] = 'k.REFERENCED_COLUMN_NAME IS NOT NULL'; - - $sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY k.ORDINAL_POSITION'; - - return $this->connection->executeQuery($sql, $params); - } - - /** - * {@inheritDoc} - */ - protected function fetchTableOptionsByTable(string $databaseName, ?string $tableName = null): array - { - // MariaDB-10.10.1 added FULL_COLLATION_NAME to the information_schema.COLLATION_CHARACTER_SET_APPLICABILITY. - // A base collation like uca1400_ai_ci can refer to multiple character sets. The value in the - // information_schema.TABLES.TABLE_COLLATION corresponds to the full collation name. - // The MariaDB executable comment syntax with version, /*M!101001, is exclusively executed on - // MariaDB-10.10.1+ servers for backwards compatibility, and compatiblity to MySQL servers. - $sql = <<<'SQL' - SELECT t.TABLE_NAME, - t.ENGINE, - t.AUTO_INCREMENT, - t.TABLE_COMMENT, - t.CREATE_OPTIONS, - t.TABLE_COLLATION, - ccsa.CHARACTER_SET_NAME - FROM information_schema.TABLES t - INNER JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY ccsa - ON /*M!101001 ccsa.FULL_COLLATION_NAME = t.TABLE_COLLATION OR */ - ccsa.COLLATION_NAME = t.TABLE_COLLATION -SQL; - - $conditions = ['t.TABLE_SCHEMA = ?']; - $params = [$databaseName]; - - if ($tableName !== null) { - $conditions[] = 't.TABLE_NAME = ?'; - $params[] = $tableName; - } - - $conditions[] = "t.TABLE_TYPE = 'BASE TABLE'"; - - $sql .= ' WHERE ' . implode(' AND ', $conditions); - - /** @var array> $metadata */ - $metadata = $this->connection->executeQuery($sql, $params) - ->fetchAllAssociativeIndexed(); - - $tableOptions = []; - foreach ($metadata as $table => $data) { - $data = array_change_key_case($data, CASE_LOWER); - - $tableOptions[$table] = [ - 'engine' => $data['engine'], - 'collation' => $data['table_collation'], - 'charset' => $data['character_set_name'], - 'autoincrement' => $data['auto_increment'], - 'comment' => $data['table_comment'], - 'create_options' => $this->parseCreateOptions($data['create_options']), - ]; - } - - return $tableOptions; - } - - /** @return array|array */ - private function parseCreateOptions(?string $string): array - { - $options = []; - - if ($string === null || $string === '') { - return $options; - } - - foreach (explode(' ', $string) as $pair) { - $parts = explode('=', $pair, 2); - - $options[$parts[0]] = $parts[1] ?? true; - } - - return $options; - } - - /** @throws Exception */ - private function getDefaultTableOptions(): DefaultTableOptions - { - if ($this->defaultTableOptions === null) { - $row = $this->connection->fetchNumeric( - 'SELECT @@character_set_database, @@collation_database', - ); - - assert($row !== false); - - $this->defaultTableOptions = new DefaultTableOptions(...$row); - } - - return $this->defaultTableOptions; - } -} -- cgit v1.2.3