add file permissions cache

This commit is contained in:
Robin Appelman 2012-10-26 19:07:29 +02:00
parent ad5957207d
commit c22a723785
4 changed files with 180 additions and 1 deletions

View File

@ -175,6 +175,53 @@
</table> </table>
<table>
<name>*dbprefix*permissions</name>
<declaration>
<field>
<name>fileid</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<length>4</length>
</field>
<field>
<name>user</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>
<field>
<name>permissions</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<length>4</length>
</field>
<index>
<name>id_user_index</name>
<unique>true</unique>
<field>
<name>fileid</name>
<sorting>ascending</sorting>
</field>
<field>
<name>user</name>
<sorting>ascending</sorting>
</field>
</index>
</declaration>
</table>
<table> <table>
<name>*dbprefix*group_user</name> <name>*dbprefix*group_user</name>

85
lib/files/cache/permissions.php vendored Normal file
View File

@ -0,0 +1,85 @@
<?php
/**
* Copyright (c) 2012 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;
class Permissions {
/**
* get the permissions for a single file
*
* @param int $fileId
* @param string $user
* @return int (-1 if file no permissions set)
*/
static public function get($fileId, $user) {
$query = \OC_DB::prepare('SELECT `permissions` FROM `*PREFIX*permissions` WHERE `user` = ? AND `fileid` = ?');
$result = $query->execute(array($user, $fileId));
if ($row = $result->fetchRow()) {
return $row['permissions'];
} else {
return -1;
}
}
/**
* set the permissions of a file
*
* @param int $fileId
* @param string $user
* @param int $permissions
*/
static public function set($fileId, $user, $permissions) {
if (self::get($fileId, $user) !== -1) {
$query = \OC_DB::prepare('UPDATE `*PREFIX*permissions` SET `permissions` = ? WHERE `user` = ? AND `fileid` = ?');
} else {
$query = \OC_DB::prepare('INSERT INTO `*PREFIX*permissions`(`permissions`, `user`, `fileid`) VALUES(?, ?,? )');
}
$query->execute(array($permissions, $user, $fileId));
}
/**
* get the permissions of multiply files
*
* @param int[] $fileIds
* @param string $user
* @return int[]
*/
static public function getMultiple($fileIds, $user) {
$params = $fileIds;
$params[] = $user;
$inPart = implode(', ', array_fill(0, count($fileIds), '?'));
$query = \OC_DB::prepare('SELECT `fileid`, `permissions` FROM `*PREFIX*permissions` WHERE `fileid` IN (' . $inPart . ') AND `user` = ?');
$result = $query->execute($params);
$filePermissions = array();
while ($row = $result->fetchRow()) {
$filePermissions[$row['fileid']] = $row['permissions'];
}
return $filePermissions;
}
/**
* remove the permissions for a file
*
* @param int $fileId
* @param string $user
*/
static public function remove($fileId, $user) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
$query->execute(array($fileId, $user));
}
static public function removeMultiple($fileIds, $user) {
$params = $fileIds;
$params[] = $user;
$inPart = implode(', ', array_fill(0, count($fileIds), '?'));
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` IN (' . $inPart . ') AND `user` = ?');
$query->execute($params);
}
}

View File

@ -86,7 +86,7 @@ class OC_Util {
*/ */
public static function getVersion() { public static function getVersion() {
// hint: We only can count up. So the internal version number of ownCloud 4.5 will be 4.90.0. This is not visible to the user // hint: We only can count up. So the internal version number of ownCloud 4.5 will be 4.90.0. This is not visible to the user
return array(4,91,00); return array(4,91,01);
} }
/** /**

47
tests/lib/files/cache/permissions.php vendored Normal file
View File

@ -0,0 +1,47 @@
<?php
/**
* Copyright (c) 2012 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 Test\Files\Cache;
class Permissions extends \PHPUnit_Framework_TestCase {
function testSimple() {
$ids = range(1, 10);
$user = uniqid();
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(1, $user));
\OC\Files\Cache\Permissions::set(1, $user, 1);
$this->assertEquals(1, \OC\Files\Cache\Permissions::get(1, $user));
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(2, $user));
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(1, $user . '2'));
\OC\Files\Cache\Permissions::set(1, $user, 2);
$this->assertEquals(2, \OC\Files\Cache\Permissions::get(1, $user));
\OC\Files\Cache\Permissions::set(2, $user, 1);
$this->assertEquals(1, \OC\Files\Cache\Permissions::get(2, $user));
\OC\Files\Cache\Permissions::remove(1, $user);
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(1, $user));
\OC\Files\Cache\Permissions::remove(1, $user . '2');
$this->assertEquals(1, \OC\Files\Cache\Permissions::get(2, $user));
$expected = array();
foreach ($ids as $id) {
\OC\Files\Cache\Permissions::set($id, $user, 10 + $id);
$expected[$id] = 10 + $id;
}
$this->assertEquals($expected, \OC\Files\Cache\Permissions::getMultiple($ids, $user));
\OC\Files\Cache\Permissions::removeMultiple(array(10, 9), $user);
unset($expected[9]);
unset($expected[10]);
$this->assertEquals($expected, \OC\Files\Cache\Permissions::getMultiple($ids, $user));
\OC\Files\Cache\Permissions::removeMultiple($ids, $user);
}
}