]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix getAll(), refactor search by mime & search
authorJörn Friedrich Dreyer <jfd@butonic.de>
Wed, 28 Aug 2013 10:39:43 +0000 (12:39 +0200)
committerVictor Dubiniuk <victor.dubiniuk@gmail.com>
Thu, 19 Sep 2013 18:08:32 +0000 (21:08 +0300)
apps/files_sharing/lib/cache.php

index a4402464481876b0ba5f8dd7589ed25fcf537e83..82588df42d2a8e4a29a5f75178f88576bfe37017 100644 (file)
@@ -230,15 +230,7 @@ class Shared_Cache extends Cache {
                // normalize pattern
                $pattern = $this->normalize($pattern);
 
-               $ids = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
-               foreach ($ids as $file) {
-                       $folderBackend = \OCP\Share::getBackend('folder');
-                       $children = $folderBackend->getChildren($file);
-                       foreach ($children as $child) {
-                               $ids[] = (int)$child['source'];
-                       }
-                       
-               }
+               $ids = $this->getAll();
 
                $files = array();
                
@@ -248,7 +240,8 @@ class Shared_Cache extends Cache {
                foreach ($chunks as $chunk) {
                        $placeholders = join(',', array_fill(0, count($chunk), '?'));
 
-                       $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`
+                       $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
+                                       `encrypted`, `unencrypted_size`, `etag`
                                        FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `fileid` IN (' . $placeholders . ')';
                        
                        $result = \OC_DB::executeAudited($sql, array_merge(array($pattern), $chunk));
@@ -280,13 +273,30 @@ class Shared_Cache extends Cache {
                }
                $mimetype = $this->getMimetypeId($mimetype);
                $ids = $this->getAll();
-               $placeholders = join(',', array_fill(0, count($ids), '?'));
-               $query = \OC_DB::prepare('
-                       SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`
-                       FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')'
-               );
-               $result = $query->execute(array_merge(array($mimetype), $ids));
-               return $result->fetchAll();
+
+               $files = array();
+               
+               // divide into 1k chunks
+               $chunks = array_chunk($ids, 1000);
+               
+               foreach ($chunks as $chunk) {
+                       $placeholders = join(',', array_fill(0, count($ids), '?'));
+                       $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
+                                       `encrypted`, `unencrypted_size`, `etag`
+                                       FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')';
+                       
+                       $result = \OC_DB::executeAudited($sql, array_merge(array($mimetype), $chunk));
+
+                       while ($row = $result->fetchRow()) {
+                               if (substr($row['path'], 0, 6)==='files/') {
+                                       $row['path'] = substr($row['path'],6); // remove 'files/' from path as it's relative to '/Shared'
+                                       $row['mimetype'] = $this->getMimetype($row['mimetype']);
+                                       $row['mimepart'] = $this->getMimetype($row['mimepart']);
+                                       $files[] = $row;
+                               } // else skip results out of the files folder
+                       }
+               }
+               return $files;
        }
 
        /**
@@ -308,7 +318,16 @@ class Shared_Cache extends Cache {
         * @return int[]
         */
        public function getAll() {
-               return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
+               $ids = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
+               $folderBackend = \OCP\Share::getBackend('folder');
+               foreach ($ids as $file) {
+                       $children = $folderBackend->getChildren($file);
+                       foreach ($children as $child) {
+                               $ids[] = (int)$child['source'];
+                       }
+                       
+               }
+               return $ids;
        }
 
        /**