aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2013-04-20 16:38:03 +0200
committerRobin Appelman <icewind@owncloud.com>2013-04-20 16:38:03 +0200
commit15dae6198fc4855519a0ed2347c29485a061f6aa (patch)
tree50b30ba641fbf352865e79b8ca0ce6bb0a76bd9b /lib
parentc50dfd725142abdbad93dbcf01fe13193445386a (diff)
downloadnextcloud-server-15dae6198fc4855519a0ed2347c29485a061f6aa.tar.gz
nextcloud-server-15dae6198fc4855519a0ed2347c29485a061f6aa.zip
Cache: add a backgroundjob to check for external changes to the filesystem
Diffstat (limited to 'lib')
-rw-r--r--lib/files/cache/backgroundwatcher.php73
-rw-r--r--lib/files/cache/cache.php1
-rw-r--r--lib/files/cache/permissions.php15
3 files changed, 89 insertions, 0 deletions
diff --git a/lib/files/cache/backgroundwatcher.php b/lib/files/cache/backgroundwatcher.php
new file mode 100644
index 00000000000..3bcd447f53a
--- /dev/null
+++ b/lib/files/cache/backgroundwatcher.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Copyright (c) 2013 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;
+
+use \OC\Files\Mount;
+use \OC\Files\Filesystem;
+
+class BackgroundWatcher {
+ static private function checkUpdate($id) {
+ $cacheItem = Cache::getById($id);
+ if (is_null($cacheItem)) {
+ return;
+ }
+ list($storageId, $internalPath) = $cacheItem;
+ $mounts = Mount::findByStorageId($storageId);
+
+ if (count($mounts) === 0) {
+ //if the storage we need isn't mounted on default, try to find a user that has access to the storage
+ $permissionsCache = new Permissions($storageId);
+ $users = $permissionsCache->getUsers($id);
+ if (count($users) === 0) {
+ return;
+ }
+ Filesystem::initMountPoints($users[0]);
+ $mounts = Mount::findByStorageId($storageId);
+ if (count($mounts) === 0) {
+ return;
+ }
+ }
+ $storage = $mounts[0]->getStorage();
+ $watcher = new Watcher($storage);
+ $watcher->checkUpdate($internalPath);
+ }
+
+ /**
+ * get the next fileid in the cache
+ *
+ * @param int $previous
+ * @return int
+ */
+ static private function getNextFileId($previous) {
+ $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `fileid` > ? ORDER BY `fileid` ASC', 1);
+ $result = $query->execute(array($previous));
+ if ($row = $result->fetchRow()) {
+ return $row['fileid'];
+ } else {
+ return 0;
+ }
+ }
+
+ static public function checkNext() {
+ $previous = \OC_Appconfig::getValue('files', 'backgroundwatcher_previous', 0);
+ $next = self::getNextFileId($previous);
+ error_log($next);
+ \OC_Appconfig::setValue('files', 'backgroundwatcher_previous', $next);
+ self::checkUpdate($next);
+ }
+
+ static public function checkAll() {
+ $previous = 0;
+ $next = 1;
+ while ($next != 0) {
+ $next = self::getNextFileId($previous);
+ self::checkUpdate($next);
+ }
+ }
+}
diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 71b70abe3fe..3ed3490f29b 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -517,6 +517,7 @@ class Cache {
/**
* get the storage id of the storage for a file and the internal path of the file
*
+ * @param int $id
* @return array, first element holding the storage id, second the path
*/
static public function getById($id) {
diff --git a/lib/files/cache/permissions.php b/lib/files/cache/permissions.php
index a5c9c144054..faa5ff5eacc 100644
--- a/lib/files/cache/permissions.php
+++ b/lib/files/cache/permissions.php
@@ -107,4 +107,19 @@ class Permissions {
$query->execute(array($fileId, $user));
}
}
+
+ /**
+ * get the list of users which have permissions stored for a file
+ *
+ * @param int $fileId
+ */
+ public function getUsers($fileId) {
+ $query = \OC_DB::prepare('SELECT `user` FROM `*PREFIX*permissions` WHERE `fileid` = ?');
+ $result = $query->execute(array($fileId));
+ $users = array();
+ while ($row = $result->fetchRow()) {
+ $users[] = $row['user'];
+ }
+ return $users;
+ }
}