diff options
author | Robin Appelman <icewind@owncloud.com> | 2014-05-30 15:55:17 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2014-06-02 14:39:12 +0200 |
commit | a31f089266c0654816020e41f122e8d8b869cbe5 (patch) | |
tree | d17cc3bc683754dec78ff494ddcdd74cbd82d3c2 /lib/private/files | |
parent | 89bccf71932c792f6ef8b6f2009131f22415f80b (diff) | |
download | nextcloud-server-a31f089266c0654816020e41f122e8d8b869cbe5.tar.gz nextcloud-server-a31f089266c0654816020e41f122e8d8b869cbe5.zip |
Add a change propagator class to handle propagating etag and mtime changes
Diffstat (limited to 'lib/private/files')
-rw-r--r-- | lib/private/files/cache/changepropagator.php | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/private/files/cache/changepropagator.php b/lib/private/files/cache/changepropagator.php new file mode 100644 index 00000000000..30f2e675e2e --- /dev/null +++ b/lib/private/files/cache/changepropagator.php @@ -0,0 +1,98 @@ +<?php +/** + * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Cache; + +/** + * Propagates changes in etag and mtime up the filesystem tree + * + * @package OC\Files\Cache + */ +class ChangePropagator { + /** + * @var string[] + */ + protected $changedFiles = array(); + + /** + * @var \OC\Files\View + */ + protected $view; + + /** + * @param \OC\Files\View $view + */ + public function __construct(\OC\Files\View $view) { + $this->view = $view; + } + + public function addChange($path) { + $this->changedFiles[] = $path; + } + + public function getChanges() { + return $this->changedFiles; + } + + /** + * propagate the registered changes to their parent folders + * + * @param int $time (optional) the mtime to set for the folders, if not set the current time is used + */ + public function propagateChanges($time = null) { + $parents = $this->getAllParents(); + $this->changedFiles = array(); + if (!$time) { + $time = time(); + } + foreach ($parents as $parent) { + /** + * @var \OC\Files\Storage\Storage $storage + * @var string $internalPath + */ + + list($storage, $internalPath) = $this->view->resolvePath($parent); + $cache = $storage->getCache(); + $id = $cache->getId($internalPath); + $cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath))); + } + } + + /** + * @return string[] + */ + public function getAllParents() { + $parents = array(); + foreach ($this->getChanges() as $path) { + $parents = array_values(array_unique(array_merge($parents, $this->getParents($path)))); + } + return $parents; + } + + /** + * get all parent folders of $path + * + * @param string $path + * @return string[] + */ + protected function getParents($path) { + $parts = explode('/', $path); + + // remove the singe file + array_pop($parts); + $result = array('/'); + $resultPath = ''; + foreach ($parts as $part) { + if ($part) { + $resultPath .= '/' . $part; + $result[] = $resultPath; + } + } + return $result; + } +} |