From f2bba59b79ab2595b78f7a28b0d5a95b80d6f40e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 2 Feb 2016 14:41:14 +0100 Subject: [PATCH] split cache->insert from cache->put --- lib/private/files/cache/cache.php | 91 +++++++++++-------- lib/private/files/cache/wrapper/cachejail.php | 7 +- .../files/cache/wrapper/cachewrapper.php | 23 ++++- lib/public/files/cache/icache.php | 13 +++ 4 files changed, 90 insertions(+), 44 deletions(-) diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 30e00b6080c..517c9fa7525 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -201,7 +201,7 @@ class Cache implements ICache { } /** - * store meta data for a file or folder + * insert or update meta data for a file or folder * * @param string $file * @param array $data @@ -214,49 +214,62 @@ class Cache implements ICache { $this->update($id, $data); return $id; } else { - // normalize file - $file = $this->normalize($file); + return $this->insert($file, $data); + } + } - if (isset($this->partial[$file])) { //add any saved partial data - $data = array_merge($this->partial[$file], $data); - unset($this->partial[$file]); - } + /** + * insert meta data for a new file or folder + * + * @param string $file + * @param array $data + * + * @return int file id + * @throws \RuntimeException + */ + public function insert($file, array $data) { + // normalize file + $file = $this->normalize($file); - $requiredFields = array('size', 'mtime', 'mimetype'); - foreach ($requiredFields as $field) { - if (!isset($data[$field])) { //data not complete save as partial and return - $this->partial[$file] = $data; - return -1; - } - } + if (isset($this->partial[$file])) { //add any saved partial data + $data = array_merge($this->partial[$file], $data); + unset($this->partial[$file]); + } - $data['path'] = $file; - $data['parent'] = $this->getParentId($file); - $data['name'] = \OC_Util::basename($file); - - list($queryParts, $params) = $this->buildParts($data); - $queryParts[] = '`storage`'; - $params[] = $this->getNumericStorageId(); - - $queryParts = array_map(function ($item) { - return trim($item, "`"); - }, $queryParts); - $values = array_combine($queryParts, $params); - if (\OC::$server->getDatabaseConnection()->insertIfNotExist('*PREFIX*filecache', $values, [ - 'storage', - 'path_hash', - ]) - ) { - return (int)$this->connection->lastInsertId('*PREFIX*filecache'); + $requiredFields = array('size', 'mtime', 'mimetype'); + foreach ($requiredFields as $field) { + if (!isset($data[$field])) { //data not complete save as partial and return + $this->partial[$file] = $data; + return -1; } + } - // The file was created in the mean time - if (($id = $this->getId($file)) > -1) { - $this->update($id, $data); - return $id; - } else { - throw new \RuntimeException('File entry could not be inserted with insertIfNotExist() but could also not be selected with getId() in order to perform an update. Please try again.'); - } + $data['path'] = $file; + $data['parent'] = $this->getParentId($file); + $data['name'] = \OC_Util::basename($file); + + list($queryParts, $params) = $this->buildParts($data); + $queryParts[] = '`storage`'; + $params[] = $this->getNumericStorageId(); + + $queryParts = array_map(function ($item) { + return trim($item, "`"); + }, $queryParts); + $values = array_combine($queryParts, $params); + if (\OC::$server->getDatabaseConnection()->insertIfNotExist('*PREFIX*filecache', $values, [ + 'storage', + 'path_hash', + ]) + ) { + return (int)$this->connection->lastInsertId('*PREFIX*filecache'); + } + + // The file was created in the mean time + if (($id = $this->getId($file)) > -1) { + $this->update($id, $data); + return $id; + } else { + throw new \RuntimeException('File entry could not be inserted with insertIfNotExist() but could also not be selected with getId() in order to perform an update. Please try again.'); } } diff --git a/lib/private/files/cache/wrapper/cachejail.php b/lib/private/files/cache/wrapper/cachejail.php index 32bd3626fcb..868e63cdf81 100644 --- a/lib/private/files/cache/wrapper/cachejail.php +++ b/lib/private/files/cache/wrapper/cachejail.php @@ -95,15 +95,16 @@ class CacheJail extends CacheWrapper { } /** - * store meta data for a file or folder + * insert meta data for a new file or folder * * @param string $file * @param array $data * * @return int file id + * @throws \RuntimeException */ - public function put($file, array $data) { - return $this->cache->put($this->getSourcePath($file), $data); + public function insert($file, array $data) { + return $this->cache->insert($this->getSourcePath($file), $data); } /** diff --git a/lib/private/files/cache/wrapper/cachewrapper.php b/lib/private/files/cache/wrapper/cachewrapper.php index 1ce4f028c75..4080883419e 100644 --- a/lib/private/files/cache/wrapper/cachewrapper.php +++ b/lib/private/files/cache/wrapper/cachewrapper.php @@ -90,15 +90,34 @@ class CacheWrapper extends Cache { } /** - * store meta data for a file or folder + * insert or update meta data for a file or folder * * @param string $file * @param array $data * * @return int file id + * @throws \RuntimeException */ public function put($file, array $data) { - return $this->cache->put($file, $data); + if (($id = $this->getId($file)) > -1) { + $this->update($id, $data); + return $id; + } else { + return $this->insert($file, $data); + } + } + + /** + * insert meta data for a new file or folder + * + * @param string $file + * @param array $data + * + * @return int file id + * @throws \RuntimeException + */ + public function insert($file, array $data) { + return $this->cache->insert($file, $data); } /** diff --git a/lib/public/files/cache/icache.php b/lib/public/files/cache/icache.php index e80c6fa2cb0..4ffb298a9e2 100644 --- a/lib/public/files/cache/icache.php +++ b/lib/public/files/cache/icache.php @@ -76,6 +76,7 @@ interface ICache { /** * store meta data for a file or folder + * This will automatically call either insert or update depending on if the file exists * * @param string $file * @param array $data @@ -86,6 +87,18 @@ interface ICache { */ public function put($file, array $data); + /** + * insert meta data for a new file or folder + * + * @param string $file + * @param array $data + * + * @return int file id + * @throws \RuntimeException + * @since 9.0.0 + */ + public function insert($file, array $data); + /** * update the metadata of an existing file or folder in the cache * -- 2.39.5