summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJens-Christian Fischer <jens-christian.fischer@switch.ch>2015-04-11 18:06:21 +0200
committerJens-Christian Fischer <jens-christian.fischer@switch.ch>2015-04-11 18:06:21 +0200
commit22c6216f5c8bf688585a3d3c2722408e15452283 (patch)
tree4875778460c8ad46915687f7748e18f583f3ff4b /lib
parent7ce4d2dec962e49066f8e15a518fadbfcf25a868 (diff)
downloadnextcloud-server-22c6216f5c8bf688585a3d3c2722408e15452283.tar.gz
nextcloud-server-22c6216f5c8bf688585a3d3c2722408e15452283.zip
don't update identical values
The UPDATE oc_filecache statement blindly overwrites identical data. Databases like Postgres that create a new row on an update and mark the old one as dead will suffer from the previous behaviour, as millions of "new" rows are created in the database. This patch changes the WHERE clause to test for identical values and not updating if the values in the DB are identical to the ones being passed.
Diffstat (limited to 'lib')
-rw-r--r--lib/private/files/cache/cache.php8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php
index c5e118946e5..70da3dc776d 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -306,10 +306,16 @@ class Cache {
}
list($queryParts, $params) = $this->buildParts($data);
+
+ $params = array_merge($params, $params);
$params[] = $id;
- $sql = 'UPDATE `*PREFIX*filecache` SET ' . implode(' = ?, ', $queryParts) . '=? WHERE `fileid` = ?';
+ // don't update if the data we try to set is the same as the one in the record
+ // some databases (Postgres) don't like superfluous updates
+ $sql = 'UPDATE `*PREFIX*filecache` SET ' . implode(' = ?, ', $queryParts) . '=? ' .
+ 'WHERE (' . implode(' <> ? OR ', $queryParts) . ' <> ? ) AND `fileid` = ? ';
\OC_DB::executeAudited($sql, $params);
+
}
/**