]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(db): Move missing core primary keys to typed event
authorJoas Schilling <coding@schilljs.com>
Wed, 19 Jul 2023 21:10:13 +0000 (23:10 +0200)
committerJoas Schilling <coding@schilljs.com>
Mon, 24 Jul 2023 12:51:33 +0000 (14:51 +0200)
Signed-off-by: Joas Schilling <coding@schilljs.com>
core/Application.php
core/Command/Db/AddMissingPrimaryKeys.php
core/register_command.php

index 592e092966681e0068e78f26c6be034c32120a23..d6f0f9599640e90cdddfda0e3e472551e3e93464 100644 (file)
@@ -54,6 +54,7 @@ use OC\Metadata\FileEventListener;
 use OC\TagManager;
 use OCP\AppFramework\App;
 use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
+use OCP\DB\Events\AddMissingPrimaryKeyEvent;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\Events\Node\NodeDeletedEvent;
 use OCP\Files\Events\Node\NodeWrittenEvent;
@@ -253,62 +254,49 @@ class Application extends App {
                        }
                );
 
-               $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_PRIMARY_KEYS_EVENT,
-                       function (GenericEvent $event) use ($container) {
-                               /** @var MissingPrimaryKeyInformation $subject */
-                               $subject = $event->getSubject();
-
-                               $schema = new SchemaWrapper($container->query(Connection::class));
-
-                               if ($schema->hasTable('federated_reshares')) {
-                                       $table = $schema->getTable('federated_reshares');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-
-                               if ($schema->hasTable('systemtag_object_mapping')) {
-                                       $table = $schema->getTable('systemtag_object_mapping');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-
-                               if ($schema->hasTable('comments_read_markers')) {
-                                       $table = $schema->getTable('comments_read_markers');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-
-                               if ($schema->hasTable('collres_resources')) {
-                                       $table = $schema->getTable('collres_resources');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-
-                               if ($schema->hasTable('collres_accesscache')) {
-                                       $table = $schema->getTable('collres_accesscache');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-
-                               if ($schema->hasTable('filecache_extended')) {
-                                       $table = $schema->getTable('filecache_extended');
-
-                                       if (!$table->hasPrimaryKey()) {
-                                               $subject->addHintForMissingSubject($table->getName());
-                                       }
-                               }
-                       }
-               );
+               $eventDispatcher->addListener(AddMissingPrimaryKeyEvent::class, function (AddMissingPrimaryKeyEvent $event) {
+                       $event->addMissingPrimaryKey(
+                               'federated_reshares',
+                               'federated_res_pk',
+                               ['share_id'],
+                               'share_id_index'
+                       );
+
+                       $event->addMissingPrimaryKey(
+                               'systemtag_object_mapping',
+                               'som_pk',
+                               ['objecttype', 'objectid', 'systemtagid'],
+                               'mapping'
+                       );
+
+                       $event->addMissingPrimaryKey(
+                               'comments_read_markers',
+                               'crm_pk',
+                               ['user_id', 'object_type', 'object_id'],
+                               'comments_marker_index'
+                       );
+
+                       $event->addMissingPrimaryKey(
+                               'collres_resources',
+                               'crr_pk',
+                               ['collection_id', 'resource_type', 'resource_id'],
+                               'collres_unique_res'
+                       );
+
+                       $event->addMissingPrimaryKey(
+                               'collres_accesscache',
+                               'cra_pk',
+                               ['user_id', 'collection_id', 'resource_type', 'resource_id'],
+                               'collres_unique_user'
+                       );
+
+                       $event->addMissingPrimaryKey(
+                               'filecache_extended',
+                               'fce_pk',
+                               ['fileid'],
+                               'fce_fileid_idx'
+                       );
+               });
 
                $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_COLUMNS_EVENT,
                        function (GenericEvent $event) use ($container) {
index 6ace85d785b44536f3ca44fd3e2306f4883fb57a..b7435144933ad6c21d4e228a88a9a64b3d894181 100644 (file)
@@ -67,8 +67,6 @@ class AddMissingPrimaryKeys extends Command {
        protected function execute(InputInterface $input, OutputInterface $output): int {
                $dryRun = $input->getOption('dry-run');
 
-               $updated = $this->addCorePrimaryKeys($output, $dryRun);
-
                // Dispatch event so apps can also update indexes if needed
                $event = new GenericEvent($output);
                $this->legacyDispatcher->dispatch(IDBConnection::ADD_MISSING_PRIMARY_KEYS_EVENT, $event);
@@ -76,6 +74,7 @@ class AddMissingPrimaryKeys extends Command {
                $event = new AddMissingPrimaryKeyEvent();
                $this->dispatcher->dispatchTyped($event);
                $missingKeys = $event->getMissingPrimaryKeys();
+               $updated = false;
 
                if (!empty($missingKeys)) {
                        $schema = new SchemaWrapper($this->connection);
@@ -109,123 +108,4 @@ class AddMissingPrimaryKeys extends Command {
 
                return 0;
        }
-
-       /**
-        * add missing indices to the share table
-        *
-        * @param OutputInterface $output
-        * @param bool $dryRun If true, will return the sql queries instead of running them.
-        * @return bool True when the schema changed
-        * @throws \Doctrine\DBAL\Schema\SchemaException
-        */
-       private function addCorePrimaryKeys(OutputInterface $output, bool $dryRun): bool {
-               $output->writeln('<info>Check primary keys.</info>');
-
-               $schema = new SchemaWrapper($this->connection);
-               $updated = false;
-
-               if ($schema->hasTable('federated_reshares')) {
-                       $table = $schema->getTable('federated_reshares');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the federated_reshares table, this can take some time...</info>');
-                               $table->setPrimaryKey(['share_id'], 'federated_res_pk');
-                               if ($table->hasIndex('share_id_index')) {
-                                       $table->dropIndex('share_id_index');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>federated_reshares table updated successfully.</info>');
-                       }
-               }
-
-               if ($schema->hasTable('systemtag_object_mapping')) {
-                       $table = $schema->getTable('systemtag_object_mapping');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the systemtag_object_mapping table, this can take some time...</info>');
-                               $table->setPrimaryKey(['objecttype', 'objectid', 'systemtagid'], 'som_pk');
-                               if ($table->hasIndex('mapping')) {
-                                       $table->dropIndex('mapping');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>systemtag_object_mapping table updated successfully.</info>');
-                       }
-               }
-
-               if ($schema->hasTable('comments_read_markers')) {
-                       $table = $schema->getTable('comments_read_markers');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the comments_read_markers table, this can take some time...</info>');
-                               $table->setPrimaryKey(['user_id', 'object_type', 'object_id'], 'crm_pk');
-                               if ($table->hasIndex('comments_marker_index')) {
-                                       $table->dropIndex('comments_marker_index');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>comments_read_markers table updated successfully.</info>');
-                       }
-               }
-
-               if ($schema->hasTable('collres_resources')) {
-                       $table = $schema->getTable('collres_resources');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the collres_resources table, this can take some time...</info>');
-                               $table->setPrimaryKey(['collection_id', 'resource_type', 'resource_id'], 'crr_pk');
-                               if ($table->hasIndex('collres_unique_res')) {
-                                       $table->dropIndex('collres_unique_res');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>collres_resources table updated successfully.</info>');
-                       }
-               }
-
-               if ($schema->hasTable('collres_accesscache')) {
-                       $table = $schema->getTable('collres_accesscache');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the collres_accesscache table, this can take some time...</info>');
-                               $table->setPrimaryKey(['user_id', 'collection_id', 'resource_type', 'resource_id'], 'cra_pk');
-                               if ($table->hasIndex('collres_unique_user')) {
-                                       $table->dropIndex('collres_unique_user');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>collres_accesscache table updated successfully.</info>');
-                       }
-               }
-
-               if ($schema->hasTable('filecache_extended')) {
-                       $table = $schema->getTable('filecache_extended');
-                       if (!$table->hasPrimaryKey()) {
-                               $output->writeln('<info>Adding primary key to the filecache_extended table, this can take some time...</info>');
-                               $table->setPrimaryKey(['fileid'], 'fce_pk');
-                               if ($table->hasIndex('fce_fileid_idx')) {
-                                       $table->dropIndex('fce_fileid_idx');
-                               }
-                               $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun);
-                               if ($dryRun && $sqlQueries !== null) {
-                                       $output->writeln($sqlQueries);
-                               }
-                               $updated = true;
-                               $output->writeln('<info>filecache_extended table updated successfully.</info>');
-                       }
-               }
-
-               return $updated;
-       }
 }
index 32cd4099618f1cca1f8946df650a1bdadac237f7..8d57641db9c67b37471744aa0a6c785982f67495 100644 (file)
@@ -110,8 +110,8 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
        $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(\OCP\Server::get(\OC\Core\Command\Db\AddMissingIndices::class));
+       $application->add(\OCP\Server::get(\OC\Core\Command\Db\AddMissingPrimaryKeys::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()));
 
        if (\OC::$server->getConfig()->getSystemValueBool('debug', false)) {
                $application->add(new OC\Core\Command\Db\Migrations\StatusCommand(\OC::$server->get(\OC\DB\Connection::class)));