From 77c2b169a5da0d7cbb8269f8b240fa47edff90b7 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 19 Jul 2023 23:10:13 +0200 Subject: [PATCH] fix(db): Move missing core primary keys to typed event Signed-off-by: Joas Schilling --- core/Application.php | 100 ++++++++---------- core/Command/Db/AddMissingPrimaryKeys.php | 122 +--------------------- core/register_command.php | 2 +- 3 files changed, 46 insertions(+), 178 deletions(-) diff --git a/core/Application.php b/core/Application.php index 592e0929666..d6f0f959964 100644 --- a/core/Application.php +++ b/core/Application.php @@ -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) { diff --git a/core/Command/Db/AddMissingPrimaryKeys.php b/core/Command/Db/AddMissingPrimaryKeys.php index 6ace85d785b..b7435144933 100644 --- a/core/Command/Db/AddMissingPrimaryKeys.php +++ b/core/Command/Db/AddMissingPrimaryKeys.php @@ -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('Check primary keys.'); - - $schema = new SchemaWrapper($this->connection); - $updated = false; - - if ($schema->hasTable('federated_reshares')) { - $table = $schema->getTable('federated_reshares'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the federated_reshares table, this can take some time...'); - $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('federated_reshares table updated successfully.'); - } - } - - if ($schema->hasTable('systemtag_object_mapping')) { - $table = $schema->getTable('systemtag_object_mapping'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the systemtag_object_mapping table, this can take some time...'); - $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('systemtag_object_mapping table updated successfully.'); - } - } - - if ($schema->hasTable('comments_read_markers')) { - $table = $schema->getTable('comments_read_markers'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the comments_read_markers table, this can take some time...'); - $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('comments_read_markers table updated successfully.'); - } - } - - if ($schema->hasTable('collres_resources')) { - $table = $schema->getTable('collres_resources'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the collres_resources table, this can take some time...'); - $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('collres_resources table updated successfully.'); - } - } - - if ($schema->hasTable('collres_accesscache')) { - $table = $schema->getTable('collres_accesscache'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the collres_accesscache table, this can take some time...'); - $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('collres_accesscache table updated successfully.'); - } - } - - if ($schema->hasTable('filecache_extended')) { - $table = $schema->getTable('filecache_extended'); - if (!$table->hasPrimaryKey()) { - $output->writeln('Adding primary key to the filecache_extended table, this can take some time...'); - $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('filecache_extended table updated successfully.'); - } - } - - return $updated; - } } diff --git a/core/register_command.php b/core/register_command.php index 32cd4099618..8d57641db9c 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -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))); -- 2.39.5