diff --git a/lib/private/Repair/RepairInvalidShares.php b/lib/private/Repair/RepairInvalidShares.php index d2d1b04fe773d..b6493f8d6cb42 100644 --- a/lib/private/Repair/RepairInvalidShares.php +++ b/lib/private/Repair/RepairInvalidShares.php @@ -10,6 +10,7 @@ use OC\Core\AppInfo\ConfigLexicon; use OCP\Constants; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IAppConfig; use OCP\IConfig; use OCP\IDBConnection; @@ -71,18 +72,25 @@ private function removeSharesNonExistingParent(IOutput $output): void { $deleteQuery = $this->connection->getQueryBuilder(); $deleteQuery->delete('share') - ->where($deleteQuery->expr()->eq('parent', $deleteQuery->createParameter('parent'))); + ->where($deleteQuery->expr()->in('parent', $deleteQuery->createParameter('parents'))); - $deletedInLastChunk = self::CHUNK_SIZE; - while ($deletedInLastChunk === self::CHUNK_SIZE) { - $deletedInLastChunk = 0; + while (true) { $result = $query->executeQuery(); - while ($row = $result->fetchAssociative()) { - $deletedInLastChunk++; - $deletedEntries += $deleteQuery->setParameter('parent', (int)$row['parent']) - ->executeStatement(); - } + $parents = $result->fetchFirstColumn(); + $parents = array_unique($parents); $result->closeCursor(); + + if ($parents === []) { + break; + } + + $deletedEntriesInIteration = $deleteQuery->setParameter('parents', $parents, IQueryBuilder::PARAM_INT_ARRAY) + ->executeStatement(); + $deletedEntries += $deletedEntriesInIteration; + + if ($deletedEntriesInIteration === 0) { + break; + } } if ($deletedEntries) {