]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix getting shares in a folder on Orache 32185/head
authorCarl Schwan <carl@carlschwan.eu>
Wed, 27 Apr 2022 12:46:28 +0000 (14:46 +0200)
committerCarl Schwan <carl@carlschwan.eu>
Thu, 12 May 2022 13:03:25 +0000 (15:03 +0200)
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
lib/private/Share20/DefaultShareProvider.php

index 9638706025bd0a2e04fbbedfd8096dd91e0744b6..520bd17d3cf08531daf94ab410d48215131f40f8 100644 (file)
@@ -671,10 +671,10 @@ class DefaultShareProvider implements IShareProvider {
                }
 
                // todo? maybe get these from the oc_mounts table
-               $childMountNodes = array_filter($node->getDirectoryListing(), function (Node $node) {
+               $childMountNodes = array_filter($node->getDirectoryListing(), function (Node $node): bool {
                        return $node->getInternalPath() === '';
                });
-               $childMountRootIds = array_map(function (Node $node) {
+               $childMountRootIds = array_map(function (Node $node): int {
                        return $node->getId();
                }, $childMountNodes);
 
@@ -682,18 +682,29 @@ class DefaultShareProvider implements IShareProvider {
                $qb->andWhere(
                        $qb->expr()->orX(
                                $qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())),
-                               $qb->expr()->in('f.fileid', $qb->createNamedParameter($childMountRootIds, IQueryBuilder::PARAM_INT_ARRAY))
+                               $qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
                        )
                );
 
                $qb->orderBy('id');
 
-               $cursor = $qb->execute();
                $shares = [];
-               while ($data = $cursor->fetch()) {
-                       $shares[$data['fileid']][] = $this->createShare($data);
+
+               $chunks = array_chunk($childMountRootIds, 1000);
+
+               // Force the request to be run when there is 0 mount.
+               if (count($chunks) === 0) {
+                       $chunks = [[]];
+               }
+
+               foreach ($chunks as $chunk) {
+                       $qb->setParameter('chunk', $chunk, IQueryBuilder::PARAM_INT_ARRAY);
+                       $cursor = $qb->executeQuery();
+                       while ($data = $cursor->fetch()) {
+                               $shares[$data['fileid']][] = $this->createShare($data);
+                       }
+                       $cursor->closeCursor();
                }
-               $cursor->closeCursor();
 
                return $shares;
        }