diff options
Diffstat (limited to 'core/Command/Db/AddMissingIndices.php')
-rw-r--r-- | core/Command/Db/AddMissingIndices.php | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index f0b4c14e15c..1044cea5547 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -36,6 +36,8 @@ namespace OC\Core\Command\Db; use Doctrine\DBAL\Platforms\PostgreSQL94Platform; use OC\DB\Connection; use OC\DB\SchemaWrapper; +use OCP\DB\Events\AddMissingIndicesEvent; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IDBConnection; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputOption; @@ -54,12 +56,14 @@ use Symfony\Component\EventDispatcher\GenericEvent; */ class AddMissingIndices extends Command { private Connection $connection; + private IEventDispatcher $eventDispatcher; private EventDispatcherInterface $dispatcher; - public function __construct(Connection $connection, EventDispatcherInterface $dispatcher) { + public function __construct(Connection $connection, IEventDispatcher $eventDispatcher, EventDispatcherInterface $dispatcher) { parent::__construct(); $this->connection = $connection; + $this->eventDispatcher = $eventDispatcher; $this->dispatcher = $dispatcher; } @@ -71,11 +75,37 @@ class AddMissingIndices extends Command { } protected function execute(InputInterface $input, OutputInterface $output): int { - $this->addCoreIndexes($output, $input->getOption('dry-run')); + $dryRun = $input->getOption('dry-run'); + + $this->addCoreIndexes($output, $dryRun); // Dispatch event so apps can also update indexes if needed $event = new GenericEvent($output); $this->dispatcher->dispatch(IDBConnection::ADD_MISSING_INDEXES_EVENT, $event); + + $event = new AddMissingIndicesEvent(); + $this->eventDispatcher->dispatchTyped($event); + + $missingIndices = $event->getMissingIndices(); + if ($missingIndices !== []) { + $schema = new SchemaWrapper($this->connection); + + foreach ($missingIndices as $missingIndex) { + if ($schema->hasTable($missingIndex['tableName'])) { + $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']); + $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); + if ($dryRun && $sqlQueries !== null) { + $output->writeln($sqlQueries); + } + $output->writeln('<info>' . $table->getName() . ' table updated successfully.</info>'); + } + } + } + } + return 0; } |