Browse Source

fix(db): Move missing core primary keys to typed event

Signed-off-by: Joas Schilling <coding@schilljs.com>
tags/v28.0.0beta1
Joas Schilling 10 months ago
parent
commit
77c2b169a5
No account linked to committer's email address
3 changed files with 46 additions and 178 deletions
  1. 44
    56
      core/Application.php
  2. 1
    121
      core/Command/Db/AddMissingPrimaryKeys.php
  3. 1
    1
      core/register_command.php

+ 44
- 56
core/Application.php View 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) {

+ 1
- 121
core/Command/Db/AddMissingPrimaryKeys.php View 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;
}
}

+ 1
- 1
core/register_command.php View 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)));

Loading…
Cancel
Save