diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2019-12-04 11:49:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-04 11:49:26 +0100 |
commit | 76b78edd40fcb5dbe7f0434cbc41d2e291acfec1 (patch) | |
tree | 8a9e487e080cbdd001cd2bf5f2fb5feacb69ae25 /lib/private | |
parent | d4f1cc7da6a2d7834099750827a50dcc675c64e5 (diff) | |
parent | 74c6beb603f18d51d92730bb631bfe77d8feb400 (diff) | |
download | nextcloud-server-76b78edd40fcb5dbe7f0434cbc41d2e291acfec1.tar.gz nextcloud-server-76b78edd40fcb5dbe7f0434cbc41d2e291acfec1.zip |
Merge pull request #17833 from nextcloud/propagator-no-negative-sizes
dont set folder size to negative values during propagation
Diffstat (limited to 'lib/private')
3 files changed, 22 insertions, 2 deletions
diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php index 46bb536dfd2..ffa758e4da7 100644 --- a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php +++ b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php @@ -85,4 +85,12 @@ class FunctionBuilder implements IFunctionBuilder { public function min($field) { return new QueryFunction('MIN(' . $this->helper->quoteColumnName($field) . ')'); } + + public function greatest($x, $y) { + return new QueryFunction('GREATEST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')'); + } + + public function least($x, $y) { + return new QueryFunction('LEAST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')'); + } } diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/SqliteFunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/SqliteFunctionBuilder.php index 21898cf3f93..f37ac20ecab 100644 --- a/lib/private/DB/QueryBuilder/FunctionBuilder/SqliteFunctionBuilder.php +++ b/lib/private/DB/QueryBuilder/FunctionBuilder/SqliteFunctionBuilder.php @@ -30,4 +30,13 @@ class SqliteFunctionBuilder extends FunctionBuilder { public function concat($x, $y) { return new QueryFunction('(' . $this->helper->quoteColumnName($x) . ' || ' . $this->helper->quoteColumnName($y) . ')'); } + + public function greatest($x, $y) { + return new QueryFunction('MAX(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')'); + } + + public function least($x, $y) { + return new QueryFunction('MIN(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')'); + } + } diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php index 989a4d0c7d5..41b4c2bb070 100644 --- a/lib/private/Files/Cache/Propagator.php +++ b/lib/private/Files/Cache/Propagator.php @@ -91,7 +91,7 @@ class Propagator implements IPropagator { }, $parentHashes); $builder->update('filecache') - ->set('mtime', $builder->createFunction('GREATEST(' . $builder->getColumnName('mtime') . ', ' . $builder->createNamedParameter((int)$time, IQueryBuilder::PARAM_INT) . ')')) + ->set('mtime', $builder->func()->greatest('mtime', $builder->createNamedParameter((int)$time, IQueryBuilder::PARAM_INT))) ->set('etag', $builder->createNamedParameter($etag, IQueryBuilder::PARAM_STR)) ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))) ->andWhere($builder->expr()->in('path_hash', $hashParams)); @@ -102,7 +102,10 @@ class Propagator implements IPropagator { // we need to do size separably so we can ignore entries with uncalculated size $builder = $this->connection->getQueryBuilder(); $builder->update('filecache') - ->set('size', $builder->func()->add('size', $builder->createNamedParameter($sizeDifference))) + ->set('size', $builder->func()->greatest( + $builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT), + $builder->func()->add('size', $builder->createNamedParameter($sizeDifference))) + ) ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))) ->andWhere($builder->expr()->in('path_hash', $hashParams)) ->andWhere($builder->expr()->gt('size', $builder->expr()->literal(-1, IQueryBuilder::PARAM_INT))); |