Merge pull request #7477 from owncloud/foldersize-reuse
Allow re-using already known fileinfo when calculating folder sizes
This commit is contained in:
commit
bbc2e37259
|
@ -357,9 +357,10 @@ class Shared_Cache extends Cache {
|
|||
* get the size of a folder and set it in the cache
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $entry (optional) meta data of the folder
|
||||
* @return int
|
||||
*/
|
||||
public function calculateFolderSize($path) {
|
||||
public function calculateFolderSize($path, $entry = null) {
|
||||
if ($cache = $this->getSourceCache($path)) {
|
||||
return $cache->calculateFolderSize($this->files[$path]);
|
||||
}
|
||||
|
|
|
@ -498,9 +498,10 @@ class Cache {
|
|||
* update the folder size and the size of all parent folders
|
||||
*
|
||||
* @param string|boolean $path
|
||||
* @param array $data (optional) meta data of the folder
|
||||
*/
|
||||
public function correctFolderSize($path) {
|
||||
$this->calculateFolderSize($path);
|
||||
public function correctFolderSize($path, $data = null) {
|
||||
$this->calculateFolderSize($path, $data);
|
||||
if ($path !== '') {
|
||||
$parent = dirname($path);
|
||||
if ($parent === '.' or $parent === '/') {
|
||||
|
@ -514,11 +515,14 @@ class Cache {
|
|||
* get the size of a folder and set it in the cache
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $entry (optional) meta data of the folder
|
||||
* @return int
|
||||
*/
|
||||
public function calculateFolderSize($path) {
|
||||
public function calculateFolderSize($path, $entry = null) {
|
||||
$totalSize = 0;
|
||||
$entry = $this->get($path);
|
||||
if (is_null($entry) or !isset($entry['fileid'])) {
|
||||
$entry = $this->get($path);
|
||||
}
|
||||
if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
|
||||
$id = $entry['fileid'];
|
||||
$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' .
|
||||
|
@ -540,7 +544,7 @@ class Cache {
|
|||
if ($entry['size'] !== $totalSize) {
|
||||
$update['size'] = $totalSize;
|
||||
}
|
||||
if ($entry['unencrypted_size'] !== $unencryptedSum) {
|
||||
if (!isset($entry['unencrypted_size']) or $entry['unencrypted_size'] !== $unencryptedSum) {
|
||||
$update['unencrypted_size'] = $unencryptedSum;
|
||||
}
|
||||
if (count($update) > 0) {
|
||||
|
|
|
@ -13,15 +13,21 @@ class HomeCache extends Cache {
|
|||
* get the size of a folder and set it in the cache
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $entry (optional) meta data of the folder
|
||||
* @return int
|
||||
*/
|
||||
public function calculateFolderSize($path) {
|
||||
public function calculateFolderSize($path, $entry = null) {
|
||||
if ($path !== '/' and $path !== '' and $path !== 'files' and $path !== 'files_trashbin') {
|
||||
return parent::calculateFolderSize($path);
|
||||
return parent::calculateFolderSize($path, $entry);
|
||||
} elseif ($path === '' or $path === '/') {
|
||||
// since the size of / isn't used (the size of /files is used instead) there is no use in calculating it
|
||||
return 0;
|
||||
}
|
||||
|
||||
$totalSize = 0;
|
||||
$entry = $this->get($path);
|
||||
if (is_null($entry)) {
|
||||
$entry = $this->get($path);
|
||||
}
|
||||
if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
|
||||
$id = $entry['fileid'];
|
||||
$sql = 'SELECT SUM(`size`) AS f1, ' .
|
||||
|
@ -45,6 +51,7 @@ class HomeCache extends Cache {
|
|||
|
||||
/**
|
||||
* @param string $path
|
||||
* @return array
|
||||
*/
|
||||
public function get($path) {
|
||||
$data = parent::get($path);
|
||||
|
|
|
@ -155,7 +155,7 @@ class Scanner extends BasicEmitter {
|
|||
}
|
||||
}
|
||||
if (!empty($newData)) {
|
||||
$this->cache->put($file, $newData);
|
||||
$data['fileid'] = $this->cache->put($file, $newData);
|
||||
$this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId));
|
||||
\OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId));
|
||||
}
|
||||
|
@ -173,14 +173,16 @@ class Scanner extends BasicEmitter {
|
|||
* @param string $path
|
||||
* @param bool $recursive
|
||||
* @param int $reuse
|
||||
* @return int the size of the scanned folder or -1 if the size is unknown at this stage
|
||||
* @return array with the meta data of the scanned file or folder
|
||||
*/
|
||||
public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1) {
|
||||
if ($reuse === -1) {
|
||||
$reuse = ($recursive === self::SCAN_SHALLOW) ? self::REUSE_ETAG | self::REUSE_SIZE : 0;
|
||||
}
|
||||
$this->scanFile($path, $reuse);
|
||||
return $this->scanChildren($path, $recursive, $reuse);
|
||||
$data = $this->scanFile($path, $reuse);
|
||||
$size = $this->scanChildren($path, $recursive, $reuse);
|
||||
$data['size'] = $size;
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -38,8 +38,8 @@ class Updater {
|
|||
if ($storage) {
|
||||
$cache = $storage->getCache($internalPath);
|
||||
$scanner = $storage->getScanner($internalPath);
|
||||
$scanner->scan($internalPath, Scanner::SCAN_SHALLOW);
|
||||
$cache->correctFolderSize($internalPath);
|
||||
$data = $scanner->scan($internalPath, Scanner::SCAN_SHALLOW);
|
||||
$cache->correctFolderSize($internalPath, $data);
|
||||
self::correctFolder($path, $storage->filemtime($internalPath));
|
||||
self::correctParentStorageMtime($storage, $internalPath);
|
||||
}
|
||||
|
|
|
@ -90,7 +90,6 @@ class HomeCache extends \PHPUnit_Framework_TestCase {
|
|||
|
||||
// check that files and root size ignored the unknown sizes
|
||||
$this->assertEquals(1000, $this->cache->calculateFolderSize('files'));
|
||||
$this->assertEquals(1000, $this->cache->calculateFolderSize(''));
|
||||
|
||||
// clean up
|
||||
$this->cache->remove('');
|
||||
|
|
Loading…
Reference in New Issue