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;