From: Tim Düsterhus Date: Fri, 29 Jan 2021 15:02:09 +0000 (+0100) Subject: Merge branch '5.3' X-Git-Tag: 5.4.0_Alpha_1~333 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=1f1a489606508fe775f60c4126d44da7caa6c413;p=GitHub%2FWoltLab%2FWCF.git Merge branch '5.3' --- 1f1a489606508fe775f60c4126d44da7caa6c413 diff --cc wcfsetup/install/files/lib/system/database/table/DatabaseTable.class.php index 1cef00a24c,77aecdd6a1..e844b9b2c8 --- a/wcfsetup/install/files/lib/system/database/table/DatabaseTable.class.php +++ b/wcfsetup/install/files/lib/system/database/table/DatabaseTable.class.php @@@ -11,240 -9,218 +11,240 @@@ use wcf\system\database\table\index\Dat /** * PHP representation of an existing database table or the intended layout of an non-existing or * existing database table. - * - * @author Alexander Ebert, Matthias Schmidt - * @copyright 2001-2019 WoltLab GmbH - * @license GNU Lesser General Public License - * @package WoltLabSuite\Core\System\Database\Table - * @since 5.2 + * + * @author Alexander Ebert, Matthias Schmidt + * @copyright 2001-2019 WoltLab GmbH + * @license GNU Lesser General Public License + * @package WoltLabSuite\Core\System\Database\Table + * @since 5.2 */ -class DatabaseTable { - use TDroppableDatabaseComponent; - - /** - * intended database table's columns - * @var IDatabaseTableColumn[] - */ - protected $columns = []; - - /** - * intended database table's foreign keys - * @var DatabaseTableForeignKey[] - */ - protected $foreignKeys = []; - - /** - * intended database table's indices - * @var DatabaseTableIndex[] - */ - protected $indices = []; - - /** - * name of the database table - * @var string - */ - protected $name; - - /** - * Creates a new instance of `DatabaseTable`. - * - * @param string $name name of the database table - */ - protected function __construct($name) { - $this->name = ApplicationHandler::insertRealDatabaseTableNames($name); - } - - /** - * Sets the columns of the database table. - * - * @param IDatabaseTableColumn[] $columns added/dropped columns - * @return $this this database table - * @throws \InvalidArgumentException if any column is invalid or duplicate column names exist - */ - public function columns(array $columns) { - $this->columns = []; - foreach ($columns as $column) { - if (!($column instanceof IDatabaseTableColumn)) { - throw new \InvalidArgumentException("Added columns have to be instances of '" . IDatabaseTableColumn::class . "'."); - } - - if (isset($this->columns[$column->getName()])) { - throw new \InvalidArgumentException("Duplicate column with name '{$column->getName()}'."); - } - - $this->columns[$column->getName()] = $column; - } - - return $this; - } - - /** - * Sets the foreign keys of the database table. - * - * @param DatabaseTableForeignKey[] $foreignKeys added/dropped foreign keys - * @return $this this database table - * @throws \InvalidArgumentException if any foreign key is invalid or duplicate foreign key names exist - */ - public function foreignKeys(array $foreignKeys) { - $this->foreignKeys = []; - foreach ($foreignKeys as $foreignKey) { - if (!($foreignKey instanceof DatabaseTableForeignKey)) { - throw new \InvalidArgumentException("Added foreign keys have to be instances of '" . DatabaseTableForeignKey::class . "'."); - } - - if (empty($foreignKey->getColumns())) { - throw new \InvalidArgumentException("Missing columns for foreign key."); - } - - if ($foreignKey->getName() === '') { - $foreignKey->name(md5($this->getName() . '_' . $foreignKey->getColumns()[0]) . '_fk'); - } - - if (isset($this->foreignKeys[$foreignKey->getName()])) { - throw new \InvalidArgumentException("Duplicate foreign key with name '{$foreignKey->getName()}'."); - } - - if ($foreignKey->getOnDelete() === null && $foreignKey->getOnUpdate() === null) { - throw new \InvalidArgumentException("Missing action for foreign key '{$foreignKey->getName()}'."); - } - - $this->foreignKeys[$foreignKey->getName()] = $foreignKey; - } - - return $this; - } - - /** - * Returns the columns of the table. - * - * @return IDatabaseTableColumn[] - */ - public function getColumns() { - return $this->columns; - } - - /** - * Returns the foreign keys of the table. - * - * @return DatabaseTableForeignKey[] - */ - public function getForeignKeys() { - return $this->foreignKeys; - } - - /** - * Returns the indices of the table. - * - * @return DatabaseTableIndex[] - */ - public function getIndices() { - return $this->indices; - } - - /** - * Returns the name of the database table. - * - * @return string database table name - */ - public function getName() { - return $this->name; - } - - /** - * Returns a `DatabaseTable` object with the given name. - * - * @param string $tableName - * @return static - */ - public static function create($tableName) { - return new static($tableName); - } - - /** - * Returns a `DatabaseTable` object for an existing database table with the given name. - * - * @param DatabaseEditor $dbEditor - * @param string $tableName - * @return DatabaseTable - */ - public static function createFromExistingTable(DatabaseEditor $dbEditor, $tableName) { - $table = new static($tableName); - - $columns = []; - foreach ($dbEditor->getColumns($tableName) as $columnData) { - $className = 'wcf\system\database\table\column\\' . ucfirst(strtolower($columnData['data']['type'])) . 'DatabaseTableColumn'; - if (!class_exists($className)) { - throw new \InvalidArgumentException("Unknown database table column type '{$columnData['data']['type']}'."); - } - - $columns[$columnData['name']] = $className::createFromData($columnData['name'], $columnData['data']); - } - $table->columns($columns); - - $foreignKeys = []; - foreach ($dbEditor->getForeignKeys($tableName) as $foreignKeysName => $foreignKeyData) { - $foreignKeys[$foreignKeysName] = DatabaseTableForeignKey::createFromData($foreignKeysName, $foreignKeyData); - } - $table->foreignKeys($foreignKeys); - - $indices = []; - foreach ($dbEditor->getIndexInformation($tableName) as $indexName => $indexData) { - if (!isset($foreignKeys[$indexName])) { - $indices[$indexName] = DatabaseTableIndex::createFromData($indexName, $indexData); - } - } - $table->indices($indices); - - return $table; - } - - /** - * Sets the indices of the database table. - * - * @param DatabaseTableIndex[] $indices added/dropped indices - * @return $this this database table - * @throws \InvalidArgumentException if any index is invalid or duplicate index key names exist - */ - public function indices(array $indices) { - $this->indices = []; - foreach ($indices as $index) { - if (!($index instanceof DatabaseTableIndex)) { - throw new \InvalidArgumentException("Added indices have to be instances of '" . DatabaseTableIndex::class . "'."); - } - - if ($index->getName() === '') { - $index->generatedName(md5($this->getName() . '_' . $index->getColumns()[0])); - } - - if (isset($this->indices[$index->getName()])) { - throw new \InvalidArgumentException("Duplicate index with name '{$index->getName()}'."); - } - - $this->indices[$index->getName()] = $index; - } - - return $this; - } +class DatabaseTable +{ + use TDroppableDatabaseComponent; + + /** + * intended database table's columns + * @var IDatabaseTableColumn[] + */ + protected $columns = []; + + /** + * intended database table's foreign keys + * @var DatabaseTableForeignKey[] + */ + protected $foreignKeys = []; + + /** + * intended database table's indices + * @var DatabaseTableIndex[] + */ + protected $indices = []; + + /** + * name of the database table + * @var string + */ + protected $name; + + /** + * Creates a new instance of `DatabaseTable`. + * + * @param string $name name of the database table + */ + protected function __construct($name) + { + $this->name = ApplicationHandler::insertRealDatabaseTableNames($name); + } + + /** + * Sets the columns of the database table. + * + * @param IDatabaseTableColumn[] $columns added/dropped columns + * @return $this this database table + * @throws \InvalidArgumentException if any column is invalid or duplicate column names exist + */ + public function columns(array $columns) + { + $this->columns = []; + foreach ($columns as $column) { + if (!($column instanceof IDatabaseTableColumn)) { + throw new \InvalidArgumentException( + "Added columns have to be instances of '" . IDatabaseTableColumn::class . "'." + ); + } + + if (isset($this->columns[$column->getName()])) { + throw new \InvalidArgumentException("Duplicate column with name '{$column->getName()}'."); + } + + $this->columns[$column->getName()] = $column; + } + + return $this; + } + + /** + * Sets the foreign keys of the database table. + * + * @param DatabaseTableForeignKey[] $foreignKeys added/dropped foreign keys + * @return $this this database table + * @throws \InvalidArgumentException if any foreign key is invalid or duplicate foreign key names exist + */ + public function foreignKeys(array $foreignKeys) + { + $this->foreignKeys = []; + foreach ($foreignKeys as $foreignKey) { + if (!($foreignKey instanceof DatabaseTableForeignKey)) { + throw new \InvalidArgumentException( + "Added foreign keys have to be instances of '" . DatabaseTableForeignKey::class . "'." + ); + } + + if (empty($foreignKey->getColumns())) { + throw new \InvalidArgumentException("Missing columns for foreign key."); + } + + if ($foreignKey->getName() === '') { + $foreignKey->name(\md5($this->getName() . '_' . $foreignKey->getColumns()[0]) . '_fk'); + } + + if (isset($this->foreignKeys[$foreignKey->getName()])) { + throw new \InvalidArgumentException("Duplicate foreign key with name '{$foreignKey->getName()}'."); + } + + if ($foreignKey->getOnDelete() === null && $foreignKey->getOnUpdate() === null) { + throw new \InvalidArgumentException("Missing action for foreign key '{$foreignKey->getName()}'."); + } + + $this->foreignKeys[$foreignKey->getName()] = $foreignKey; + } + + return $this; + } + + /** + * Returns the columns of the table. + * + * @return IDatabaseTableColumn[] + */ + public function getColumns() + { + return $this->columns; + } + + /** + * Returns the foreign keys of the table. + * + * @return DatabaseTableForeignKey[] + */ + public function getForeignKeys() + { + return $this->foreignKeys; + } + + /** + * Returns the indices of the table. + * + * @return DatabaseTableIndex[] + */ + public function getIndices() + { + return $this->indices; + } + + /** + * Returns the name of the database table. + * + * @return string database table name + */ + public function getName() + { + return $this->name; + } + + /** + * Returns a `DatabaseTable` object with the given name. + * + * @param string $tableName + * @return static + */ + public static function create($tableName) + { + return new static($tableName); + } + + /** + * Returns a `DatabaseTable` object for an existing database table with the given name. + * + * @param DatabaseEditor $dbEditor + * @param string $tableName + * @return DatabaseTable + */ + public static function createFromExistingTable(DatabaseEditor $dbEditor, $tableName) + { + $table = new static($tableName); + + $columns = []; + foreach ($dbEditor->getColumns($tableName) as $columnData) { + $className = 'wcf\system\database\table\column\\' . \ucfirst(\strtolower($columnData['data']['type'])) . 'DatabaseTableColumn'; + if (!\class_exists($className)) { + throw new \InvalidArgumentException( + "Unknown database table column type '{$columnData['data']['type']}'." + ); + } + + $columns[$columnData['name']] = $className::createFromData($columnData['name'], $columnData['data']); + } + $table->columns($columns); + + $foreignKeys = []; + foreach ($dbEditor->getForeignKeys($tableName) as $foreignKeysName => $foreignKeyData) { + $foreignKeys[$foreignKeysName] = DatabaseTableForeignKey::createFromData( + $foreignKeysName, + $foreignKeyData + ); + } + $table->foreignKeys($foreignKeys); + + $indices = []; + foreach ($dbEditor->getIndexInformation($tableName) as $indexName => $indexData) { + if (!isset($foreignKeys[$indexName])) { + $indices[$indexName] = DatabaseTableIndex::createFromData($indexName, $indexData); + } + } + $table->indices($indices); + + return $table; + } + + /** + * Sets the indices of the database table. + * + * @param DatabaseTableIndex[] $indices added/dropped indices + * @return $this this database table + * @throws \InvalidArgumentException if any index is invalid or duplicate index key names exist + */ + public function indices(array $indices) + { + $this->indices = []; + foreach ($indices as $index) { + if (!($index instanceof DatabaseTableIndex)) { + throw new \InvalidArgumentException( + "Added indices have to be instances of '" . DatabaseTableIndex::class . "'." + ); + } + + if ($index->getName() === '') { + $index->generatedName(\md5($this->getName() . '_' . $index->getColumns()[0])); + } + - if (isset($this->foreignKeys[$index->getName()])) { ++ if (isset($this->indices[$index->getName()])) { + throw new \InvalidArgumentException("Duplicate index with name '{$index->getName()}'."); + } + + $this->indices[$index->getName()] = $index; + } + + return $this; + } }