]> source.dussan.org Git - nextcloud-server.git/commitdiff
Remove children from the cache in one query
authorRobin Appelman <icewind@owncloud.com>
Thu, 15 Jan 2015 16:26:12 +0000 (17:26 +0100)
committerRobin Appelman <icewind@owncloud.com>
Thu, 15 Jan 2015 16:26:12 +0000 (17:26 +0100)
lib/private/files/cache/cache.php

index bf44cf48aa76ec719023a5f16afe8c8b35f45910..8d0681ba9351aa7b2ad9e53b1ee072d2099b8a39 100644 (file)
@@ -73,12 +73,11 @@ class Cache {
                }
 
                if (!isset(self::$mimetypeIds[$mime])) {
-                       try{
+                       try {
                                $result = \OC_DB::executeAudited('INSERT INTO `*PREFIX*mimetypes`(`mimetype`) VALUES(?)', array($mime));
                                self::$mimetypeIds[$mime] = \OC_DB::insertid('*PREFIX*mimetypes');
                                self::$mimetypes[self::$mimetypeIds[$mime]] = $mime;
-                       }
-                       catch (\Doctrine\DBAL\DBALException $e){
+                       } catch (\Doctrine\DBAL\DBALException $e) {
                                \OC_Log::write('core', 'Exception during mimetype insertion: ' . $e->getmessage(), \OC_Log::DEBUG);
                                return -1;
                        }
@@ -95,20 +94,20 @@ class Cache {
                return isset(self::$mimetypes[$id]) ? self::$mimetypes[$id] : null;
        }
 
-       public function loadMimetypes(){
-                       $result = \OC_DB::executeAudited('SELECT `id`, `mimetype` FROM `*PREFIX*mimetypes`', array());
-                       if ($result) {
-                               while ($row = $result->fetchRow()) {
-                                       self::$mimetypeIds[$row['mimetype']] = $row['id'];
-                                       self::$mimetypes[$row['id']] = $row['mimetype'];
-                               }
+       public function loadMimetypes() {
+               $result = \OC_DB::executeAudited('SELECT `id`, `mimetype` FROM `*PREFIX*mimetypes`', array());
+               if ($result) {
+                       while ($row = $result->fetchRow()) {
+                               self::$mimetypeIds[$row['mimetype']] = $row['id'];
+                               self::$mimetypes[$row['id']] = $row['mimetype'];
                        }
+               }
        }
 
        /**
         * get the stored metadata of a file or folder
         *
-        * @param string/int $file
+        * @param string /int $file
         * @return array|false
         */
        public function get($file) {
@@ -135,7 +134,7 @@ class Cache {
                }
 
                //merge partial data
-               if (!$data and  is_string($file)) {
+               if (!$data and is_string($file)) {
                        if (isset($this->partial[$file])) {
                                $data = $this->partial[$file];
                        }
@@ -146,7 +145,7 @@ class Cache {
                        $data['mtime'] = (int)$data['mtime'];
                        $data['storage_mtime'] = (int)$data['storage_mtime'];
                        $data['encrypted'] = (bool)$data['encrypted'];
-            $data['unencrypted_size'] = 0 + $data['unencrypted_size'];
+                       $data['unencrypted_size'] = 0 + $data['unencrypted_size'];
                        $data['storage'] = $this->storageId;
                        $data['mimetype'] = $this->getMimetype($data['mimetype']);
                        $data['mimepart'] = $this->getMimetype($data['mimepart']);
@@ -181,7 +180,7 @@ class Cache {
                        $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
                                                   `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
                                        FROM `*PREFIX*filecache` WHERE `parent` = ? ORDER BY `name` ASC';
-                       $result = \OC_DB::executeAudited($sql,array($fileId));
+                       $result = \OC_DB::executeAudited($sql, array($fileId));
                        $files = $result->fetchAll();
                        foreach ($files as &$file) {
                                $file['mimetype'] = $this->getMimetype($file['mimetype']);
@@ -255,12 +254,12 @@ class Cache {
         */
        public function update($id, array $data) {
 
-               if(isset($data['path'])) {
+               if (isset($data['path'])) {
                        // normalize path
                        $data['path'] = $this->normalize($data['path']);
                }
 
-               if(isset($data['name'])) {
+               if (isset($data['name'])) {
                        // normalize path
                        $data['name'] = $this->normalize($data['name']);
                }
@@ -365,14 +364,26 @@ class Cache {
         */
        public function remove($file) {
                $entry = $this->get($file);
+               $sql = 'DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?';
+               \OC_DB::executeAudited($sql, array($entry['fileid']));
                if ($entry['mimetype'] === 'httpd/unix-directory') {
-                       $children = $this->getFolderContents($file);
-                       foreach ($children as $child) {
-                               $this->remove($child['path']);
-                       }
+                       $this->removeChildren($entry);
                }
+       }
 
-               $sql = 'DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?';
+       private function getSubFolders($entry) {
+               $children = $this->getFolderContentsById($entry['fileid']);
+               return array_filter($children, function ($child) {
+                       return $child['mimetype'] === 'httpd/unix-directory';
+               });
+       }
+
+       private function removeChildren($entry) {
+               $subFolders = $this->getSubFolders($entry);
+               foreach ($subFolders as $folder) {
+                       $this->removeChildren($folder);
+               }
+               $sql = 'DELETE FROM `*PREFIX*filecache` WHERE `parent` = ?';
                \OC_DB::executeAudited($sql, array($entry['fileid']));
        }
 
@@ -520,12 +531,12 @@ class Cache {
                        '`*PREFIX*vcategory_to_object` `tagmap`, ' .
                        '`*PREFIX*vcategory` `tag` ' .
                        // JOIN filecache to vcategory_to_object
-                       'WHERE `file`.`fileid` = `tagmap`.`objid` '.
+                       'WHERE `file`.`fileid` = `tagmap`.`objid` ' .
                        // JOIN vcategory_to_object to vcategory
                        'AND `tagmap`.`type` = `tag`.`type` ' .
                        'AND `tagmap`.`categoryid` = `tag`.`id` ' .
                        // conditions
-                       'AND `file`.`storage` = ? '.
+                       'AND `file`.`storage` = ? ' .
                        'AND `tag`.`type` = \'files\' ' .
                        'AND `tag`.`uid` = ? ';
                if (is_int($tag)) {
@@ -638,7 +649,7 @@ class Cache {
         */
        public function getIncomplete() {
                $query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`'
-                       . ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC',1);
+                       . ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC', 1);
                $result = \OC_DB::executeAudited($query, array($this->getNumericStorageId()));
                if ($row = $result->fetchRow()) {
                        return $row['path'];
@@ -694,6 +705,7 @@ class Cache {
 
        /**
         * normalize the given path
+        *
         * @param string $path
         * @return string
         */