|
|
|
@ -15,6 +15,7 @@ use Icewind\Streams\IteratorDirectory; |
|
|
|
|
use OC\Files\Cache\Cache; |
|
|
|
|
use OC\Files\Cache\CacheEntry; |
|
|
|
|
use OC\Files\Storage\PolyFill\CopyDirectory; |
|
|
|
|
use OCP\DB\QueryBuilder\IQueryBuilder; |
|
|
|
|
use OCP\Files\Cache\ICache; |
|
|
|
|
use OCP\Files\Cache\ICacheEntry; |
|
|
|
|
use OCP\Files\Cache\IScanner; |
|
|
|
@ -26,6 +27,8 @@ use OCP\Files\ObjectStore\IObjectStoreMetaData; |
|
|
|
|
use OCP\Files\ObjectStore\IObjectStoreMultiPartUpload; |
|
|
|
|
use OCP\Files\Storage\IChunkedFileWrite; |
|
|
|
|
use OCP\Files\Storage\IStorage; |
|
|
|
|
use OCP\IDBConnection; |
|
|
|
|
use OCP\Server; |
|
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
|
|
|
|
|
|
class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFileWrite { |
|
|
|
@ -40,6 +43,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil |
|
|
|
|
private bool $handleCopiesAsOwned; |
|
|
|
|
protected bool $validateWrites = true; |
|
|
|
|
private bool $preserveCacheItemsOnDelete = false; |
|
|
|
|
private ?int $totalSizeLimit = null; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param array $parameters |
|
|
|
@ -63,6 +67,9 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil |
|
|
|
|
$this->validateWrites = (bool)$parameters['validateWrites']; |
|
|
|
|
} |
|
|
|
|
$this->handleCopiesAsOwned = (bool)($parameters['handleCopiesAsOwned'] ?? false); |
|
|
|
|
if (isset($parameters['totalSizeLimit'])) { |
|
|
|
|
$this->totalSizeLimit = $parameters['totalSizeLimit']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->logger = \OCP\Server::get(LoggerInterface::class); |
|
|
|
|
} |
|
|
|
@ -755,6 +762,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil |
|
|
|
|
if (!$this->objectStore instanceof IObjectStoreMultiPartUpload) { |
|
|
|
|
throw new GenericFileException('Object store does not support multipart upload'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$cacheEntry = $this->getCache()->get($targetPath); |
|
|
|
|
$urn = $this->getURN($cacheEntry->getId()); |
|
|
|
|
|
|
|
|
@ -812,4 +820,28 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil |
|
|
|
|
public function setPreserveCacheOnDelete(bool $preserve) { |
|
|
|
|
$this->preserveCacheItemsOnDelete = $preserve; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function free_space(string $path): int|float|false { |
|
|
|
|
if ($this->totalSizeLimit === null) { |
|
|
|
|
return FileInfo::SPACE_UNLIMITED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// To avoid iterating all objects in the object store, calculate the sum of the cached sizes of the root folders of all object storages. |
|
|
|
|
$qb = Server::get(IDBConnection::class)->getQueryBuilder(); |
|
|
|
|
$result = $qb->select($qb->func()->sum('f.size')) |
|
|
|
|
->from('storages', 's') |
|
|
|
|
->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('f.storage', 's.numeric_id')) |
|
|
|
|
->where($qb->expr()->like('s.id', 'object::%', IQueryBuilder::PARAM_STR)) |
|
|
|
|
->andWhere($qb->expr()->eq('f.path', $qb->createNamedParameter(''))) |
|
|
|
|
->executeQuery(); |
|
|
|
|
$used = $result->fetchOne(); |
|
|
|
|
$result->closeCursor(); |
|
|
|
|
|
|
|
|
|
$available = $this->totalSizeLimit - $used; |
|
|
|
|
if ($available < 0) { |
|
|
|
|
$available = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $available; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|