From f605c985311fc652d1744704061af38f3ac62919 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 13 Apr 2015 17:09:18 +0200 Subject: [PATCH] Fix cross storage move with shared storages --- apps/files_sharing/lib/cache.php | 17 +++++++---------- apps/files_sharing/lib/sharedstorage.php | 5 ++++- lib/private/files/cache/cache.php | 19 ++++++++++++++++--- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 2f982ec9dc6..49f5a4e8e7c 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -235,18 +235,15 @@ class Shared_Cache extends Cache { } /** - * Move a file or folder in the cache + * Get the storage id and path needed for a move * - * @param string $source - * @param string $target + * @param string $path + * @return array [$storageId, $internalPath] */ - public function move($source, $target) { - if ($cache = $this->getSourceCache($source)) { - $file = \OC_Share_Backend_File::getSource($target, $this->storage->getMountPoint(), $this->storage->getItemType()); - if ($file && isset($file['path'])) { - $cache->move($this->files[$source], $file['path']); - } - } + protected function getMoveInfo($path) { + $cache = $this->getSourceCache($path); + $file = \OC_Share_Backend_File::getSource($path, $this->storage->getMountPoint(), $this->storage->getItemType()); + return [$cache->getNumericStorageId(), $file['path']]; } /** diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 6e3abb1f56c..c2253fcaa3c 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -327,7 +327,10 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { $targetFilename = basename($relPath2); list($user2, $path2) = \OCA\Files_Sharing\Helper::getUidAndFilename(dirname($relPath2)); $rootView = new \OC\Files\View(''); - return $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename); + $rootView->getUpdater()->disable(); // dont update the cache here + $result = $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename); + $rootView->getUpdater()->enable(); + return $result; } public function copy($path1, $path2) { diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index ee9da231090..f00177d9c5b 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -438,6 +438,16 @@ class Cache { $this->moveFromCache($this, $source, $target); } + /** + * Get the storage id and path needed for a move + * + * @param string $path + * @return array [$storageId, $internalPath] + */ + protected function getMoveInfo($path) { + return [$this->getNumericStorageId(), $path]; + } + /** * Move a file or folder in the cache * @@ -455,10 +465,13 @@ class Cache { $sourceId = $sourceData['fileid']; $newParentId = $this->getParentId($targetPath); + list($sourceStorageId, $sourcePath) = $sourceCache->getMoveInfo($sourcePath); + list($targetStorageId, $targetPath) = $this->getMoveInfo($targetPath); + if ($sourceData['mimetype'] === 'httpd/unix-directory') { //find all child entries $sql = 'SELECT `path`, `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path` LIKE ?'; - $result = \OC_DB::executeAudited($sql, [$sourceCache->getNumericStorageId(), $sourcePath . '/%']); + $result = \OC_DB::executeAudited($sql, [$sourceStorageId, $sourcePath . '/%']); $childEntries = $result->fetchAll(); $sourceLength = strlen($sourcePath); \OC_DB::beginTransaction(); @@ -466,13 +479,13 @@ class Cache { foreach ($childEntries as $child) { $newTargetPath = $targetPath . substr($child['path'], $sourceLength); - \OC_DB::executeAudited($query, [$this->getNumericStorageId(), $newTargetPath, md5($newTargetPath), $child['fileid']]); + \OC_DB::executeAudited($query, [$targetStorageId, $newTargetPath, md5($newTargetPath), $child['fileid']]); } \OC_DB::commit(); } $sql = 'UPDATE `*PREFIX*filecache` SET `storage` = ?, `path` = ?, `path_hash` = ?, `name` = ?, `parent` =? WHERE `fileid` = ?'; - \OC_DB::executeAudited($sql, [$this->getNumericStorageId(), $targetPath, md5($targetPath), basename($targetPath), $newParentId, $sourceId]); + \OC_DB::executeAudited($sql, [$targetStorageId, $targetPath, md5($targetPath), basename($targetPath), $newParentId, $sourceId]); } /** -- 2.39.5