From 879237f32ac4af820fddd2d07ca342000f5723eb Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 5 Jun 2014 11:49:13 +0200 Subject: [PATCH 1/3] Add method to get users by their preference --- lib/private/preferences.php | 22 ++++++++++++++++++++++ tests/lib/preferences.php | 16 ++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/private/preferences.php b/lib/private/preferences.php index a4bfc650d08..f1de95a5e11 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -242,6 +242,28 @@ class Preferences { return $userValues; } + /** + * Gets the users for a preference + * @param string $app + * @param string $key + * @param string $value + * @return array + */ + public function getUsersForValue($app, $key, $value) { + $users = array(); + + $query = 'SELECT `userid` ' + . ' FROM `*PREFIX*preferences` ' + . ' WHERE `appid` = ? AND `configkey` = ? AND `configvalue` = ?'; + $result = $this->conn->executeQuery($query, array($app, $key, $value)); + + while ($row = $result->fetch()) { + $users[] = $row['userid']; + } + + return $users; + } + /** * Deletes a key * @param string $user user diff --git a/tests/lib/preferences.php b/tests/lib/preferences.php index 499be914fb7..a4259a8f349 100644 --- a/tests/lib/preferences.php +++ b/tests/lib/preferences.php @@ -221,6 +221,22 @@ class Test_Preferences_Object extends PHPUnit_Framework_TestCase { $this->assertEquals('someothervalue', $values['AnotherUser']); } + public function testGetValueUsers() + { + // Prepare data + $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)'); + $query->execute(array('SomeUser', 'testGetUsersForValue', 'somekey', 'somevalue')); + $query->execute(array('AnotherUser', 'testGetUsersForValue', 'somekey', 'someothervalue')); + $query->execute(array('AUser', 'testGetUsersForValue', 'somekey', 'somevalue')); + + $preferences = new OC\Preferences(\OC_DB::getConnection()); + $this->assertEquals(array('SomeUser', 'AUser'), $preferences->getUsersForValue('testGetUsersForValue', 'somekey', 'somevalue')); + + // Clean DB after the test + $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?'); + $query->execute(array('testGetUsersForValue')); + } + public function testDeleteKey() { $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); From 4b1896712901ee0c4e71a25c8e1dd3dc18d63c46 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 5 Jun 2014 12:19:48 +0200 Subject: [PATCH 2/3] Hack around oracle for CLOB fields --- lib/private/preferences.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/private/preferences.php b/lib/private/preferences.php index f1de95a5e11..0dc5b26810a 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -254,7 +254,15 @@ class Preferences { $query = 'SELECT `userid` ' . ' FROM `*PREFIX*preferences` ' - . ' WHERE `appid` = ? AND `configkey` = ? AND `configvalue` = ?'; + . ' WHERE `appid` = ? AND `configkey` = ? AND '; + + if (\OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { + //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison + $query .= ' to_char(`configvalue`)= ?'; + } else { + $query .= ' `configvalue` = ?'; + } + $result = $this->conn->executeQuery($query, array($app, $key, $value)); while ($row = $result->fetch()) { From d493c0c9aca4f1286084798f293b3097b16e9d0e Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 5 Jun 2014 15:21:53 +0200 Subject: [PATCH 3/3] Sort the result before comparing --- tests/lib/preferences.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/lib/preferences.php b/tests/lib/preferences.php index a4259a8f349..93c9704f6c6 100644 --- a/tests/lib/preferences.php +++ b/tests/lib/preferences.php @@ -230,7 +230,9 @@ class Test_Preferences_Object extends PHPUnit_Framework_TestCase { $query->execute(array('AUser', 'testGetUsersForValue', 'somekey', 'somevalue')); $preferences = new OC\Preferences(\OC_DB::getConnection()); - $this->assertEquals(array('SomeUser', 'AUser'), $preferences->getUsersForValue('testGetUsersForValue', 'somekey', 'somevalue')); + $result = $preferences->getUsersForValue('testGetUsersForValue', 'somekey', 'somevalue'); + sort($result); + $this->assertEquals(array('AUser', 'SomeUser'), $result); // Clean DB after the test $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?');