diff options
author | icewind1991 <icewind1991@gmail.com> | 2013-04-26 06:55:21 -0700 |
---|---|---|
committer | icewind1991 <icewind1991@gmail.com> | 2013-04-26 06:55:21 -0700 |
commit | 5474fea1f657b95f4007af6ef673862273f18e1c (patch) | |
tree | e4a86a03e66ead867df83b0f4267b936a2edeaec /lib | |
parent | d825669265f0296b4981a99e31a78fb514ac1146 (diff) | |
parent | 809b5f81f6ee448563462ae8f642fbb8a6a11499 (diff) | |
download | nextcloud-server-5474fea1f657b95f4007af6ef673862273f18e1c.tar.gz nextcloud-server-5474fea1f657b95f4007af6ef673862273f18e1c.zip |
Merge pull request #3136 from owncloud/mount-cleanup
Separation of mount management
Diffstat (limited to 'lib')
-rw-r--r-- | lib/files/cache/cache.php | 47 | ||||
-rw-r--r-- | lib/files/cache/storage.php | 59 | ||||
-rw-r--r-- | lib/files/filesystem.php | 39 | ||||
-rw-r--r-- | lib/files/mount/manager.php | 120 | ||||
-rw-r--r-- | lib/files/mount/mount.php (renamed from lib/files/mount.php) | 109 | ||||
-rw-r--r-- | lib/files/storage/common.php | 10 | ||||
-rw-r--r-- | lib/files/storage/storage.php | 5 | ||||
-rw-r--r-- | lib/files/view.php | 2 | ||||
-rw-r--r-- | lib/public/share.php | 2 | ||||
-rwxr-xr-x | lib/util.php | 1 |
10 files changed, 255 insertions, 139 deletions
diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php index 71b70abe3fe..857fe980be6 100644 --- a/lib/files/cache/cache.php +++ b/lib/files/cache/cache.php @@ -30,11 +30,9 @@ class Cache { private $storageId; /** - * numeric storage id - * - * @var int $numericId + * @var Storage $storageCache */ - private $numericId; + private $storageCache; private $mimetypeIds = array(); private $mimetypes = array(); @@ -52,19 +50,11 @@ class Cache { $this->storageId = md5($this->storageId); } - $query = \OC_DB::prepare('SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?'); - $result = $query->execute(array($this->storageId)); - if ($row = $result->fetchRow()) { - $this->numericId = $row['numeric_id']; - } else { - $query = \OC_DB::prepare('INSERT INTO `*PREFIX*storages`(`id`) VALUES(?)'); - $query->execute(array($this->storageId)); - $this->numericId = \OC_DB::insertid('*PREFIX*storages'); - } + $this->storageCache = new Storage($storage); } public function getNumericStorageId() { - return $this->numericId; + return $this->storageCache->getNumericId(); } /** @@ -111,7 +101,7 @@ class Cache { public function get($file) { if (is_string($file) or $file == '') { $where = 'WHERE `storage` = ? AND `path_hash` = ?'; - $params = array($this->numericId, md5($file)); + $params = array($this->getNumericStorageId(), md5($file)); } else { //file id $where = 'WHERE `fileid` = ?'; $params = array($file); @@ -198,14 +188,14 @@ class Cache { list($queryParts, $params) = $this->buildParts($data); $queryParts[] = '`storage`'; - $params[] = $this->numericId; + $params[] = $this->getNumericStorageId(); $valuesPlaceholder = array_fill(0, count($queryParts), '?'); $query = \OC_DB::prepare('INSERT INTO `*PREFIX*filecache`(' . implode(', ', $queryParts) . ')' . ' 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'); @@ -264,7 +254,7 @@ class Cache { $pathHash = md5($file); $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?'); - $result = $query->execute(array($this->numericId, $pathHash)); + $result = $query->execute(array($this->getNumericStorageId(), $pathHash)); if ($row = $result->fetchRow()) { return $row['fileid']; @@ -353,7 +343,7 @@ class Cache { */ public function clear() { $query = \OC_DB::prepare('DELETE FROM `*PREFIX*filecache` WHERE storage = ?'); - $query->execute(array($this->numericId)); + $query->execute(array($this->getNumericStorageId())); $query = \OC_DB::prepare('DELETE FROM `*PREFIX*storages` WHERE id = ?'); $query->execute(array($this->storageId)); @@ -367,7 +357,7 @@ class Cache { public function getStatus($file) { $pathHash = md5($file); $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?'); - $result = $query->execute(array($this->numericId, $pathHash)); + $result = $query->execute(array($this->getNumericStorageId(), $pathHash)); if ($row = $result->fetchRow()) { if ((int)$row['size'] === -1) { return self::SHALLOW; @@ -394,7 +384,7 @@ class Cache { SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `etag` FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `storage` = ?' ); - $result = $query->execute(array($pattern, $this->numericId)); + $result = $query->execute(array($pattern, $this->getNumericStorageId())); $files = array(); while ($row = $result->fetchRow()) { $row['mimetype'] = $this->getMimetype($row['mimetype']); @@ -421,7 +411,7 @@ class Cache { FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `storage` = ?' ); $mimetype = $this->getMimetypeId($mimetype); - $result = $query->execute(array($mimetype, $this->numericId)); + $result = $query->execute(array($mimetype, $this->getNumericStorageId())); $files = array(); while ($row = $result->fetchRow()) { $row['mimetype'] = $this->getMimetype($row['mimetype']); @@ -459,7 +449,7 @@ class Cache { return 0; } $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*filecache` WHERE `parent` = ? AND `storage` = ?'); - $result = $query->execute(array($id, $this->numericId)); + $result = $query->execute(array($id, $this->getNumericStorageId())); $totalSize = 0; $hasChilds = 0; while ($row = $result->fetchRow()) { @@ -486,7 +476,7 @@ class Cache { */ public function getAll() { $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ?'); - $result = $query->execute(array($this->numericId)); + $result = $query->execute(array($this->getNumericStorageId())); $ids = array(); while ($row = $result->fetchRow()) { $ids[] = $row['fileid']; @@ -506,7 +496,7 @@ class Cache { public function getIncomplete() { $query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`' . ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1'); - $result = $query->execute(array($this->numericId)); + $result = $query->execute(array($this->getNumericStorageId())); if ($row = $result->fetchRow()) { return $row['path']; } else { @@ -517,6 +507,7 @@ class Cache { /** * get the storage id of the storage for a file and the internal path of the file * + * @param int $id * @return array, first element holding the storage id, second the path */ static public function getById($id) { @@ -529,10 +520,8 @@ class Cache { return null; } - $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?'); - $result = $query->execute(array($numericId)); - if ($row = $result->fetchRow()) { - return array($row['id'], $path); + if ($id = Storage::getStorageId($numericId)) { + return array($id, $path); } else { return null; } diff --git a/lib/files/cache/storage.php b/lib/files/cache/storage.php new file mode 100644 index 00000000000..72de376798c --- /dev/null +++ b/lib/files/cache/storage.php @@ -0,0 +1,59 @@ +<?php +/** + * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Cache; + +/** + * Class Storage + * + * cache storage specific data + * + * @package OC\Files\Cache + */ +class Storage { + private $storageId; + private $numericId; + + /** + * @param \OC\Files\Storage\Storage|string $storage + */ + public function __construct($storage) { + if ($storage instanceof \OC\Files\Storage\Storage) { + $this->storageId = $storage->getId(); + } else { + $this->storageId = $storage; + } + if (strlen($this->storageId) > 64) { + $this->storageId = md5($this->storageId); + } + + $query = \OC_DB::prepare('SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?'); + $result = $query->execute(array($this->storageId)); + if ($row = $result->fetchRow()) { + $this->numericId = $row['numeric_id']; + } else { + $query = \OC_DB::prepare('INSERT INTO `*PREFIX*storages`(`id`) VALUES(?)'); + $query->execute(array($this->storageId)); + $this->numericId = \OC_DB::insertid('*PREFIX*storages'); + } + } + + public function getNumericId() { + return $this->numericId; + } + + public static function getStorageId($numericId) { + $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?'); + $result = $query->execute(array($numericId)); + if ($row = $result->fetchRow()) { + return $row['id']; + } else { + return null; + } + } +} diff --git a/lib/files/filesystem.php b/lib/files/filesystem.php index 09732e67ac6..ad21a98fabc 100644 --- a/lib/files/filesystem.php +++ b/lib/files/filesystem.php @@ -34,6 +34,11 @@ const FREE_SPACE_UNKNOWN = -2; const FREE_SPACE_UNLIMITED = -3; class Filesystem { + /** + * @var Mount\Manager $mounts + */ + private static $mounts; + public static $loaded = false; /** * @var \OC\Files\View $defaultInstance @@ -147,7 +152,7 @@ class Filesystem { * @return string */ static public function getMountPoint($path) { - $mount = Mount::find($path); + $mount = self::$mounts->find($path); if ($mount) { return $mount->getMountPoint(); } else { @@ -163,7 +168,7 @@ class Filesystem { */ static public function getMountPoints($path) { $result = array(); - $mounts = Mount::findIn($path); + $mounts = self::$mounts->findIn($path); foreach ($mounts as $mount) { $result[] = $mount->getMountPoint(); } @@ -177,18 +182,34 @@ class Filesystem { * @return \OC\Files\Storage\Storage */ public static function getStorage($mountPoint) { - $mount = Mount::find($mountPoint); + $mount = self::$mounts->find($mountPoint); return $mount->getStorage(); } /** + * @param $id + * @return Mount\Mount[] + */ + public static function getMountByStorageId($id) { + return self::$mounts->findByStorageId($id); + } + + /** + * @param $id + * @return Mount\Mount[] + */ + public static function getMountByNumericId($id) { + return self::$mounts->findByStorageId($id); + } + + /** * resolve a path to a storage and internal path * * @param string $path * @return array consisting of the storage and the internal path */ static public function resolvePath($path) { - $mount = Mount::find($path); + $mount = self::$mounts->find($path); if ($mount) { return array($mount->getStorage(), $mount->getInternalPath($path)); } else { @@ -201,6 +222,7 @@ class Filesystem { return false; } self::$defaultInstance = new View($root); + self::$mounts = new Mount\Manager(); //load custom mount config self::initMountPoints($user); @@ -210,6 +232,10 @@ class Filesystem { return true; } + static public function initMounts(){ + self::$mounts = new Mount\Manager(); + } + /** * Initialize system and personal mount points for a user * @@ -328,7 +354,7 @@ class Filesystem { * clear all mounts and storage backends */ public static function clearMounts() { - Mount::clear(); + self::$mounts->clear(); } /** @@ -339,7 +365,8 @@ class Filesystem { * @param string $mountpoint */ static public function mount($class, $arguments, $mountpoint) { - new Mount($class, $mountpoint, $arguments); + $mount = new Mount\Mount($class, $mountpoint, $arguments); + self::$mounts->addMount($mount); } /** diff --git a/lib/files/mount/manager.php b/lib/files/mount/manager.php new file mode 100644 index 00000000000..25a5fe241cc --- /dev/null +++ b/lib/files/mount/manager.php @@ -0,0 +1,120 @@ +<?php +/** + * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Mount; + +use \OC\Files\Filesystem; + +class Manager { + /** + * @var Mount[] + */ + private $mounts = array(); + + /** + * @param Mount $mount + */ + public function addMount($mount) { + $this->mounts[$mount->getMountPoint()] = $mount; + } + + /** + * Find the mount for $path + * + * @param $path + * @return Mount + */ + public function find($path) { + \OC_Util::setupFS(); + $path = $this->formatPath($path); + if (isset($this->mounts[$path])) { + return $this->mounts[$path]; + } + + \OC_Hook::emit('OC_Filesystem', 'get_mountpoint', array('path' => $path)); + $foundMountPoint = ''; + $mountPoints = array_keys($this->mounts); + foreach ($mountPoints as $mountpoint) { + if (strpos($path, $mountpoint) === 0 and strlen($mountpoint) > strlen($foundMountPoint)) { + $foundMountPoint = $mountpoint; + } + } + if (isset($this->mounts[$foundMountPoint])) { + return $this->mounts[$foundMountPoint]; + } else { + return null; + } + } + + /** + * Find all mounts in $path + * + * @param $path + * @return Mount[] + */ + public function findIn($path) { + \OC_Util::setupFS(); + $path = $this->formatPath($path); + $result = array(); + $pathLength = strlen($path); + $mountPoints = array_keys($this->mounts); + foreach ($mountPoints as $mountPoint) { + if (substr($mountPoint, 0, $pathLength) === $path and strlen($mountPoint) > $pathLength) { + $result[] = $this->mounts[$mountPoint]; + } + } + return $result; + } + + public function clear() { + $this->mounts = array(); + } + + /** + * Find mounts by storage id + * + * @param string $id + * @return Mount[] + */ + public function findByStorageId($id) { + \OC_Util::setupFS(); + if (strlen($id) > 64) { + $id = md5($id); + } + $result = array(); + foreach ($this->mounts as $mount) { + if ($mount->getStorageId() === $id) { + $result[] = $mount; + } + } + return $result; + } + + /** + * Find mounts by numeric storage id + * + * @param string $id + * @return Mount + */ + public function findByNumericId($id) { + $storageId = \OC\Files\Cache\Storage::getStorageId($id); + return $this->findByStorageId($storageId); + } + + /** + * @param string $path + * @return string + */ + private function formatPath($path) { + $path = Filesystem::normalizePath($path); + if (strlen($path) > 1) { + $path .= '/'; + } + return $path; + } +} diff --git a/lib/files/mount.php b/lib/files/mount/mount.php index 0030d0ee7a6..69b8285ab4c 100644 --- a/lib/files/mount.php +++ b/lib/files/mount/mount.php @@ -6,13 +6,12 @@ * See the COPYING-README file. */ -namespace OC\Files; +namespace OC\Files\Mount; + +use \OC\Files\Filesystem; class Mount { - /** - * @var Mount[] - */ - static private $mounts = array(); + /** * @var \OC\Files\Storage\Storage $storage @@ -33,7 +32,7 @@ class Mount { $arguments = array(); } - $mountpoint = self::formatPath($mountpoint); + $mountpoint = $this->formatPath($mountpoint); if ($storage instanceof \OC\Files\Storage\Storage) { $this->class = get_class($storage); $this->storage = $storage; @@ -46,8 +45,6 @@ class Mount { $this->arguments = $arguments; } $this->mountPoint = $mountpoint; - - self::$mounts[$this->mountPoint] = $this; } /** @@ -58,6 +55,8 @@ class Mount { } /** + * create the storage that is mounted + * * @return \OC\Files\Storage\Storage */ private function createStorage() { @@ -121,103 +120,11 @@ class Mount { * @param string $path * @return string */ - private static function formatPath($path) { + private function formatPath($path) { $path = Filesystem::normalizePath($path); if (strlen($path) > 1) { $path .= '/'; } return $path; } - - /** - * Find the mount for $path - * - * @param $path - * @return Mount - */ - public static function find($path) { - \OC_Util::setupFS(); - $path = self::formatPath($path); - if (isset(self::$mounts[$path])) { - return self::$mounts[$path]; - } - - \OC_Hook::emit('OC_Filesystem', 'get_mountpoint', array('path' => $path)); - $foundMountPoint = ''; - $mountPoints = array_keys(self::$mounts); - foreach ($mountPoints as $mountpoint) { - if (strpos($path, $mountpoint) === 0 and strlen($mountpoint) > strlen($foundMountPoint)) { - $foundMountPoint = $mountpoint; - } - } - if (isset(self::$mounts[$foundMountPoint])) { - return self::$mounts[$foundMountPoint]; - } else { - return null; - } - } - - /** - * Find all mounts in $path - * - * @param $path - * @return Mount[] - */ - public static function findIn($path) { - \OC_Util::setupFS(); - $path = self::formatPath($path); - $result = array(); - $pathLength = strlen($path); - $mountPoints = array_keys(self::$mounts); - foreach ($mountPoints as $mountPoint) { - if (substr($mountPoint, 0, $pathLength) === $path and strlen($mountPoint) > $pathLength) { - $result[] = self::$mounts[$mountPoint]; - } - } - return $result; - } - - public static function clear() { - self::$mounts = array(); - } - - /** - * Find mounts by storage id - * - * @param string $id - * @return Mount[] - */ - public static function findByStorageId($id) { - \OC_Util::setupFS(); - if (strlen($id) > 64) { - $id = md5($id); - } - $result = array(); - foreach (self::$mounts as $mount) { - if ($mount->getStorageId() === $id) { - $result[] = $mount; - } - } - return $result; - } - - /** - * Find mounts by numeric storage id - * - * @param string $id - * @return Mount - */ - public static function findByNumericId($id) { - $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?'); - $result = $query->execute(array($id))->fetchOne(); - if ($result) { - $id = $result; - foreach (self::$mounts as $mount) { - if ($mount->getStorageId() === $id) { - return $mount; - } - } - } - return false; - } } diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php index 38fe5e546f6..e87fe3b5239 100644 --- a/lib/files/storage/common.php +++ b/lib/files/storage/common.php @@ -25,6 +25,7 @@ abstract class Common implements \OC\Files\Storage\Storage { private $scanner; private $permissioncache; private $watcher; + private $storageCache; public function __construct($parameters) { } @@ -300,6 +301,13 @@ abstract class Common implements \OC\Files\Storage\Storage { return $this->watcher; } + public function getStorageCache(){ + if (!isset($this->storageCache)) { + $this->storageCache = new \OC\Files\Cache\Storage($this); + } + return $this->storageCache; + } + /** * get the owner of a path * @@ -361,7 +369,7 @@ abstract class Common implements \OC\Files\Storage\Storage { * get the free space in the storage * * @param $path - * return int + * @return int */ public function free_space($path) { return \OC\Files\FREE_SPACE_UNKNOWN; diff --git a/lib/files/storage/storage.php b/lib/files/storage/storage.php index 1da82da2163..c96caebf4af 100644 --- a/lib/files/storage/storage.php +++ b/lib/files/storage/storage.php @@ -329,6 +329,11 @@ interface Storage { public function getWatcher($path = ''); /** + * @return \OC\Files\Cache\Storage + */ + public function getStorageCache(); + + /** * get the ETag for a file or folder * * @param string $path diff --git a/lib/files/view.php b/lib/files/view.php index 0da104c107e..f89b7f66ffd 100644 --- a/lib/files/view.php +++ b/lib/files/view.php @@ -977,7 +977,7 @@ class View { */ public function getPath($id) { list($storage, $internalPath) = Cache\Cache::getById($id); - $mounts = Mount::findByStorageId($storage); + $mounts = Filesystem::getMountByStorageId($storage); foreach ($mounts as $mount) { /** * @var \OC\Files\Mount $mount diff --git a/lib/public/share.php b/lib/public/share.php index 4b337530be8..525fe7e8533 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -875,7 +875,7 @@ class Share { $row['path'] = '/Shared/'.basename($row['path']); } else { if (!isset($mounts[$row['storage']])) { - $mounts[$row['storage']] = \OC\Files\Mount::findByNumericId($row['storage']); + $mounts[$row['storage']] = \OC\Files\Filesystem::getMountByNumericId($row['storage']); } if ($mounts[$row['storage']]) { $path = $mounts[$row['storage']]->getMountPoint().$row['path']; diff --git a/lib/util.php b/lib/util.php index 810593358a5..f62c2a42d73 100755 --- a/lib/util.php +++ b/lib/util.php @@ -38,6 +38,7 @@ class OC_Util { $CONFIG_DATADIRECTORY = OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" ); //first set up the local "root" storage + \OC\Files\Filesystem::initMounts(); if(!self::$rootMounted) { \OC\Files\Filesystem::mount('\OC\Files\Storage\Local', array('datadir'=>$CONFIG_DATADIRECTORY), '/'); self::$rootMounted=true; |