Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2012-10-26 21:07:29 +0400
committerRobin Appelman <icewind@owncloud.com>2012-10-26 21:07:29 +0400
commitc22a723785f80671548b89c543e9163c2fff9264 (patch)
treedadd6fe026d77a57fbca40d8bad1be0e158ccc88
parentad5957207da0d287a22f7728da6841c3832ad8b6 (diff)
add file permissions cache
-rw-r--r--db_structure.xml47
-rw-r--r--lib/files/cache/permissions.php85
-rwxr-xr-xlib/util.php2
-rw-r--r--tests/lib/files/cache/permissions.php47
4 files changed, 180 insertions, 1 deletions
diff --git a/db_structure.xml b/db_structure.xml
index e0b9dc11e94..e420a9f0e44 100644
--- a/db_structure.xml
+++ b/db_structure.xml
@@ -177,6 +177,53 @@
<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>
+
<name>*dbprefix*group_user</name>
<declaration>
diff --git a/lib/files/cache/permissions.php b/lib/files/cache/permissions.php
new file mode 100644
index 00000000000..e3fa63c464a
--- /dev/null
+++ b/lib/files/cache/permissions.php
@@ -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);
+ }
+}
diff --git a/lib/util.php b/lib/util.php
index 137766d0129..a2e0422c97f 100755
--- a/lib/util.php
+++ b/lib/util.php
@@ -86,7 +86,7 @@ class OC_Util {
*/
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
- return array(4,91,00);
+ return array(4,91,01);
}
/**
diff --git a/tests/lib/files/cache/permissions.php b/tests/lib/files/cache/permissions.php
new file mode 100644
index 00000000000..4d47929a3ee
--- /dev/null
+++ b/tests/lib/files/cache/permissions.php
@@ -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);
+ }
+}