diff options
author | Joas Schilling <213943+nickvergessen@users.noreply.github.com> | 2023-07-25 13:37:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-25 13:37:51 +0200 |
commit | f824d87fc1f3aa99ddb141b7ba19b48641d2cb84 (patch) | |
tree | 52e9690556a722051d7b71ddf7f46ce13a409f31 /core | |
parent | 468fb5c8db2318702c9a1895271b7d9c4f579dc0 (diff) | |
parent | ab70bbd3ffbc3788035588c86984f9508db8edbe (diff) | |
download | nextcloud-server-f824d87fc1f3aa99ddb141b7ba19b48641d2cb84.tar.gz nextcloud-server-f824d87fc1f3aa99ddb141b7ba19b48641d2cb84.zip |
Merge pull request #39487 from nextcloud/feat/noid/typed-events-for-db_add-missing
Feat/noid/typed events for db add missing
Diffstat (limited to 'core')
-rw-r--r-- | core/Application.php | 481 | ||||
-rw-r--r-- | core/Command/Db/AddMissingColumns.php | 59 | ||||
-rw-r--r-- | core/Command/Db/AddMissingIndices.php | 446 | ||||
-rw-r--r-- | core/Command/Db/AddMissingPrimaryKeys.php | 142 | ||||
-rw-r--r-- | core/register_command.php | 4 |
5 files changed, 308 insertions, 824 deletions
diff --git a/core/Application.php b/core/Application.php index 592e0929666..307d839f07c 100644 --- a/core/Application.php +++ b/core/Application.php @@ -32,7 +32,6 @@ */ namespace OC\Core; -use Doctrine\DBAL\Platforms\PostgreSQL94Platform; use OC\Authentication\Events\RemoteWipeFinished; use OC\Authentication\Events\RemoteWipeStarted; use OC\Authentication\Listeners\RemoteWipeActivityListener; @@ -45,25 +44,22 @@ use OC\Authentication\Listeners\UserDeletedWebAuthnCleanupListener; use OC\Authentication\Notifications\Notifier as AuthenticationNotifier; use OC\Core\Listener\BeforeTemplateRenderedListener; use OC\Core\Notification\CoreNotifier; -use OC\DB\Connection; -use OC\DB\MissingColumnInformation; -use OC\DB\MissingIndexInformation; -use OC\DB\MissingPrimaryKeyInformation; -use OC\DB\SchemaWrapper; use OC\Metadata\FileEventListener; use OC\TagManager; use OCP\AppFramework\App; use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; +use OCP\DB\Events\AddMissingColumnsEvent; +use OCP\DB\Events\AddMissingIndicesEvent; +use OCP\DB\Events\AddMissingPrimaryKeyEvent; +use OCP\DB\Types; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Events\Node\NodeDeletedEvent; use OCP\Files\Events\Node\NodeWrittenEvent; use OCP\Files\Events\NodeRemovedFromCache; -use OCP\IDBConnection; use OCP\User\Events\BeforeUserDeletedEvent; use OCP\User\Events\UserDeletedEvent; use OCP\Util; use OCP\IConfig; -use Symfony\Component\EventDispatcher\GenericEvent; /** * Class Application @@ -88,244 +84,237 @@ class Application extends App { $notificationManager->registerNotifierService(CoreNotifier::class); $notificationManager->registerNotifierService(AuthenticationNotifier::class); - $oldEventDispatcher = $server->getEventDispatcher(); - - $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_INDEXES_EVENT, - function (GenericEvent $event) use ($container) { - /** @var MissingIndexInformation $subject */ - $subject = $event->getSubject(); - - $schema = new SchemaWrapper($container->query(Connection::class)); - - if ($schema->hasTable('share')) { - $table = $schema->getTable('share'); - - if (!$table->hasIndex('share_with_index')) { - $subject->addHintForMissingSubject($table->getName(), 'share_with_index'); - } - if (!$table->hasIndex('parent_index')) { - $subject->addHintForMissingSubject($table->getName(), 'parent_index'); - } - if (!$table->hasIndex('owner_index')) { - $subject->addHintForMissingSubject($table->getName(), 'owner_index'); - } - if (!$table->hasIndex('initiator_index')) { - $subject->addHintForMissingSubject($table->getName(), 'initiator_index'); - } - } - - if ($schema->hasTable('filecache')) { - $table = $schema->getTable('filecache'); - - if (!$table->hasIndex('fs_mtime')) { - $subject->addHintForMissingSubject($table->getName(), 'fs_mtime'); - } - - if (!$table->hasIndex('fs_size')) { - $subject->addHintForMissingSubject($table->getName(), 'fs_size'); - } - - if (!$table->hasIndex('fs_id_storage_size')) { - $subject->addHintForMissingSubject($table->getName(), 'fs_id_storage_size'); - } - - if (!$table->hasIndex('fs_storage_path_prefix') && !$schema->getDatabasePlatform() instanceof PostgreSQL94Platform) { - $subject->addHintForMissingSubject($table->getName(), 'fs_storage_path_prefix'); - } - - if (!$table->hasIndex('fs_parent')) { - $subject->addHintForMissingSubject($table->getName(), 'fs_parent'); - } - } - - if ($schema->hasTable('twofactor_providers')) { - $table = $schema->getTable('twofactor_providers'); - - if (!$table->hasIndex('twofactor_providers_uid')) { - $subject->addHintForMissingSubject($table->getName(), 'twofactor_providers_uid'); - } - } - - if ($schema->hasTable('login_flow_v2')) { - $table = $schema->getTable('login_flow_v2'); - - if (!$table->hasIndex('poll_token')) { - $subject->addHintForMissingSubject($table->getName(), 'poll_token'); - } - if (!$table->hasIndex('login_token')) { - $subject->addHintForMissingSubject($table->getName(), 'login_token'); - } - if (!$table->hasIndex('timestamp')) { - $subject->addHintForMissingSubject($table->getName(), 'timestamp'); - } - } - - if ($schema->hasTable('whats_new')) { - $table = $schema->getTable('whats_new'); - - if (!$table->hasIndex('version')) { - $subject->addHintForMissingSubject($table->getName(), 'version'); - } - } - - if ($schema->hasTable('cards')) { - $table = $schema->getTable('cards'); - - if (!$table->hasIndex('cards_abid')) { - $subject->addHintForMissingSubject($table->getName(), 'cards_abid'); - } - - if (!$table->hasIndex('cards_abiduri')) { - $subject->addHintForMissingSubject($table->getName(), 'cards_abiduri'); - } - } - - if ($schema->hasTable('cards_properties')) { - $table = $schema->getTable('cards_properties'); - - if (!$table->hasIndex('cards_prop_abid')) { - $subject->addHintForMissingSubject($table->getName(), 'cards_prop_abid'); - } - } - - if ($schema->hasTable('calendarobjects_props')) { - $table = $schema->getTable('calendarobjects_props'); - - if (!$table->hasIndex('calendarobject_calid_index')) { - $subject->addHintForMissingSubject($table->getName(), 'calendarobject_calid_index'); - } - } - - if ($schema->hasTable('schedulingobjects')) { - $table = $schema->getTable('schedulingobjects'); - if (!$table->hasIndex('schedulobj_principuri_index')) { - $subject->addHintForMissingSubject($table->getName(), 'schedulobj_principuri_index'); - } - } - - if ($schema->hasTable('properties')) { - $table = $schema->getTable('properties'); - if (!$table->hasIndex('properties_path_index')) { - $subject->addHintForMissingSubject($table->getName(), 'properties_path_index'); - } - if (!$table->hasIndex('properties_pathonly_index')) { - $subject->addHintForMissingSubject($table->getName(), 'properties_pathonly_index'); - } - } - - if ($schema->hasTable('jobs')) { - $table = $schema->getTable('jobs'); - if (!$table->hasIndex('job_lastcheck_reserved')) { - $subject->addHintForMissingSubject($table->getName(), 'job_lastcheck_reserved'); - } - } - - if ($schema->hasTable('direct_edit')) { - $table = $schema->getTable('direct_edit'); - if (!$table->hasIndex('direct_edit_timestamp')) { - $subject->addHintForMissingSubject($table->getName(), 'direct_edit_timestamp'); - } - } - - if ($schema->hasTable('preferences')) { - $table = $schema->getTable('preferences'); - if (!$table->hasIndex('preferences_app_key')) { - $subject->addHintForMissingSubject($table->getName(), 'preferences_app_key'); - } - } - - if ($schema->hasTable('mounts')) { - $table = $schema->getTable('mounts'); - if (!$table->hasIndex('mounts_class_index')) { - $subject->addHintForMissingSubject($table->getName(), 'mounts_class_index'); - } - if (!$table->hasIndex('mounts_user_root_path_index')) { - $subject->addHintForMissingSubject($table->getName(), 'mounts_user_root_path_index'); - } - } - - if ($schema->hasTable('systemtag_object_mapping')) { - $table = $schema->getTable('systemtag_object_mapping'); - if (!$table->hasIndex('systag_by_tagid')) { - $subject->addHintForMissingSubject($table->getName(), 'systag_by_tagid'); - } - } - } - ); - - $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()); - } - } - } - ); - - $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_COLUMNS_EVENT, - function (GenericEvent $event) use ($container) { - /** @var MissingColumnInformation $subject */ - $subject = $event->getSubject(); - - $schema = new SchemaWrapper($container->query(Connection::class)); - - if ($schema->hasTable('comments')) { - $table = $schema->getTable('comments'); - - if (!$table->hasColumn('reference_id')) { - $subject->addHintForMissingColumn($table->getName(), 'reference_id'); - } - } - } - ); + $eventDispatcher->addListener(AddMissingIndicesEvent::class, function (AddMissingIndicesEvent $event) { + $event->addMissingIndex( + 'share', + 'share_with_index', + ['share_with'] + ); + $event->addMissingIndex( + 'share', + 'parent_index', + ['parent'] + ); + $event->addMissingIndex( + 'share', + 'owner_index', + ['uid_owner'] + ); + $event->addMissingIndex( + 'share', + 'initiator_index', + ['uid_initiator'] + ); + + $event->addMissingIndex( + 'filecache', + 'fs_mtime', + ['mtime'] + ); + $event->addMissingIndex( + 'filecache', + 'fs_size', + ['size'] + ); + $event->addMissingIndex( + 'filecache', + 'fs_id_storage_size', + ['fileid', 'storage', 'size'] + ); + $event->addMissingIndex( + 'filecache', + 'fs_storage_path_prefix', + ['storage', 'path'], + ['lengths' => [null, 64]] + ); + $event->addMissingIndex( + 'filecache', + 'fs_parent', + ['parent'] + ); + + $event->addMissingIndex( + 'twofactor_providers', + 'twofactor_providers_uid', + ['uid'] + ); + + $event->addMissingUniqueIndex( + 'login_flow_v2', + 'poll_token', + ['poll_token'], + [], + true + ); + $event->addMissingUniqueIndex( + 'login_flow_v2', + 'login_token', + ['login_token'], + [], + true + ); + $event->addMissingIndex( + 'login_flow_v2', + 'timestamp', + ['timestamp'], + [], + true + ); + + $event->addMissingIndex( + 'whats_new', + 'version', + ['version'], + [], + true + ); + + $event->addMissingIndex( + 'cards', + 'cards_abiduri', + ['addressbookid', 'uri'], + [], + true + ); + $event->addMissingIndex( + 'cards', + 'cards_abid', + ['addressbookid'], + [], + true + ); + $event->addMissingIndex( + 'cards', + 'cards_abiduri', + ['addressbookid', 'uri'], + [], + true + ); + + $event->addMissingIndex( + 'cards_properties', + 'cards_prop_abid', + ['addressbookid'], + [], + true + ); + + $event->addMissingIndex( + 'calendarobjects_props', + 'calendarobject_calid_index', + ['calendarid', 'calendartype'] + ); + + $event->addMissingIndex( + 'schedulingobjects', + 'schedulobj_principuri_index', + ['principaluri'] + ); + + $event->addMissingIndex( + 'properties', + 'properties_path_index', + ['userid', 'propertypath'] + ); + $event->addMissingIndex( + 'properties', + 'properties_pathonly_index', + ['propertypath'] + ); + + + $event->addMissingIndex( + 'jobs', + 'job_lastcheck_reserved', + ['last_checked', 'reserved_at'] + ); + + $event->addMissingIndex( + 'direct_edit', + 'direct_edit_timestamp', + ['timestamp'] + ); + + $event->addMissingIndex( + 'preferences', + 'preferences_app_key', + ['appid', 'configkey'] + ); + + $event->addMissingIndex( + 'mounts', + 'mounts_class_index', + ['mount_provider_class'] + ); + $event->addMissingIndex( + 'mounts', + 'mounts_user_root_path_index', + ['user_id', 'root_id', 'mount_point'], + ['lengths' => [null, null, 128]] + ); + + $event->addMissingIndex( + 'systemtag_object_mapping', + 'systag_by_tagid', + ['systemtagid', 'objecttype'] + ); + }); + + $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' + ); + }); + + $eventDispatcher->addListener(AddMissingColumnsEvent::class, function (AddMissingColumnsEvent $event) { + $event->addMissingColumn( + 'comments', + 'reference_id', + Types::STRING, + [ + 'notnull' => false, + 'length' => 64, + ] + ); + }); $eventDispatcher->addServiceListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class); $eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeActivityListener::class); diff --git a/core/Command/Db/AddMissingColumns.php b/core/Command/Db/AddMissingColumns.php index 8e6f439e0c4..07763c66154 100644 --- a/core/Command/Db/AddMissingColumns.php +++ b/core/Command/Db/AddMissingColumns.php @@ -28,13 +28,12 @@ namespace OC\Core\Command\Db; use OC\DB\Connection; use OC\DB\SchemaWrapper; -use OCP\IDBConnection; +use OCP\DB\Events\AddMissingColumnsEvent; +use OCP\EventDispatcher\IEventDispatcher; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\GenericEvent; /** * Class AddMissingColumns @@ -47,7 +46,7 @@ use Symfony\Component\EventDispatcher\GenericEvent; class AddMissingColumns extends Command { public function __construct( private Connection $connection, - private EventDispatcherInterface $dispatcher, + private IEventDispatcher $dispatcher, ) { parent::__construct(); } @@ -60,46 +59,38 @@ class AddMissingColumns extends Command { } protected function execute(InputInterface $input, OutputInterface $output): int { - $this->addCoreColumns($output, $input->getOption('dry-run')); + $dryRun = $input->getOption('dry-run'); // Dispatch event so apps can also update columns if needed - $event = new GenericEvent($output); - $this->dispatcher->dispatch(IDBConnection::ADD_MISSING_COLUMNS_EVENT, $event); - 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. - * @throws \Doctrine\DBAL\Schema\SchemaException - */ - private function addCoreColumns(OutputInterface $output, bool $dryRun): void { - $output->writeln('<info>Check columns of the comments table.</info>'); - - $schema = new SchemaWrapper($this->connection); + $event = new AddMissingColumnsEvent(); + $this->dispatcher->dispatchTyped($event); + $missingColumns = $event->getMissingColumns(); $updated = false; - if ($schema->hasTable('comments')) { - $table = $schema->getTable('comments'); - if (!$table->hasColumn('reference_id')) { - $output->writeln('<info>Adding additional reference_id column to the comments table, this can take some time...</info>'); - $table->addColumn('reference_id', 'string', [ - 'notnull' => false, - 'length' => 64, - ]); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); + if (!empty($missingColumns)) { + $schema = new SchemaWrapper($this->connection); + + foreach ($missingColumns as $missingColumn) { + if ($schema->hasTable($missingColumn['tableName'])) { + $table = $schema->getTable($missingColumn['tableName']); + if (!$table->hasColumn($missingColumn['columnName'])) { + $output->writeln('<info>Adding additional ' . $missingColumn['columnName'] . ' column to the ' . $missingColumn['tableName'] . ' table, this can take some time...</info>'); + $table->addColumn($missingColumn['columnName'], $missingColumn['typeName'], $missingColumn['options']); + $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); + if ($dryRun && $sqlQueries !== null) { + $output->writeln($sqlQueries); + } + $updated = true; + $output->writeln('<info>' . $missingColumn['tableName'] . ' table updated successfully.</info>'); + } } - $updated = true; - $output->writeln('<info>Comments table updated successfully.</info>'); } } if (!$updated) { $output->writeln('<info>Done.</info>'); } + + return 0; } } diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index dee9796a569..56dbf8ce8d9 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -33,18 +33,14 @@ declare(strict_types=1); */ 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; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\GenericEvent; /** * Class AddMissingIndices @@ -57,8 +53,7 @@ use Symfony\Component\EventDispatcher\GenericEvent; class AddMissingIndices extends Command { public function __construct( private Connection $connection, - private IEventDispatcher $eventDispatcher, - private EventDispatcherInterface $dispatcher, + private IEventDispatcher $dispatcher, ) { parent::__construct(); } @@ -73,14 +68,9 @@ class AddMissingIndices extends Command { protected function execute(InputInterface $input, OutputInterface $output): int { $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); + $this->dispatcher->dispatchTyped($event); $missingIndices = $event->getMissingIndices(); if ($missingIndices !== []) { @@ -91,7 +81,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); @@ -104,418 +110,4 @@ class AddMissingIndices 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. - * @throws \Doctrine\DBAL\Schema\SchemaException - */ - private function addCoreIndexes(OutputInterface $output, bool $dryRun): void { - $output->writeln('<info>Check indices of the share table.</info>'); - - $schema = new SchemaWrapper($this->connection); - $updated = false; - - if ($schema->hasTable('share')) { - $table = $schema->getTable('share'); - if (!$table->hasIndex('share_with_index')) { - $output->writeln('<info>Adding additional share_with index to the share table, this can take some time...</info>'); - $table->addIndex(['share_with'], 'share_with_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Share table updated successfully.</info>'); - } - - if (!$table->hasIndex('parent_index')) { - $output->writeln('<info>Adding additional parent index to the share table, this can take some time...</info>'); - $table->addIndex(['parent'], 'parent_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Share table updated successfully.</info>'); - } - - if (!$table->hasIndex('owner_index')) { - $output->writeln('<info>Adding additional owner index to the share table, this can take some time...</info>'); - $table->addIndex(['uid_owner'], 'owner_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Share table updated successfully.</info>'); - } - - if (!$table->hasIndex('initiator_index')) { - $output->writeln('<info>Adding additional initiator index to the share table, this can take some time...</info>'); - $table->addIndex(['uid_initiator'], 'initiator_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Share table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the filecache table.</info>'); - if ($schema->hasTable('filecache')) { - $table = $schema->getTable('filecache'); - if (!$table->hasIndex('fs_mtime')) { - $output->writeln('<info>Adding additional mtime index to the filecache table, this can take some time...</info>'); - $table->addIndex(['mtime'], 'fs_mtime'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Filecache table updated successfully.</info>'); - } - if (!$table->hasIndex('fs_size')) { - $output->writeln('<info>Adding additional size index to the filecache table, this can take some time...</info>'); - $table->addIndex(['size'], 'fs_size'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Filecache table updated successfully.</info>'); - } - if (!$table->hasIndex('fs_id_storage_size')) { - $output->writeln('<info>Adding additional size index to the filecache table, this can take some time...</info>'); - $table->addIndex(['fileid', 'storage', 'size'], 'fs_id_storage_size'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Filecache table updated successfully.</info>'); - } - if (!$table->hasIndex('fs_storage_path_prefix') && !$schema->getDatabasePlatform() instanceof PostgreSQL94Platform) { - $output->writeln('<info>Adding additional path index to the filecache table, this can take some time...</info>'); - $table->addIndex(['storage', 'path'], 'fs_storage_path_prefix', [], ['lengths' => [null, 64]]); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Filecache table updated successfully.</info>'); - } - if (!$table->hasIndex('fs_parent')) { - $output->writeln('<info>Adding additional parent index to the filecache table, this can take some time...</info>'); - $table->addIndex(['parent'], 'fs_parent'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Filecache table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the twofactor_providers table.</info>'); - if ($schema->hasTable('twofactor_providers')) { - $table = $schema->getTable('twofactor_providers'); - if (!$table->hasIndex('twofactor_providers_uid')) { - $output->writeln('<info>Adding additional twofactor_providers_uid index to the twofactor_providers table, this can take some time...</info>'); - $table->addIndex(['uid'], 'twofactor_providers_uid'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>Twofactor_providers table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the login_flow_v2 table.</info>'); - if ($schema->hasTable('login_flow_v2')) { - $table = $schema->getTable('login_flow_v2'); - if (!$table->hasIndex('poll_token')) { - $output->writeln('<info>Adding additional indeces to the login_flow_v2 table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - $columns = $index->getColumns(); - if ($columns === ['poll_token'] || - $columns === ['login_token'] || - $columns === ['timestamp']) { - $table->dropIndex($index->getName()); - } - } - - $table->addUniqueIndex(['poll_token'], 'poll_token'); - $table->addUniqueIndex(['login_token'], 'login_token'); - $table->addIndex(['timestamp'], 'timestamp'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>login_flow_v2 table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the whats_new table.</info>'); - if ($schema->hasTable('whats_new')) { - $table = $schema->getTable('whats_new'); - if (!$table->hasIndex('version')) { - $output->writeln('<info>Adding version index to the whats_new table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['version']) { - $table->dropIndex($index->getName()); - } - } - - $table->addUniqueIndex(['version'], 'version'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>whats_new table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the cards table.</info>'); - $cardsUpdated = false; - if ($schema->hasTable('cards')) { - $table = $schema->getTable('cards'); - - if ($table->hasIndex('addressbookid_uri_index')) { - if ($table->hasIndex('cards_abiduri')) { - $table->dropIndex('addressbookid_uri_index'); - } else { - $output->writeln('<info>Renaming addressbookid_uri_index index to cards_abiduri in the cards table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['addressbookid', 'uri']) { - $table->renameIndex('addressbookid_uri_index', 'cards_abiduri'); - } - } - } - - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $cardsUpdated = true; - } - - if (!$table->hasIndex('cards_abid')) { - $output->writeln('<info>Adding cards_abid index to the cards table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['addressbookid']) { - $table->dropIndex($index->getName()); - } - } - - $table->addIndex(['addressbookid'], 'cards_abid'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $cardsUpdated = true; - } - - if (!$table->hasIndex('cards_abiduri')) { - $output->writeln('<info>Adding cards_abiduri index to the cards table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['addressbookid', 'uri']) { - $table->dropIndex($index->getName()); - } - } - - $table->addIndex(['addressbookid', 'uri'], 'cards_abiduri'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $cardsUpdated = true; - } - - if ($cardsUpdated) { - $updated = true; - $output->writeln('<info>cards table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the cards_properties table.</info>'); - if ($schema->hasTable('cards_properties')) { - $table = $schema->getTable('cards_properties'); - if (!$table->hasIndex('cards_prop_abid')) { - $output->writeln('<info>Adding cards_prop_abid index to the cards_properties table, this can take some time...</info>'); - - foreach ($table->getIndexes() as $index) { - if ($index->getColumns() === ['addressbookid']) { - $table->dropIndex($index->getName()); - } - } - - $table->addIndex(['addressbookid'], 'cards_prop_abid'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>cards_properties table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the calendarobjects_props table.</info>'); - if ($schema->hasTable('calendarobjects_props')) { - $table = $schema->getTable('calendarobjects_props'); - if (!$table->hasIndex('calendarobject_calid_index')) { - $output->writeln('<info>Adding calendarobject_calid_index index to the calendarobjects_props table, this can take some time...</info>'); - - $table->addIndex(['calendarid', 'calendartype'], 'calendarobject_calid_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>calendarobjects_props table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the schedulingobjects table.</info>'); - if ($schema->hasTable('schedulingobjects')) { - $table = $schema->getTable('schedulingobjects'); - if (!$table->hasIndex('schedulobj_principuri_index')) { - $output->writeln('<info>Adding schedulobj_principuri_index index to the schedulingobjects table, this can take some time...</info>'); - - $table->addIndex(['principaluri'], 'schedulobj_principuri_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>schedulingobjects table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_properties table.</info>'); - if ($schema->hasTable('properties')) { - $table = $schema->getTable('properties'); - $propertiesUpdated = false; - - if (!$table->hasIndex('properties_path_index')) { - $output->writeln('<info>Adding properties_path_index index to the oc_properties table, this can take some time...</info>'); - - $table->addIndex(['userid', 'propertypath'], 'properties_path_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $propertiesUpdated = true; - } - if (!$table->hasIndex('properties_pathonly_index')) { - $output->writeln('<info>Adding properties_pathonly_index index to the oc_properties table, this can take some time...</info>'); - - $table->addIndex(['propertypath'], 'properties_pathonly_index'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $propertiesUpdated = true; - } - - if ($propertiesUpdated) { - $updated = true; - $output->writeln('<info>oc_properties table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_jobs table.</info>'); - if ($schema->hasTable('jobs')) { - $table = $schema->getTable('jobs'); - if (!$table->hasIndex('job_lastcheck_reserved')) { - $output->writeln('<info>Adding job_lastcheck_reserved index to the oc_jobs table, this can take some time...</info>'); - - $table->addIndex(['last_checked', 'reserved_at'], 'job_lastcheck_reserved'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>oc_properties table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_direct_edit table.</info>'); - if ($schema->hasTable('direct_edit')) { - $table = $schema->getTable('direct_edit'); - if (!$table->hasIndex('direct_edit_timestamp')) { - $output->writeln('<info>Adding direct_edit_timestamp index to the oc_direct_edit table, this can take some time...</info>'); - - $table->addIndex(['timestamp'], 'direct_edit_timestamp'); - $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); - if ($dryRun && $sqlQueries !== null) { - $output->writeln($sqlQueries); - } - $updated = true; - $output->writeln('<info>oc_direct_edit table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_preferences table.</info>'); - if ($schema->hasTable('preferences')) { - $table = $schema->getTable('preferences'); - if (!$table->hasIndex('preferences_app_key')) { - $output->writeln('<info>Adding preferences_app_key index to the oc_preferences table, this can take some time...</info>'); - - $table->addIndex(['appid', 'configkey'], 'preferences_app_key'); - $this->connection->migrateToSchema($schema->getWrappedSchema()); - $updated = true; - $output->writeln('<info>oc_properties table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_mounts table.</info>'); - if ($schema->hasTable('mounts')) { - $table = $schema->getTable('mounts'); - if (!$table->hasIndex('mounts_class_index')) { - $output->writeln('<info>Adding mounts_class_index index to the oc_mounts table, this can take some time...</info>'); - - $table->addIndex(['mount_provider_class'], 'mounts_class_index'); - $this->connection->migrateToSchema($schema->getWrappedSchema()); - $updated = true; - $output->writeln('<info>oc_mounts table updated successfully.</info>'); - } - if (!$table->hasIndex('mounts_user_root_path_index')) { - $output->writeln('<info>Adding mounts_user_root_path_index index to the oc_mounts table, this can take some time...</info>'); - - $table->addIndex(['user_id', 'root_id', 'mount_point'], 'mounts_user_root_path_index', [], ['lengths' => [null, null, 128]]); - $this->connection->migrateToSchema($schema->getWrappedSchema()); - $updated = true; - $output->writeln('<info>oc_mounts table updated successfully.</info>'); - } - } - - $output->writeln('<info>Check indices of the oc_systemtag_object_mapping table.</info>'); - if ($schema->hasTable('systemtag_object_mapping')) { - $table = $schema->getTable('systemtag_object_mapping'); - if (!$table->hasIndex('systag_by_tagid')) { - $output->writeln('<info>Adding systag_by_tagid index to the oc_systemtag_object_mapping table, this can take some time...</info>'); - - $table->addIndex(['systemtagid', 'objecttype'], 'systag_by_tagid'); - $this->connection->migrateToSchema($schema->getWrappedSchema()); - $updated = true; - $output->writeln('<info>oc_systemtag_object_mapping table updated successfully.</info>'); - } - } - - if (!$updated) { - $output->writeln('<info>Done.</info>'); - } - } } diff --git a/core/Command/Db/AddMissingPrimaryKeys.php b/core/Command/Db/AddMissingPrimaryKeys.php index a11be78ccfc..658eb0b0f5a 100644 --- a/core/Command/Db/AddMissingPrimaryKeys.php +++ b/core/Command/Db/AddMissingPrimaryKeys.php @@ -28,13 +28,12 @@ namespace OC\Core\Command\Db; use OC\DB\Connection; use OC\DB\SchemaWrapper; -use OCP\IDBConnection; +use OCP\DB\Events\AddMissingPrimaryKeyEvent; +use OCP\EventDispatcher\IEventDispatcher; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\GenericEvent; /** * Class AddMissingPrimaryKeys @@ -47,7 +46,7 @@ use Symfony\Component\EventDispatcher\GenericEvent; class AddMissingPrimaryKeys extends Command { public function __construct( private Connection $connection, - private EventDispatcherInterface $dispatcher, + private IEventDispatcher $dispatcher, ) { parent::__construct(); } @@ -60,131 +59,44 @@ class AddMissingPrimaryKeys extends Command { } protected function execute(InputInterface $input, OutputInterface $output): int { - $this->addCorePrimaryKeys($output, $input->getOption('dry-run')); + $dryRun = $input->getOption('dry-run'); // Dispatch event so apps can also update indexes if needed - $event = new GenericEvent($output); - $this->dispatcher->dispatch(IDBConnection::ADD_MISSING_PRIMARY_KEYS_EVENT, $event); - 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. - * @throws \Doctrine\DBAL\Schema\SchemaException - */ - private function addCorePrimaryKeys(OutputInterface $output, bool $dryRun): void { - $output->writeln('<info>Check primary keys.</info>'); - - $schema = new SchemaWrapper($this->connection); + $event = new AddMissingPrimaryKeyEvent(); + $this->dispatcher->dispatchTyped($event); + $missingKeys = $event->getMissingPrimaryKeys(); $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 (!empty($missingKeys)) { + $schema = new SchemaWrapper($this->connection); - 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>'); - } - } + foreach ($missingKeys as $missingKey) { + if ($schema->hasTable($missingKey['tableName'])) { + $table = $schema->getTable($missingKey['tableName']); + if (!$table->hasPrimaryKey()) { + $output->writeln('<info>Adding primary key to the ' . $missingKey['tableName'] . ' table, this can take some time...</info>'); + $table->setPrimaryKey($missingKey['columns'], $missingKey['primaryKeyName']); - 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 ($missingKey['formerIndex'] && $table->hasIndex($missingKey['formerIndex'])) { + $table->dropIndex($missingKey['formerIndex']); + } - 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>'); - } - } + $sqlQueries = $this->connection->migrateToSchema($schema->getWrappedSchema(), $dryRun); + if ($dryRun && $sqlQueries !== null) { + $output->writeln($sqlQueries); + } - 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'); + $updated = true; + $output->writeln('<info>' . $missingKey['tableName'] . ' table updated successfully.</info>'); + } } - $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>'); } } if (!$updated) { $output->writeln('<info>Done.</info>'); } + + return 0; } } diff --git a/core/register_command.php b/core/register_command.php index 32cd4099618..df39ad4484c 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -109,9 +109,9 @@ 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(\OCP\Server::get(\OC\Core\Command\Db\AddMissingColumns::class)); $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())); + $application->add(\OCP\Server::get(\OC\Core\Command\Db\AddMissingPrimaryKeys::class)); if (\OC::$server->getConfig()->getSystemValueBool('debug', false)) { $application->add(new OC\Core\Command\Db\Migrations\StatusCommand(\OC::$server->get(\OC\DB\Connection::class))); |