diff --git a/lib/private/Repair.php b/lib/private/Repair.php index c212ea9074..16236fd6bc 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -37,6 +37,7 @@ use OC\Repair\Collation; use OC\Repair\DropOldJobs; use OC\Repair\MoveUpdaterStepFile; use OC\Repair\NC11\CleanPreviews; +use OC\Repair\NC11\FixMountStorages; use OC\Repair\NC11\MoveAvatars; use OC\Repair\OldGroupMembershipShares; use OC\Repair\RemoveGetETagEntries; @@ -161,6 +162,7 @@ class Repair implements IOutput{ \OC::$server->getUserManager(), \OC::$server->getConfig() ), + new FixMountStorages(\OC::$server->getDatabaseConnection()), ]; } diff --git a/lib/private/Repair/NC11/FixMountStorages.php b/lib/private/Repair/NC11/FixMountStorages.php new file mode 100644 index 0000000000..d57a356dff --- /dev/null +++ b/lib/private/Repair/NC11/FixMountStorages.php @@ -0,0 +1,78 @@ + + * + * @author Joas Schilling + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OC\Repair\NC11; + +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class FixMountStorages implements IRepairStep { + + /** @var IDBConnection */ + private $db; + + /** + * @param IDBConnection $db + */ + public function __construct(IDBConnection $db) { + $this->db = $db; + } + + /** + * @return string + */ + public function getName() { + return 'Fix potential broken mount points'; + } + + public function run(IOutput $output) { + $query = $this->db->getQueryBuilder(); + $query->select('m.id', 'f.storage') + ->from('mounts', 'm') + ->leftJoin('m', 'filecache', 'f', $query->expr()->eq('m.root_id', 'f.fileid')) + ->where($query->expr()->neq('m.storage_id', 'f.storage')); + + $update = $this->db->getQueryBuilder(); + $update->update('mounts') + ->set('storage_id', $update->createParameter('storage')) + ->where($query->expr()->eq('id', $update->createParameter('mount'))); + + $result = $query->execute(); + $entriesUpdated = 0; + while ($row = $result->fetch()) { + $update->setParameter('storage', $row['storage'], IQueryBuilder::PARAM_INT) + ->setParameter('mount', $row['id'], IQueryBuilder::PARAM_INT); + $update->execute(); + $entriesUpdated++; + } + $result->closeCursor(); + + if ($entriesUpdated > 0) { + $output->info($entriesUpdated . ' mounts updated'); + return; + } + + $output->info('No mounts updated'); + } +}