]> source.dussan.org Git - nextcloud-server.git/commitdiff
Pass the cached data to the filesystem watcher
authorRobin Appelman <icewind@owncloud.com>
Thu, 2 Oct 2014 15:37:33 +0000 (17:37 +0200)
committerRobin Appelman <icewind@owncloud.com>
Fri, 24 Oct 2014 10:32:55 +0000 (12:32 +0200)
lib/private/files/cache/watcher.php
lib/private/files/view.php

index 5a4f53fb73d539413af96ccc48c4cacdcc361a6d..f4572895b0996c01cc30597babd5f5c8f927d128 100644 (file)
@@ -55,11 +55,14 @@ class Watcher {
         * check $path for updates
         *
         * @param string $path
-        * @return boolean|array true if path was updated, otherwise the cached data is returned
+        * @param array $cachedEntry
+        * @return boolean true if path was updated
         */
-       public function checkUpdate($path) {
+       public function checkUpdate($path, $cachedEntry = null) {
                if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) {
-                       $cachedEntry = $this->cache->get($path);
+                       if (is_null($cachedEntry)) {
+                               $cachedEntry = $this->cache->get($path);
+                       }
                        $this->checkedPaths[] = $path;
                        if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) {
                                if ($this->storage->is_dir($path)) {
@@ -73,7 +76,7 @@ class Watcher {
                                $this->cache->correctFolderSize($path);
                                return true;
                        }
-                       return $cachedEntry;
+                       return false;
                } else {
                        return false;
                }
index 3d3406af94ed63868b46f3ba1837506e8c174611..a9577b193c78889164359ec9b6c8bff2bd9be57c 100644 (file)
@@ -313,7 +313,7 @@ class View {
                if (!$result) {
                        // If create file fails because of permissions on external storage like SMB folders,
                        // check file exists and return false if not.
-                       if(!$this->file_exists($path)){
+                       if (!$this->file_exists($path)) {
                                return false;
                        }
                        if (is_null($mtime)) {
@@ -891,22 +891,23 @@ class View {
                if ($storage) {
                        $cache = $storage->getCache($internalPath);
 
-                       if (!$cache->inCache($internalPath)) {
+                       $data = $cache->get($internalPath);
+                       $watcher = $storage->getWatcher($internalPath);
+
+                       // if the file is not in the cache or needs to be updated, trigger the scanner and reload the data
+                       if (!$data) {
                                if (!$storage->file_exists($internalPath)) {
                                        return false;
                                }
                                $scanner = $storage->getScanner($internalPath);
                                $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW);
-                       } else {
-                               $watcher = $storage->getWatcher($internalPath);
-                               $data = $watcher->checkUpdate($internalPath);
-                       }
-
-                       if (!is_array($data)) {
+                               $data = $cache->get($internalPath);
+                       } else if ($watcher->checkUpdate($internalPath, $data)) {
                                $data = $cache->get($internalPath);
                        }
 
                        if ($data and isset($data['fileid'])) {
+                               // upgrades from oc6 or lower might not have the permissions set in the file cache
                                if ($data['permissions'] === 0) {
                                        $data['permissions'] = $storage->getPermissions($data['path']);
                                        $cache->update($data['fileid'], array('permissions' => $data['permissions']));
@@ -956,8 +957,9 @@ class View {
                if (!Filesystem::isValidPath($directory)) {
                        return $result;
                }
-               $path = Filesystem::normalizePath($this->fakeRoot . '/' . $directory);
-               list($storage, $internalPath) = Filesystem::resolvePath($path);
+               $path = $this->getAbsolutePath($directory);
+               /** @var \OC\Files\Storage\Storage $storage */
+               list($storage, $internalPath) = $this->resolvePath($directory);
                if ($storage) {
                        $cache = $storage->getCache($internalPath);
                        $user = \OC_User::getUser();
@@ -975,7 +977,7 @@ class View {
                         * @var \OC\Files\FileInfo[] $files
                         */
                        $files = array();
-                       $contents = $cache->getFolderContents($internalPath, $folderId); //TODO: mimetype_filter
+                       $contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter
                        foreach ($contents as $content) {
                                if ($content['permissions'] === 0) {
                                        $content['permissions'] = $storage->getPermissions($content['path']);
@@ -1213,7 +1215,7 @@ class View {
         * @return string|null
         */
        public function getPath($id) {
-               $id = (int) $id;
+               $id = (int)$id;
                $manager = Filesystem::getMountManager();
                $mounts = $manager->findIn($this->fakeRoot);
                $mounts[] = $manager->find($this->fakeRoot);