From 10be42f5b7b17ca55c242960885a9b50e217af3f Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Fri, 19 Apr 2013 15:03:59 +0200
Subject: [PATCH] Cache: only look for child entires when doing a move
 operation when moving a folder

---
 lib/files/cache/cache.php       | 27 +++++++++++++++------------
 tests/lib/files/cache/cache.php |  7 ++++---
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 71b70abe3f..d30c5cd16e 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -205,7 +205,7 @@ class Cache {
 				. ' VALUES(' . implode(', ', $valuesPlaceholder) . ')');
 			$result = $query->execute($params);
 			if (\OC_DB::isError($result)) {
-				\OCP\Util::writeLog('cache', 'Insert to cache failed: '.$result, \OCP\Util::ERROR);
+				\OCP\Util::writeLog('cache', 'Insert to cache failed: ' . $result, \OCP\Util::ERROR);
 			}
 
 			return (int)\OC_DB::insertid('*PREFIX*filecache');
@@ -328,19 +328,22 @@ class Cache {
 	 * @param string $target
 	 */
 	public function move($source, $target) {
-		$sourceId = $this->getId($source);
+		$sourceData = $this->get($source);
+		$sourceId = $sourceData['fileid'];
 		$newParentId = $this->getParentId($target);
 
-		//find all child entries
-		$query = \OC_DB::prepare('SELECT `path`, `fileid` FROM `*PREFIX*filecache` WHERE `path` LIKE ?');
-		$result = $query->execute(array($source . '/%'));
-		$childEntries = $result->fetchAll();
-		$sourceLength = strlen($source);
-		$query = \OC_DB::prepare('UPDATE `*PREFIX*filecache` SET `path` = ?, `path_hash` = ? WHERE `fileid` = ?');
-
-		foreach ($childEntries as $child) {
-			$targetPath = $target . substr($child['path'], $sourceLength);
-			$query->execute(array($targetPath, md5($targetPath), $child['fileid']));
+		if ($sourceData['mimetype'] === 'httpd/unix-directory') {
+			//find all child entries
+			$query = \OC_DB::prepare('SELECT `path`, `fileid` FROM `*PREFIX*filecache` WHERE `path` LIKE ?');
+			$result = $query->execute(array($source . '/%'));
+			$childEntries = $result->fetchAll();
+			$sourceLength = strlen($source);
+			$query = \OC_DB::prepare('UPDATE `*PREFIX*filecache` SET `path` = ?, `path_hash` = ? WHERE `fileid` = ?');
+
+			foreach ($childEntries as $child) {
+				$targetPath = $target . substr($child['path'], $sourceLength);
+				$query->execute(array($targetPath, md5($targetPath), $child['fileid']));
+			}
 		}
 
 		$query = \OC_DB::prepare('UPDATE `*PREFIX*filecache` SET `path` = ?, `path_hash` = ?, `name` = ?, `parent` =?'
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index 250842805e..4051a6e234 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -162,10 +162,11 @@ class Cache extends \PHPUnit_Framework_TestCase {
 		$file4 = 'folder/foo/1';
 		$file5 = 'folder/foo/2';
 		$data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'foo/bar');
+		$folderData = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
 
-		$this->cache->put($file1, $data);
-		$this->cache->put($file2, $data);
-		$this->cache->put($file3, $data);
+		$this->cache->put($file1, $folderData);
+		$this->cache->put($file2, $folderData);
+		$this->cache->put($file3, $folderData);
 		$this->cache->put($file4, $data);
 		$this->cache->put($file5, $data);
 
-- 
GitLab