From 0d4ca0e754bc9dfeffac68e80af33fff3713c915 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 11 Jul 2019 12:11:07 +0200 Subject: [PATCH] Drop foreign key before trying to drop the accounts table Signed-off-by: Joas Schilling --- .../Repair/Owncloud/SaveAccountsTableData.php | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/private/Repair/Owncloud/SaveAccountsTableData.php b/lib/private/Repair/Owncloud/SaveAccountsTableData.php index c9e67356fb..f62f8b56b2 100644 --- a/lib/private/Repair/Owncloud/SaveAccountsTableData.php +++ b/lib/private/Repair/Owncloud/SaveAccountsTableData.php @@ -44,6 +44,8 @@ class SaveAccountsTableData implements IRepairStep { /** @var IConfig */ protected $config; + protected $hasForeignKeyOnPersistentLocks = false; + /** * @param IDBConnection $db * @param IConfig $config @@ -77,6 +79,9 @@ class SaveAccountsTableData implements IRepairStep { } // Remove the table + if ($this->hasForeignKeyOnPersistentLocks) { + $this->db->dropTable('persistent_locks'); + } $this->db->dropTable('accounts'); } @@ -85,14 +90,29 @@ class SaveAccountsTableData implements IRepairStep { */ protected function shouldRun() { $schema = $this->db->createSchema(); + $prefix = $this->config->getSystemValue('dbtableprefix', 'oc_'); - $tableName = $this->config->getSystemValue('dbtableprefix', 'oc_') . 'accounts'; + $tableName = $prefix . 'accounts'; if (!$schema->hasTable($tableName)) { return false; } $table = $schema->getTable($tableName); - return $table->hasColumn('user_id'); + if (!$table->hasColumn('user_id')) { + return false; + } + + if ($schema->hasTable($prefix . 'persistent_locks')) { + $locksTable = $schema->getTable($prefix . 'persistent_locks'); + $foreignKeys = $locksTable->getForeignKeys(); + foreach ($foreignKeys as $foreignKey) { + if ($tableName === $foreignKey->getForeignTableName()) { + $this->hasForeignKeyOnPersistentLocks = true; + } + } + } + + return true; } /**