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('Adding additional ' . $missingIndex['indexName'] . ' index to the ' . $table->getName() . ' table, this can take some time...'); - $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 * @copyright Copyright (c) 2023 Julius Härtl * + * @author Joas Schilling * @author Julius Härtl * * @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 */ + /** @var array */ 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 + * @return array */ public function getMissingIndices(): array { return $this->missingIndices;