diff options
author | Joas Schilling <coding@schilljs.com> | 2023-07-19 23:19:35 +0200 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2023-07-24 14:51:34 +0200 |
commit | 00d483585bf7bdfced0c78f35603266c628d683a (patch) | |
tree | 0eb6385126c480b67fe05d11649a2d5b633b6016 | |
parent | f73f14207c6c0792396a2cab92ff33b806500867 (diff) | |
download | nextcloud-server-00d483585bf7bdfced0c78f35603266c628d683a.tar.gz nextcloud-server-00d483585bf7bdfced0c78f35603266c628d683a.zip |
fix: Add options to support all used features by core
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r-- | core/Command/Db/AddMissingIndices.php | 18 | ||||
-rw-r--r-- | lib/public/DB/Events/AddMissingIndicesEvent.php | 27 |
2 files changed, 40 insertions, 5 deletions
diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index dee9796a569..6c22557e3ff 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -91,7 +91,23 @@ class AddMissingIndices extends Command { $table = $schema->getTable($missingIndex['tableName']); if (!$table->hasIndex($missingIndex['indexName'])) { $output->writeln('<info>Adding additional ' . $missingIndex['indexName'] . ' index to the ' . $table->getName() . ' table, this can take some time...</info>'); - $table->addIndex($missingIndex['columns'], $missingIndex['indexName']); + + if ($missingIndex['dropUnnamedIndex']) { + foreach ($table->getIndexes() as $index) { + $columns = $index->getColumns(); + if ($columns === $missingIndex['columns']) { + $table->dropIndex($index->getName()); + } + } + } + + if ($missingIndex['uniqueIndex']) { + $table->addUniqueIndex($missingIndex['columns'], $missingIndex['indexName'], $missingIndex['options']); + } else { + $table->addIndex($missingIndex['columns'], $missingIndex['indexName'], [], $missingIndex['options']); + } + + $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); if ($dryRun && $sqlQueries !== null) { $output->writeln($sqlQueries); diff --git a/lib/public/DB/Events/AddMissingIndicesEvent.php b/lib/public/DB/Events/AddMissingIndicesEvent.php index 58ba6b34a59..dc942f3d63e 100644 --- a/lib/public/DB/Events/AddMissingIndicesEvent.php +++ b/lib/public/DB/Events/AddMissingIndicesEvent.php @@ -2,8 +2,10 @@ declare(strict_types=1); /** + * @copyright Copyright (c) 2023 Joas Schilling <coding@schilljs.com> * @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net> * + * @author Joas Schilling <coding@schilljs.com> * @author Julius Härtl <jus@bitgrid.net> * * @license GNU AGPL version 3 or any later version @@ -34,24 +36,41 @@ namespace OCP\DB\Events; * @since 28.0.0 */ class AddMissingIndicesEvent extends \OCP\EventDispatcher\Event { - /** @var array<array-key, array{tableName: string, indexName: string, columns: string[]}> */ + /** @var array<array-key, array{tableName: string, indexName: string, columns: string[], options: array{}, dropUnnamedIndex: bool, uniqueIndex: bool}> */ private array $missingIndices = []; /** * @param string[] $columns * @since 28.0.0 */ - public function addMissingIndex(string $tableName, string $indexName, array $columns): void { + public function addMissingIndex(string $tableName, string $indexName, array $columns, array $options = [], bool $dropUnnamedIndex = false): void { $this->missingIndices[] = [ 'tableName' => $tableName, 'indexName' => $indexName, - 'columns' => $columns + 'columns' => $columns, + 'options' => $options, + 'dropUnnamedIndex' => $dropUnnamedIndex, + 'uniqueIndex' => false, + ]; + } + /** + * @param string[] $columns + * @since 28.0.0 + */ + public function addMissingUniqueIndex(string $tableName, string $indexName, array $columns, array $options = [], bool $dropUnnamedIndex = false): void { + $this->missingIndices[] = [ + 'tableName' => $tableName, + 'indexName' => $indexName, + 'columns' => $columns, + 'options' => $options, + 'dropUnnamedIndex' => $dropUnnamedIndex, + 'uniqueIndex' => true, ]; } /** * @since 28.0.0 - * @return array<array-key, array{tableName: string, indexName: string, columns: string[]}> + * @return array<array-key, array{tableName: string, indexName: string, columns: string[], options: array{}, dropUnnamedIndex: bool, uniqueIndex: bool}> */ public function getMissingIndices(): array { return $this->missingIndices; |