Give storages the option to implement the getById behaviour for View->getPath

This commit is contained in:
Robin Appelman 2014-03-27 16:43:34 +01:00
parent 1f6259d9c2
commit f331d5f9d4
2 changed files with 29 additions and 6 deletions

View File

@ -593,6 +593,22 @@ class Cache {
}
}
/**
* get the storage id of the storage for a file and the internal path of the file
*
* @param int $id
* @return string | null
*/
public function getPathById($id) {
$sql = 'SELECT `path` FROM `*PREFIX*filecache` WHERE `fileid` = ? AND `storage` = ?';
$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
if ($row = $result->fetchRow()) {
return $row['path'];
} else {
return null;
}
}
/**
* get the storage id of the storage for a file and the internal path of the file
*

View File

@ -1129,15 +1129,22 @@ class View {
* @return string
*/
public function getPath($id) {
list($storage, $internalPath) = Cache\Cache::getById($id);
$mounts = Filesystem::getMountByStorageId($storage);
$manager = Filesystem::getMountManager();
$mounts = $manager->findIn($this->fakeRoot);
$mounts[] = $manager->find($this->fakeRoot);
// reverse the array so we start with the storage this view is in
// which is the most likely to contain the file we're looking for
$mounts = array_reverse($mounts);
foreach ($mounts as $mount) {
/**
* @var \OC\Files\Mount $mount
* @var \OC\Files\Mount\Mount $mount
*/
$fullPath = $mount->getMountPoint() . $internalPath;
if (!is_null($path = $this->getRelativePath($fullPath))) {
return $path;
$cache = $mount->getStorage()->getCache();
if ($internalPath = $cache->getPathById($id)) {
$fullPath = $mount->getMountPoint() . $internalPath;
if (!is_null($path = $this->getRelativePath($fullPath))) {
return $path;
}
}
}
return null;