aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2023-07-19 23:19:35 +0200
committerJoas Schilling <coding@schilljs.com>2023-07-24 14:51:34 +0200
commit00d483585bf7bdfced0c78f35603266c628d683a (patch)
tree0eb6385126c480b67fe05d11649a2d5b633b6016
parentf73f14207c6c0792396a2cab92ff33b806500867 (diff)
downloadnextcloud-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.php18
-rw-r--r--lib/public/DB/Events/AddMissingIndicesEvent.php27
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;