diff options
author | Côme Chilliet <91878298+come-nc@users.noreply.github.com> | 2024-05-13 11:05:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-13 11:05:40 +0200 |
commit | e68544d9f4a9441469ea2ef7f2e8c223be7bb2b1 (patch) | |
tree | 69d94b7db7391a1e38e0707a52aa2887439f1bff /lib/private/Files/Cache | |
parent | 7d05983622a240fbc74705fbe48b2f503c5e04f4 (diff) | |
parent | 3c3e45f0ad4b4f10161197f70daf46c8888ba91e (diff) | |
download | nextcloud-server-e68544d9f4a9441469ea2ef7f2e8c223be7bb2b1.tar.gz nextcloud-server-e68544d9f4a9441469ea2ef7f2e8c223be7bb2b1.zip |
Merge pull request #43794 from nextcloud/fix/files/scanner-metadata-diff
fix(files): handle multidimensional arrays in scanner
Diffstat (limited to 'lib/private/Files/Cache')
-rw-r--r-- | lib/private/Files/Cache/Scanner.php | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php index 1c66f3af8d2..4aef73b9b25 100644 --- a/lib/private/Files/Cache/Scanner.php +++ b/lib/private/Files/Cache/Scanner.php @@ -221,8 +221,9 @@ class Scanner extends BasicEmitter implements IScanner { } // Only update metadata that has changed - $newData = array_diff_assoc($data, $cacheData->getData()); - + // i.e. get all the values in $data that are not present in the cache already + $newData = $this->array_diff_assoc_multi($data, $cacheData->getData()); + // make it known to the caller that etag has been changed and needs propagation if (isset($newData['etag'])) { $data['etag_changed'] = true; @@ -370,6 +371,50 @@ class Scanner extends BasicEmitter implements IScanner { } /** + * Compares $array1 against $array2 and returns all the values in $array1 that are not in $array2 + * Note this is a one-way check - i.e. we don't care about things that are in $array2 that aren't in $array1 + * + * Supports multi-dimensional arrays + * Also checks keys/indexes + * Comparisons are strict just like array_diff_assoc + * Order of keys/values does not matter + * + * @param array $array1 + * @param array $array2 + * @return array with the differences between $array1 and $array1 + * @throws \InvalidArgumentException if $array1 isn't an actual array + * + */ + protected function array_diff_assoc_multi(array $array1, array $array2) { + + $result = []; + + foreach ($array1 as $key => $value) { + + // if $array2 doesn't have the same key, that's a result + if (!array_key_exists($key, $array2)) { + $result[$key] = $value; + continue; + } + + // if $array2's value for the same key is different, that's a result + if ($array2[$key] !== $value && !is_array($value)) { + $result[$key] = $value; + continue; + } + + if (is_array($value)) { + $nestedDiff = $this->array_diff_assoc_multi($value, $array2[$key]); + if (!empty($nestedDiff)) { + $result[$key] = $nestedDiff; + continue; + } + } + } + return $result; + } + + /** * Get the children currently in the cache * * @param int $folderId |