aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Files/Cache
diff options
context:
space:
mode:
authorVincent Petry <vincent@nextcloud.com>2022-08-17 11:36:16 +0200
committerGitHub <noreply@github.com>2022-08-17 11:36:16 +0200
commit312b719acf686f51065e83290cd88704d703a50c (patch)
treed35436952d0fa21a5010f53944c97a73bd81be7b /lib/private/Files/Cache
parent11d5a1d3dfea09dc53894d51e336c512e75f733d (diff)
parentde63f6363f1ae590c9735fbe9592835c04ab32cd (diff)
downloadnextcloud-server-312b719acf686f51065e83290cd88704d703a50c.tar.gz
nextcloud-server-312b719acf686f51065e83290cd88704d703a50c.zip
Merge pull request #32943 from nextcloud/unencrypted-size-revert-interface-changes
Revert interface changes from "store unencrypted size in the unencrypted_size column"
Diffstat (limited to 'lib/private/Files/Cache')
-rw-r--r--lib/private/Files/Cache/Cache.php62
-rw-r--r--lib/private/Files/Cache/Propagator.php8
2 files changed, 40 insertions, 30 deletions
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index f23635aa01b..ec284282178 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -875,26 +875,32 @@ class Cache implements ICache {
$id = $entry['fileid'];
$query = $this->getQueryBuilder();
- $query->selectAlias($query->func()->sum('size'), 'size_sum')
- ->selectAlias($query->func()->min('size'), 'size_min')
- // in case of encryption being enabled after some files are already uploaded, some entries will have an unencrypted_size of 0 and a non-zero size
- ->selectAlias($query->func()->sum(
- $query->func()->case([
- ['when' => $query->expr()->eq('unencrypted_size', $query->expr()->literal(0, IQueryBuilder::PARAM_INT)), 'then' => 'size'],
- ], 'unencrypted_size')
- ), 'unencrypted_sum')
- ->selectAlias($query->func()->min('unencrypted_size'), 'unencrypted_min')
- ->selectAlias($query->func()->max('unencrypted_size'), 'unencrypted_max')
+ $query->select('size', 'unencrypted_size')
->from('filecache')
- ->whereStorageId($this->getNumericStorageId())
->whereParent($id);
$result = $query->execute();
- $row = $result->fetch();
+ $rows = $result->fetchAll();
$result->closeCursor();
- if ($row) {
- ['size_sum' => $sum, 'size_min' => $min, 'unencrypted_sum' => $unencryptedSum, 'unencrypted_min' => $unencryptedMin, 'unencrypted_max' => $unencryptedMax] = $row;
+ if ($rows) {
+ $sizes = array_map(function (array $row) {
+ return (int)$row['size'];
+ }, $rows);
+ $unencryptedOnlySizes = array_map(function (array $row) {
+ return (int)$row['unencrypted_size'];
+ }, $rows);
+ $unencryptedSizes = array_map(function (array $row) {
+ return (int)(($row['unencrypted_size'] > 0) ? $row['unencrypted_size'] : $row['size']);
+ }, $rows);
+
+ $sum = array_sum($sizes);
+ $min = min($sizes);
+
+ $unencryptedSum = array_sum($unencryptedSizes);
+ $unencryptedMin = min($unencryptedSizes);
+ $unencryptedMax = max($unencryptedOnlySizes);
+
$sum = 0 + $sum;
$min = 0 + $min;
if ($min === -1) {
@@ -907,18 +913,22 @@ class Cache implements ICache {
} else {
$unencryptedTotal = $unencryptedSum;
}
- if ($entry['size'] !== $totalSize) {
- // only set unencrypted size for a folder if any child entries have it set
- if ($unencryptedMax > 0) {
- $this->update($id, [
- 'size' => $totalSize,
- 'unencrypted_size' => $unencryptedTotal,
- ]);
- } else {
- $this->update($id, [
- 'size' => $totalSize,
- ]);
- }
+ } else {
+ $totalSize = 0;
+ $unencryptedTotal = 0;
+ $unencryptedMax = 0;
+ }
+ if ($entry['size'] !== $totalSize) {
+ // only set unencrypted size for a folder if any child entries have it set, or the folder is empty
+ if ($unencryptedMax > 0 || $totalSize === 0) {
+ $this->update($id, [
+ 'size' => $totalSize,
+ 'unencrypted_size' => $unencryptedTotal,
+ ]);
+ } else {
+ $this->update($id, [
+ 'size' => $totalSize,
+ ]);
}
}
}
diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php
index a0953baa785..2909e998bf9 100644
--- a/lib/private/Files/Cache/Propagator.php
+++ b/lib/private/Files/Cache/Propagator.php
@@ -116,18 +116,18 @@ class Propagator implements IPropagator {
if ($this->storage->instanceOfStorage(Encryption::class)) {
// in case of encryption being enabled after some files are already uploaded, some entries will have an unencrypted_size of 0 and a non-zero size
+ $eq = $builder->expr()->eq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT));
+ $sizeColumn = $builder->getColumnName('size');
+ $unencryptedSizeColumn = $builder->getColumnName('unencrypted_size');
$builder->set('unencrypted_size', $builder->func()->greatest(
$builder->func()->add(
- $builder->func()->case([
- ['when' => $builder->expr()->eq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT)), 'then' => 'size']
- ], 'unencrypted_size'),
+ $builder->createFunction("CASE WHEN $eq THEN $unencryptedSizeColumn ELSE $sizeColumn END"),
$builder->createNamedParameter($sizeDifference)
),
$builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT)
));
}
- $a = $builder->getSQL();
$builder->execute();
}
}