diff options
-rw-r--r-- | apps/files_sharing/lib/cache.php | 31 | ||||
-rw-r--r-- | apps/files_sharing/lib/watcher.php | 6 | ||||
-rw-r--r-- | lib/private/files/cache/watcher.php | 11 | ||||
-rw-r--r-- | lib/private/files/view.php | 43 | ||||
-rw-r--r-- | tests/lib/files/view.php | 5 |
5 files changed, 53 insertions, 43 deletions
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index e4fd85fd2a7..270ed704bbd 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -145,26 +145,23 @@ class Shared_Cache extends Cache { /** * get the metadata of all files stored in $folder * - * @param string $folder + * @param string $folderId * @return array */ - public function getFolderContents($folder) { - - if ($folder === false) { - $folder = ''; - } - - $dir = ($folder !== '') ? $folder . '/' : ''; - - $cache = $this->getSourceCache($folder); + public function getFolderContentsById($folderId) { + $cache = $this->getSourceCache(''); if ($cache) { - $parent = $this->storage->getFile($folder); - $sourceFolderContent = $cache->getFolderContents($this->files[$folder]); - foreach ($sourceFolderContent as $key => $c) { - $sourceFolderContent[$key]['path'] = $dir . $c['name']; - $sourceFolderContent[$key]['uid_owner'] = $parent['uid_owner']; - $sourceFolderContent[$key]['displayname_owner'] = \OC_User::getDisplayName($parent['uid_owner']); - $sourceFolderContent[$key]['permissions'] = $sourceFolderContent[$key]['permissions'] & $this->storage->getPermissions($dir . $c['name']); + $owner = $this->storage->getSharedFrom(); + $parentPath = $this->getPathById($folderId); + if ($parentPath !== '') { + $parentPath .= '/'; + } + $sourceFolderContent = $cache->getFolderContentsById($folderId); + foreach ($sourceFolderContent as &$c) { + $c['path'] = ltrim($parentPath . $c['name'], '/'); + $c['uid_owner'] = $owner; + $c['displayname_owner'] = \OC_User::getDisplayName($owner); + $c['permissions'] = $c['permissions'] & $this->storage->getPermissions(false); } return $sourceFolderContent; diff --git a/apps/files_sharing/lib/watcher.php b/apps/files_sharing/lib/watcher.php index 11d3ce1cabd..5357119ab6c 100644 --- a/apps/files_sharing/lib/watcher.php +++ b/apps/files_sharing/lib/watcher.php @@ -30,9 +30,11 @@ class Shared_Watcher extends Watcher { * check $path for updates * * @param string $path + * @param array $cachedEntry + * @return boolean true if path was updated */ - public function checkUpdate($path) { - if (parent::checkUpdate($path) === true) { + public function checkUpdate($path, $cachedEntry = null) { + if (parent::checkUpdate($path, $cachedEntry) === true) { // since checkUpdate() has already updated the size of the subdirs, // only apply the update to the owner's parent dirs diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php index 5a4f53fb73d..f4572895b09 100644 --- a/lib/private/files/cache/watcher.php +++ b/lib/private/files/cache/watcher.php @@ -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; } diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 3d3406af94e..5f5f29ded4f 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -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,26 +957,32 @@ 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(); - if ($cache->getStatus($internalPath) < Cache\Cache::COMPLETE) { + $data = $cache->get($internalPath); + $watcher = $storage->getWatcher($internalPath); + if (!$data or $data['size'] === -1) { + if (!$storage->file_exists($internalPath)) { + return array(); + } $scanner = $storage->getScanner($internalPath); $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); - } else { - $watcher = $storage->getWatcher($internalPath); - $watcher->checkUpdate($internalPath); + $data = $cache->get($internalPath); + } else if ($watcher->checkUpdate($internalPath, $data)) { + $data = $cache->get($internalPath); } - $folderId = $cache->getId($internalPath); + $folderId = $data['fileid']; /** * @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']); @@ -1032,7 +1039,7 @@ class View { break; } } - $rootEntry['path'] = substr($path . '/' . $rootEntry['name'], strlen($user) + 2); // full path without /$user/ + $rootEntry['path'] = substr(Filesystem::normalizePath($path . '/' . $rootEntry['name']), strlen($user) + 2); // full path without /$user/ // if sharing was disabled for the user we remove the share permissions if (\OCP\Util::isSharingDisabledForUser()) { @@ -1213,7 +1220,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); diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index 8d56ecd9003..5f030f29fa7 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -177,8 +177,9 @@ class View extends \PHPUnit_Framework_TestCase { function testCacheIncompleteFolder() { $storage1 = $this->getTestStorage(false); - \OC\Files\Filesystem::mount($storage1, array(), '/'); - $rootView = new \OC\Files\View(''); + \OC\Files\Filesystem::clearMounts(); + \OC\Files\Filesystem::mount($storage1, array(), '/incomplete'); + $rootView = new \OC\Files\View('/incomplete'); $entries = $rootView->getDirectoryContent('/'); $this->assertEquals(3, count($entries)); |