server/lib/files/cache/backgroundwatcher.php
Robin Appelman eed5e9f804 Cache: check one folder and one file each time the backgroundwatcher runs
Because there are usually way less folders than files it walks trought the list of all folder quicker, this causes new files to be detected quicker
2013-04-20 16:57:53 +02:00

104 lines
3.1 KiB
PHP

<?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 $folderMimetype = null;
static private function getFolderMimetype() {
if (!is_null(self::$folderMimetype)) {
return self::$folderMimetype;
}
$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = ?');
$result = $query->execute(array('httpd/unix-directory'));
$row = $result->fetchRow();
return $row['id'];
}
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
* @param bool $folder
* @return int
*/
static private function getNextFileId($previous, $folder) {
if ($folder) {
$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `fileid` > ? AND mimetype = ' . self::getFolderMimetype() . ' ORDER BY `fileid` ASC', 1);
} else {
$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `fileid` > ? AND mimetype != ' . self::getFolderMimetype() . ' ORDER BY `fileid` ASC', 1);
}
$result = $query->execute(array($previous));
if ($row = $result->fetchRow()) {
return $row['fileid'];
} else {
return 0;
}
}
static public function checkNext() {
// check both 1 file and 1 folder, this way new files are detected quicker because there are less folders than files usually
$previousFile = \OC_Appconfig::getValue('files', 'backgroundwatcher_previous_file', 0);
$previousFolder = \OC_Appconfig::getValue('files', 'backgroundwatcher_previous_folder', 0);
$nextFile = self::getNextFileId($previousFile, false);
$nextFolder = self::getNextFileId($previousFolder, true);
\OC_Appconfig::setValue('files', 'backgroundwatcher_previous_file', $nextFile);
\OC_Appconfig::setValue('files', 'backgroundwatcher_previous_folder', $nextFolder);
if ($nextFile > 0) {
self::checkUpdate($nextFile);
}
if ($nextFolder > 0) {
self::checkUpdate($nextFolder);
}
}
static public function checkAll() {
$previous = 0;
$next = 1;
while ($next != 0) {
$next = self::getNextFileId($previous, true);
self::checkUpdate($next);
}
$previous = 0;
$next = 1;
while ($next != 0) {
$next = self::getNextFileId($previous, false);
self::checkUpdate($next);
}
}
}