add quota storage wrapper
This commit is contained in:
parent
a853968f7d
commit
cd8f0c21ce
|
@ -0,0 +1,104 @@
|
|||
<?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\Storage\Wrapper;
|
||||
|
||||
class Quota extends Wrapper {
|
||||
|
||||
/**
|
||||
* @var int $quota
|
||||
*/
|
||||
protected $quota;
|
||||
|
||||
/**
|
||||
* @param array $parameters
|
||||
*/
|
||||
public function __construct($parameters) {
|
||||
$this->storage = $parameters['storage'];
|
||||
$this->quota = $parameters['quota'];
|
||||
}
|
||||
|
||||
protected function getSize($path) {
|
||||
$cache = $this->getCache();
|
||||
$data = $cache->get($path);
|
||||
if (is_array($data) and isset($data['size'])) {
|
||||
return $data['size'];
|
||||
} else {
|
||||
return \OC\Files\SPACE_NOT_COMPUTED;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get free space as limited by the quota
|
||||
*
|
||||
* @param string $path
|
||||
* @return int
|
||||
*/
|
||||
public function free_space($path) {
|
||||
if ($this->quota < 0) {
|
||||
return $this->storage->free_space($path);
|
||||
} else {
|
||||
$used = $this->getSize('');
|
||||
if ($used < 0) {
|
||||
return \OC\Files\SPACE_NOT_COMPUTED;
|
||||
} else {
|
||||
$free = $this->storage->free_space($path);
|
||||
return min($free, ($this->quota - $used));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* see http://php.net/manual/en/function.file_put_contents.php
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $data
|
||||
* @return bool
|
||||
*/
|
||||
public function file_put_contents($path, $data) {
|
||||
$free = $this->free_space('');
|
||||
if ($free < 0 or strlen($data) < $free) {
|
||||
return $this->storage->file_put_contents($path, $data);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* see http://php.net/manual/en/function.copy.php
|
||||
*
|
||||
* @param string $source
|
||||
* @param string $target
|
||||
* @return bool
|
||||
*/
|
||||
public function copy($source, $target) {
|
||||
$free = $this->free_space('');
|
||||
if ($free < 0 or $this->getSize($source) < $free) {
|
||||
return $this->storage->copy($source, $target);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* see http://php.net/manual/en/function.fopen.php
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
* @return resource
|
||||
*/
|
||||
public function fopen($path, $mode) {
|
||||
$source = $this->storage->fopen($path, $mode);
|
||||
$free = $this->free_space('');
|
||||
if ($free >= 0) {
|
||||
return \OC\Files\Stream\Quota::wrap($source, $free);
|
||||
} else {
|
||||
return $source;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
<?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 Test\Files\Storage\Wrapper;
|
||||
|
||||
//ensure the constants are loaded
|
||||
\OC::$loader->load('\OC\Files\Filesystem');
|
||||
|
||||
class Quota extends \Test\Files\Storage\Storage {
|
||||
/**
|
||||
* @var string tmpDir
|
||||
*/
|
||||
private $tmpDir;
|
||||
|
||||
public function setUp() {
|
||||
$this->tmpDir = \OC_Helper::tmpFolder();
|
||||
$storage = new \OC\Files\Storage\Local(array('datadir' => $this->tmpDir));
|
||||
$this->instance = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => 10000000));
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
\OC_Helper::rmdirr($this->tmpDir);
|
||||
}
|
||||
|
||||
protected function getLimitedStorage($limit) {
|
||||
$storage = new \OC\Files\Storage\Local(array('datadir' => $this->tmpDir));
|
||||
$storage->getScanner()->scan('');
|
||||
return new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => $limit));
|
||||
}
|
||||
|
||||
public function testFilePutContentsNotEnoughSpace() {
|
||||
$instance = $this->getLimitedStorage(3);
|
||||
$this->assertFalse($instance->file_put_contents('foo', 'foobar'));
|
||||
}
|
||||
|
||||
public function testCopyNotEnoughSpace() {
|
||||
$instance = $this->getLimitedStorage(9);
|
||||
$this->assertEquals(6, $instance->file_put_contents('foo', 'foobar'));
|
||||
$instance->getScanner()->scan('');
|
||||
$this->assertFalse($instance->copy('foo', 'bar'));
|
||||
}
|
||||
|
||||
public function testFreeSpace() {
|
||||
$instance = $this->getLimitedStorage(9);
|
||||
$this->assertEquals(9, $instance->free_space(''));
|
||||
}
|
||||
|
||||
public function testFWriteNotEnoughSpace() {
|
||||
$instance = $this->getLimitedStorage(9);
|
||||
$stream = $instance->fopen('foo', 'w+');
|
||||
$this->assertEquals(6, fwrite($stream, 'foobar'));
|
||||
$this->assertEquals(3, fwrite($stream, 'qwerty'));
|
||||
fclose($stream);
|
||||
$this->assertEquals('foobarqwe', $instance->file_get_contents('foo'));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue