move the cache api from OC_Files to filesystem(view)
This commit is contained in:
parent
0e2bf8d373
commit
39adadd3e3
|
@ -28,98 +28,6 @@
|
||||||
class OC_Files {
|
class OC_Files {
|
||||||
static $tmpFiles = array();
|
static $tmpFiles = array();
|
||||||
|
|
||||||
/**
|
|
||||||
* get the filesystem info
|
|
||||||
*
|
|
||||||
* @param string $path
|
|
||||||
* @return array
|
|
||||||
*
|
|
||||||
* returns an associative array with the following keys:
|
|
||||||
* - size
|
|
||||||
* - mtime
|
|
||||||
* - mimetype
|
|
||||||
* - encrypted
|
|
||||||
* - versioned
|
|
||||||
*/
|
|
||||||
public static function getFileInfo($path) {
|
|
||||||
$path = \OC\Files\Filesystem::normalizePath($path);
|
|
||||||
/**
|
|
||||||
* @var \OC\Files\Storage\Storage $storage
|
|
||||||
* @var string $path
|
|
||||||
*/
|
|
||||||
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($path);
|
|
||||||
$cache = $storage->getCache();
|
|
||||||
|
|
||||||
if (!$cache->inCache($internalPath)) {
|
|
||||||
$scanner = $storage->getScanner();
|
|
||||||
$scanner->scan($internalPath, \OC\Files\Cache\Scanner::SCAN_SHALLOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $cache->get($internalPath);
|
|
||||||
|
|
||||||
if ($data['mimetype'] === 'httpd/unix-directory') {
|
|
||||||
//add the sizes of other mountpoints to the folder
|
|
||||||
$mountPoints = \OC\Files\Filesystem::getMountPoints($path);
|
|
||||||
foreach ($mountPoints as $mountPoint) {
|
|
||||||
$subStorage = \OC\Files\Filesystem::getStorage($mountPoint);
|
|
||||||
$subCache = $subStorage->getCache();
|
|
||||||
$rootEntry = $subCache->get('');
|
|
||||||
|
|
||||||
$data['size'] += $rootEntry['size'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the content of a directory
|
|
||||||
*
|
|
||||||
* @param string $directory path under datadirectory
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function getDirectoryContent($directory, $mimetype_filter = '') {
|
|
||||||
$path = \OC\Files\Filesystem::normalizePath($directory);
|
|
||||||
/**
|
|
||||||
* @var \OC\Files\Storage\Storage $storage
|
|
||||||
* @var string $path
|
|
||||||
*/
|
|
||||||
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($path);
|
|
||||||
$cache = $storage->getCache();
|
|
||||||
|
|
||||||
if (!$cache->inCache($internalPath)) {
|
|
||||||
$scanner = $storage->getScanner();
|
|
||||||
$scanner->scan($internalPath, \OC\Files\Cache\Scanner::SCAN_SHALLOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
$files = $cache->getFolderContents($internalPath); //TODO: mimetype_filter
|
|
||||||
|
|
||||||
//add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders
|
|
||||||
$mountPoints = \OC\Files\Filesystem::getMountPoints($directory);
|
|
||||||
$dirLength = strlen($path);
|
|
||||||
foreach ($mountPoints as $mountPoint) {
|
|
||||||
$subStorage = \OC\Files\Filesystem::getStorage($mountPoint);
|
|
||||||
$subCache = $subStorage->getCache();
|
|
||||||
$rootEntry = $subCache->get('');
|
|
||||||
|
|
||||||
$relativePath = trim(substr($mountPoint, $dirLength), '/');
|
|
||||||
if ($pos = strpos($relativePath, '/')) { //mountpoint inside subfolder add size to the correct folder
|
|
||||||
$entryName = substr($relativePath, 0, $pos);
|
|
||||||
foreach ($files as &$entry) {
|
|
||||||
if ($entry['name'] === $entryName) {
|
|
||||||
$entry['size'] += $rootEntry['size'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { //mountpoint in this folder, add an entry for it
|
|
||||||
$rootEntry['name'] = $relativePath;
|
|
||||||
$files[] = $rootEntry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
usort($files, "fileCmp"); //TODO: remove this once ajax is merged
|
|
||||||
return $files;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function searchByMime($mimetype_filter) {
|
public static function searchByMime($mimetype_filter) {
|
||||||
$files = array();
|
$files = array();
|
||||||
$dirs_to_check = array('');
|
$dirs_to_check = array('');
|
||||||
|
|
|
@ -8,6 +8,11 @@
|
||||||
|
|
||||||
namespace OC\Files\Cache;
|
namespace OC\Files\Cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Metadata cache for the filesystem
|
||||||
|
*
|
||||||
|
* don't use this class directly if you need to get metadata, use \OC\Files\Filesystem::getFileInfo instead
|
||||||
|
*/
|
||||||
class Cache {
|
class Cache {
|
||||||
const NOT_FOUND = 0;
|
const NOT_FOUND = 0;
|
||||||
const PARTIAL = 1; //only partial data available, file not cached in the database
|
const PARTIAL = 1; //only partial data available, file not cached in the database
|
||||||
|
|
|
@ -609,6 +609,33 @@ class Filesystem {
|
||||||
}
|
}
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the filesystem info
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* returns an associative array with the following keys:
|
||||||
|
* - size
|
||||||
|
* - mtime
|
||||||
|
* - mimetype
|
||||||
|
* - encrypted
|
||||||
|
* - versioned
|
||||||
|
*/
|
||||||
|
public static function getFileInfo($path) {
|
||||||
|
return self::$defaultInstance->getFileInfo($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the content of a directory
|
||||||
|
*
|
||||||
|
* @param string $directory path under datadirectory
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getDirectoryContent($directory, $mimetype_filter = '') {
|
||||||
|
return self::$defaultInstance->getDirectoryContent($directory, $mimetype_filter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
\OC_Hook::connect('OC_Filesystem', 'post_write', 'OC_Filesystem', 'removeETagHook');
|
\OC_Hook::connect('OC_Filesystem', 'post_write', 'OC_Filesystem', 'removeETagHook');
|
||||||
|
|
|
@ -645,4 +645,96 @@ class View {
|
||||||
public function hasUpdated($path, $time) {
|
public function hasUpdated($path, $time) {
|
||||||
return $this->basicOperation('hasUpdated', $path, array(), $time);
|
return $this->basicOperation('hasUpdated', $path, array(), $time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the filesystem info
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* returns an associative array with the following keys:
|
||||||
|
* - size
|
||||||
|
* - mtime
|
||||||
|
* - mimetype
|
||||||
|
* - encrypted
|
||||||
|
* - versioned
|
||||||
|
*/
|
||||||
|
public function getFileInfo($path) {
|
||||||
|
$path = \OC\Files\Filesystem::normalizePath($this->fakeRoot . '/' . $path);
|
||||||
|
/**
|
||||||
|
* @var \OC\Files\Storage\Storage $storage
|
||||||
|
* @var string $path
|
||||||
|
*/
|
||||||
|
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($path);
|
||||||
|
$cache = $storage->getCache();
|
||||||
|
|
||||||
|
if (!$cache->inCache($internalPath)) {
|
||||||
|
$scanner = $storage->getScanner();
|
||||||
|
$scanner->scan($internalPath, \OC\Files\Cache\Scanner::SCAN_SHALLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = $cache->get($internalPath);
|
||||||
|
|
||||||
|
if ($data['mimetype'] === 'httpd/unix-directory') {
|
||||||
|
//add the sizes of other mountpoints to the folder
|
||||||
|
$mountPoints = \OC\Files\Filesystem::getMountPoints($path);
|
||||||
|
foreach ($mountPoints as $mountPoint) {
|
||||||
|
$subStorage = \OC\Files\Filesystem::getStorage($mountPoint);
|
||||||
|
$subCache = $subStorage->getCache();
|
||||||
|
$rootEntry = $subCache->get('');
|
||||||
|
|
||||||
|
$data['size'] += $rootEntry['size'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the content of a directory
|
||||||
|
*
|
||||||
|
* @param string $directory path under datadirectory
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getDirectoryContent($directory, $mimetype_filter = '') {
|
||||||
|
$path = \OC\Files\Filesystem::normalizePath($this->fakeRoot . '/' . $directory);
|
||||||
|
/**
|
||||||
|
* @var \OC\Files\Storage\Storage $storage
|
||||||
|
* @var string $path
|
||||||
|
*/
|
||||||
|
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($path);
|
||||||
|
$cache = $storage->getCache();
|
||||||
|
|
||||||
|
if (!$cache->inCache($internalPath)) {
|
||||||
|
$scanner = $storage->getScanner();
|
||||||
|
$scanner->scan($internalPath, \OC\Files\Cache\Scanner::SCAN_SHALLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
$files = $cache->getFolderContents($internalPath); //TODO: mimetype_filter
|
||||||
|
|
||||||
|
//add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders
|
||||||
|
$mountPoints = \OC\Files\Filesystem::getMountPoints($directory);
|
||||||
|
$dirLength = strlen($path);
|
||||||
|
foreach ($mountPoints as $mountPoint) {
|
||||||
|
$subStorage = \OC\Files\Filesystem::getStorage($mountPoint);
|
||||||
|
$subCache = $subStorage->getCache();
|
||||||
|
$rootEntry = $subCache->get('');
|
||||||
|
|
||||||
|
$relativePath = trim(substr($mountPoint, $dirLength), '/');
|
||||||
|
if ($pos = strpos($relativePath, '/')) { //mountpoint inside subfolder add size to the correct folder
|
||||||
|
$entryName = substr($relativePath, 0, $pos);
|
||||||
|
foreach ($files as &$entry) {
|
||||||
|
if ($entry['name'] === $entryName) {
|
||||||
|
$entry['size'] += $rootEntry['size'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { //mountpoint in this folder, add an entry for it
|
||||||
|
$rootEntry['name'] = $relativePath;
|
||||||
|
$files[] = $rootEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usort($files, "fileCmp"); //TODO: remove this once ajax is merged
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,11 @@
|
||||||
* later.
|
* later.
|
||||||
* See the COPYING-README file. */
|
* See the COPYING-README file. */
|
||||||
|
|
||||||
|
namespace Test\Files;
|
||||||
|
|
||||||
use \OC\Files\Filesystem as Filesystem;
|
use \OC\Files\Filesystem as Filesystem;
|
||||||
|
|
||||||
class Test_Files extends PHPUnit_Framework_TestCase {
|
class View extends \PHPUnit_Framework_TestCase {
|
||||||
/**
|
/**
|
||||||
* @var \OC\Files\Storage\Storage[] $storages;
|
* @var \OC\Files\Storage\Storage[] $storages;
|
||||||
*/
|
*/
|
||||||
|
@ -35,19 +37,21 @@ class Test_Files extends PHPUnit_Framework_TestCase {
|
||||||
$imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png');
|
$imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png');
|
||||||
$storageSize = $textSize * 2 + $imageSize;
|
$storageSize = $textSize * 2 + $imageSize;
|
||||||
|
|
||||||
$cachedData = OC_Files::getFileInfo('/foo.txt');
|
$rootView = new \OC\Files\View('');
|
||||||
|
|
||||||
|
$cachedData = $rootView->getFileInfo('/foo.txt');
|
||||||
$this->assertEquals($textSize, $cachedData['size']);
|
$this->assertEquals($textSize, $cachedData['size']);
|
||||||
$this->assertEquals('text/plain', $cachedData['mimetype']);
|
$this->assertEquals('text/plain', $cachedData['mimetype']);
|
||||||
|
|
||||||
$cachedData = OC_Files::getFileInfo('/');
|
$cachedData = $rootView->getFileInfo('/');
|
||||||
$this->assertEquals($storageSize * 3, $cachedData['size']);
|
$this->assertEquals($storageSize * 3, $cachedData['size']);
|
||||||
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
||||||
|
|
||||||
$cachedData = OC_Files::getFileInfo('/folder');
|
$cachedData = $rootView->getFileInfo('/folder');
|
||||||
$this->assertEquals($storageSize + $textSize, $cachedData['size']);
|
$this->assertEquals($storageSize + $textSize, $cachedData['size']);
|
||||||
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
||||||
|
|
||||||
$folderData = OC_Files::getDirectoryContent('/');
|
$folderData = $rootView->getDirectoryContent('/');
|
||||||
/**
|
/**
|
||||||
* expected entries:
|
* expected entries:
|
||||||
* folder
|
* folder
|
||||||
|
@ -74,20 +78,21 @@ class Test_Files extends PHPUnit_Framework_TestCase {
|
||||||
Filesystem::mount($storage2, array(), '/substorage');
|
Filesystem::mount($storage2, array(), '/substorage');
|
||||||
$textSize = strlen("dummy file data\n");
|
$textSize = strlen("dummy file data\n");
|
||||||
$imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png');
|
$imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png');
|
||||||
$storageSize = $textSize * 2 + $imageSize;
|
|
||||||
|
|
||||||
$cachedData = \OC_Files::getFileInfo('/');
|
$rootView = new \OC\Files\View('');
|
||||||
|
|
||||||
|
$cachedData = $rootView->getFileInfo('/');
|
||||||
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
|
||||||
$this->assertEquals(-1, $cachedData['size']);
|
$this->assertEquals(-1, $cachedData['size']);
|
||||||
|
|
||||||
$folderData = \OC_Files::getDirectoryContent('/substorage/folder');
|
$folderData = $rootView->getDirectoryContent('/substorage/folder');
|
||||||
$this->assertEquals('text/plain', $folderData[0]['mimetype']);
|
$this->assertEquals('text/plain', $folderData[0]['mimetype']);
|
||||||
$this->assertEquals($textSize, $folderData[0]['size']);
|
$this->assertEquals($textSize, $folderData[0]['size']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool $scan
|
* @param bool $scan
|
||||||
* @return OC\Files\Storage\Storage
|
* @return \OC\Files\Storage\Storage
|
||||||
*/
|
*/
|
||||||
private function getTestStorage($scan = true) {
|
private function getTestStorage($scan = true) {
|
||||||
$storage = new \OC\Files\Storage\Temporary(array());
|
$storage = new \OC\Files\Storage\Temporary(array());
|
Loading…
Reference in New Issue