aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2023-07-14 10:34:09 +0200
committerJulius Härtl <jus@bitgrid.net>2023-07-14 16:29:37 +0200
commit18db96c304c2b2d93c3effc2c1d5b9320fe78ce1 (patch)
tree18696f94169845386bbd3d27f95cbf175458b75f /core
parent2a18283b824a4b9271d3903c5d5432786846051e (diff)
downloadnextcloud-server-18db96c304c2b2d93c3effc2c1d5b9320fe78ce1.tar.gz
nextcloud-server-18db96c304c2b2d93c3effc2c1d5b9320fe78ce1.zip
feat: Add public event for missing indices
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'core')
-rw-r--r--core/Command/Db/AddMissingIndices.php34
-rw-r--r--core/register_command.php2
2 files changed, 33 insertions, 3 deletions
diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php
index 452bcbad5dc..3a680921777 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;
}
diff --git a/core/register_command.php b/core/register_command.php
index 8f600d7b894..32cd4099618 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -109,7 +109,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig())));
$application->add(new OC\Core\Command\Db\ConvertMysqlToMB4(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection(), \OC::$server->getURLGenerator(), \OC::$server->get(LoggerInterface::class)));
$application->add(new OC\Core\Command\Db\ConvertFilecacheBigInt(\OC::$server->get(\OC\DB\Connection::class)));
- $application->add(new OC\Core\Command\Db\AddMissingIndices(\OC::$server->get(\OC\DB\Connection::class), \OC::$server->getEventDispatcher()));
+ $application->add(\OCP\Server::get(\OC\Core\Command\Db\AddMissingIndices::class));
$application->add(new OC\Core\Command\Db\AddMissingColumns(\OC::$server->get(\OC\DB\Connection::class), \OC::$server->getEventDispatcher()));
$application->add(new OC\Core\Command\Db\AddMissingPrimaryKeys(\OC::$server->get(\OC\DB\Connection::class), \OC::$server->getEventDispatcher()));