]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add removal of mounts without storages to files:cleanup command
authorJulius Härtl <jus@bitgrid.net>
Tue, 7 Jul 2020 10:36:59 +0000 (12:36 +0200)
committerJulius Härtl <jus@bitgrid.net>
Tue, 7 Jul 2020 10:36:59 +0000 (12:36 +0200)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
apps/files/lib/Command/DeleteOrphanedFiles.php

index c8ce9729ef7ed90bb8359dc22ff3265d251409c6..9795448ff979263e62838fab7446507d1a3ce405 100644 (file)
@@ -78,6 +78,39 @@ class DeleteOrphanedFiles extends Command {
                }
 
                $output->writeln("$deletedEntries orphaned file cache entries deleted");
+
+               $deletedMounts = $this->cleanupOrphanedMounts();
+               $output->writeln("$deletedMounts orphaned mount entries deleted");
                return 0;
        }
+
+       private function cleanupOrphanedMounts() {
+               $deletedEntries = 0;
+
+               $query = $this->connection->getQueryBuilder();
+               $query->select('m.storage_id')
+                       ->from('mounts', 'm')
+                       ->where($query->expr()->isNull('s.numeric_id'))
+                       ->leftJoin('m', 'storages', 's', $query->expr()->eq('m.storage_id', 's.numeric_id'))
+                       ->groupBy('storage_id')
+                       ->setMaxResults(self::CHUNK_SIZE);
+
+               $deleteQuery = $this->connection->getQueryBuilder();
+               $deleteQuery->delete('mounts')
+                       ->where($deleteQuery->expr()->eq('storage_id', $deleteQuery->createParameter('storageid')));
+
+               $deletedInLastChunk = self::CHUNK_SIZE;
+               while ($deletedInLastChunk === self::CHUNK_SIZE) {
+                       $deletedInLastChunk = 0;
+                       $result = $query->execute();
+                       while ($row = $result->fetch()) {
+                               $deletedInLastChunk++;
+                               $deletedEntries += $deleteQuery->setParameter('storageid', (int) $row['storage_id'])
+                                       ->execute();
+                       }
+                       $result->closeCursor();
+               }
+
+               return $deletedEntries;
+       }
 }