]> source.dussan.org Git - nextcloud-server.git/commitdiff
Refactoring of OC_Preferences to AllConfig
authorMorris Jobke <hey@morrisjobke.de>
Wed, 19 Nov 2014 11:18:32 +0000 (12:18 +0100)
committerMorris Jobke <hey@morrisjobke.de>
Mon, 8 Dec 2014 21:33:29 +0000 (22:33 +0100)
* keep old static methods - mapped to new ones and deprecated
* removed deleteApp, getUsers, getApps because they are unused
* make AllConfig unit tests more robust against not cleaned up environments

lib/private/allconfig.php
lib/private/legacy/preferences.php
lib/private/preferences.php
lib/private/server.php
lib/public/iconfig.php
tests/lib/allconfig.php [new file with mode: 0644]
tests/lib/preferences-singleton.php [deleted file]
tests/lib/preferences.php [deleted file]

index 173aac6ad65f8b2fdbc678b8fa43a00565601fdb..17872fd4f69ee1fcef2a0f22d95df4d436ba1585 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 namespace OC;
+use OCP\IDBConnection;
 
 /**
  * Class to combine all the configuration options ownCloud offers
@@ -16,11 +17,37 @@ class AllConfig implements \OCP\IConfig {
        /** @var SystemConfig */
        private $systemConfig;
 
+       /** @var IDBConnection */
+       private $connection;
+
+       /**
+        * 3 dimensional array with the following structure:
+        * [ $userId =>
+        *     [ $appId =>
+        *         [ $key => $value ]
+        *     ]
+        * ]
+        *
+        * database table: preferences
+        *
+        * methods that use this:
+        *   - setUserValue
+        *   - getUserValue
+        *   - getUserKeys
+        *   - deleteUserValue
+        *   - deleteAllUserValues
+        *   - deleteAppFromAllUsers
+        *
+        * @var array $userCache
+        */
+       private $userCache = array();
+
        /**
         * @param SystemConfig $systemConfig
         */
-       function __construct(SystemConfig $systemConfig) {
+       function __construct(SystemConfig $systemConfig, IDBConnection $connection) {
                $this->systemConfig = $systemConfig;
+               $this->connection = $connection;
        }
 
        /**
@@ -115,11 +142,40 @@ class AllConfig implements \OCP\IConfig {
         * @param string $value the value that you want to store
         */
        public function setUserValue($userId, $appName, $key, $value) {
-               \OC_Preferences::setValue($userId, $appName, $key, $value);
+               // Check if the key does exist
+               $sql  = 'SELECT `configvalue` FROM `*PREFIX*preferences` '.
+                               'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?';
+               $result = $this->connection->executeQuery($sql, array($userId, $appName, $key));
+               $oldValue = $result->fetchColumn();
+               $exists = $oldValue !== false;
+
+               if($oldValue === strval($value)) {
+                       // no changes
+                       return;
+               }
+
+               if (!$exists) {
+                       $sql  = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'.
+                                       'VALUES (?, ?, ?, ?)';
+               } else {
+                       $sql  = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '.
+                                       'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?';
+
+               }
+               $data = array($value, $userId, $appName, $key);
+               $affectedRows = $this->connection->executeUpdate($sql, $data);
+
+               // only add to the cache if we already loaded data for the user
+               if ($affectedRows > 0 && isset($this->userCache[$userId])) {
+                       if (!isset($this->userCache[$userId][$appName])) {
+                               $this->userCache[$userId][$appName] = array();
+                       }
+                       $this->userCache[$userId][$appName][$key] = $value;
+               }
        }
 
        /**
-        * Shortcut for getting a user defined value
+        * Getting a user defined value
         *
         * @param string $userId the userId of the user that we want to store the value under
         * @param string $appName the appName that we stored the value under
@@ -128,7 +184,12 @@ class AllConfig implements \OCP\IConfig {
         * @return string
         */
        public function getUserValue($userId, $appName, $key, $default = '') {
-               return \OC_Preferences::getValue($userId, $appName, $key, $default);
+               $data = $this->getUserValues($userId);
+               if (isset($data[$appName]) and isset($data[$appName][$key])) {
+                       return $data[$appName][$key];
+               } else {
+                       return $default;
+               }
        }
 
        /**
@@ -139,7 +200,12 @@ class AllConfig implements \OCP\IConfig {
         * @return string[]
         */
        public function getUserKeys($userId, $appName) {
-               return \OC_Preferences::getKeys($userId, $appName);
+               $data = $this->getUserValues($userId);
+               if (isset($data[$appName])) {
+                       return array_keys($data[$appName]);
+               } else {
+                       return array();
+               }
        }
 
        /**
@@ -150,7 +216,13 @@ class AllConfig implements \OCP\IConfig {
         * @param string $key the key under which the value is being stored
         */
        public function deleteUserValue($userId, $appName, $key) {
-               \OC_Preferences::deleteKey($userId, $appName, $key);
+               $sql  = 'DELETE FROM `*PREFIX*preferences` '.
+                               'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?';
+               $this->connection->executeUpdate($sql, array($userId, $appName, $key));
+
+               if (isset($this->userCache[$userId]) and isset($this->userCache[$userId][$appName])) {
+                       unset($this->userCache[$userId][$appName][$key]);
+               }
        }
 
        /**
@@ -159,6 +231,124 @@ class AllConfig implements \OCP\IConfig {
         * @param string $userId the userId of the user that we want to remove all values from
         */
        public function deleteAllUserValues($userId) {
-               \OC_Preferences::deleteUser($userId);
+               $sql  = 'DELETE FROM `*PREFIX*preferences` '.
+                       'WHERE `userid` = ?';
+               $this->connection->executeUpdate($sql, array($userId));
+
+               unset($this->userCache[$userId]);
+       }
+
+       /**
+        * Delete all user related values of one app
+        *
+        * @param string $appName the appName of the app that we want to remove all values from
+        */
+       public function deleteAppFromAllUsers($appName) {
+               $sql  = 'DELETE FROM `*PREFIX*preferences` '.
+                               'WHERE `appid` = ?';
+               $this->connection->executeUpdate($sql, array($appName));
+
+               foreach ($this->userCache as &$userCache) {
+                       unset($userCache[$appName]);
+               }
+       }
+
+       /**
+        * Returns all user configs sorted by app of one user
+        *
+        * @param string $userId the user ID to get the app configs from
+        * @return array[] - 2 dimensional array with the following structure:
+        *     [ $appId =>
+        *         [ $key => $value ]
+        *     ]
+        */
+       private function getUserValues($userId) {
+               if (isset($this->userCache[$userId])) {
+                       return $this->userCache[$userId];
+               }
+               $data = array();
+               $query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';
+               $result = $this->connection->executeQuery($query, array($userId));
+               while ($row = $result->fetch()) {
+                       $appId = $row['appid'];
+                       if (!isset($data[$appId])) {
+                               $data[$appId] = array();
+                       }
+                       $data[$appId][$row['configkey']] = $row['configvalue'];
+               }
+               $this->userCache[$userId] = $data;
+               return $data;
+       }
+
+       /**
+        * Fetches a mapped list of userId -> value, for a specified app and key and a list of user IDs.
+        *
+        * @param $appName app to get the value for
+        * @param $key the key to get the value for
+        * @param $userIds the user IDs to fetch the values for
+        * @return array Mapped values: userId => value
+        */
+       public function getUserValueForUsers($appName, $key, $userIds) {
+               if (empty($userIds) || !is_array($userIds)) {
+                       return array();
+               }
+
+               $chunkedUsers = array_chunk($userIds, 50, true);
+               $placeholders50 = implode(',', array_fill(0, 50, '?'));
+
+               $userValues = array();
+               foreach ($chunkedUsers as $chunk) {
+                       $queryParams = $chunk;
+                       // create [$app, $key, $chunkedUsers]
+                       array_unshift($queryParams, $key);
+                       array_unshift($queryParams, $appName);
+
+                       $placeholders = (sizeof($chunk) == 50) ? $placeholders50 :  implode(',', array_fill(0, sizeof($chunk), '?'));
+
+                       $query    = 'SELECT `userid`, `configvalue` ' .
+                                               'FROM `*PREFIX*preferences` ' .
+                                               'WHERE `appid` = ? AND `configkey` = ? ' .
+                                               'AND `userid` IN (' . $placeholders . ')';
+                       $result = $this->connection->executeQuery($query, $queryParams);
+
+                       while ($row = $result->fetch()) {
+                               $userValues[$row['userid']] = $row['configvalue'];
+                       }
+               }
+
+               return $userValues;
+
+       }
+
+       /**
+        * Determines the users that have the given value set for a specific app-key-pair
+        *
+        * @param string $appName the app to get the user for
+        * @param string $key the key to get the user for
+        * @param string $value the value to get the user for
+        * @return array of user IDs
+        */
+       public function getUsersForUserValue($appName, $key, $value) {
+               // TODO - FIXME
+               $this->fixDIInit();
+
+               $sql  = 'SELECT `userid` FROM `*PREFIX*preferences` ' .
+                               'WHERE `appid` = ? AND `configkey` = ? ';
+
+               if($this->getSystemValue('dbtype', 'sqlite') === 'oci') {
+                       //oracle hack: need to explicitly cast CLOB to CHAR for comparison
+                       $sql .= 'AND to_char(`configvalue`) = ?';
+               } else {
+                       $sql .= 'AND `configvalue` = ?';
+               }
+
+               $result = $this->connection->executeQuery($sql, array($appName, $key, $value));
+
+               $userIDs = array();
+               while ($row = $result->fetch()) {
+                       $userIDs[] = $row['userid'];
+               }
+
+               return $userIDs;
        }
 }
index 4b68b0e69aa453021bc4ec4169f2fd47bb44c381..28af124db3248e66b6fd660ebe551528b931adbc 100644 (file)
  *
  */
 
-OC_Preferences::$object = new \OC\Preferences(OC_DB::getConnection());
 /**
  * This class provides an easy way for storing user preferences.
- * @deprecated use \OC\Preferences instead
+ * @deprecated use \OCP\IConfig methods instead
  */
 class OC_Preferences{
-       public static $object;
-       /**
-        * Get all users using the preferences
-        * @return array an array of user ids
-        *
-        * This function returns a list of all users that have at least one entry
-        * in the preferences table.
-        */
-       public static function getUsers() {
-               return self::$object->getUsers();
-       }
-
-       /**
-        * Get all apps of a user
-        * @param string $user user
-        * @return integer[] with app ids
-        *
-        * This function returns a list of all apps of the user that have at least
-        * one entry in the preferences table.
-        */
-       public static function getApps( $user ) {
-               return self::$object->getApps( $user );
-       }
-
        /**
         * Get the available keys for an app
         * @param string $user user
         * @param string $app the app we are looking for
         * @return array an array of key names
+        * @deprecated use getUserKeys of \OCP\IConfig instead
         *
         * This function gets all keys of an app of an user. Please note that the
         * values are not returned.
         */
        public static function getKeys( $user, $app ) {
-               return self::$object->getKeys( $user, $app );
+               return \OC::$server->getConfig()->getUserKeys($user, $app);
        }
 
        /**
@@ -71,12 +47,13 @@ class OC_Preferences{
         * @param string $key key
         * @param string $default = null, default value if the key does not exist
         * @return string the value or $default
+        * @deprecated use getUserValue of \OCP\IConfig instead
         *
         * This function gets a value from the preferences table. If the key does
         * not exist the default value will be returned
         */
        public static function getValue( $user, $app, $key, $default = null ) {
-               return self::$object->getValue( $user, $app, $key, $default );
+               return \OC::$server->getConfig()->getUserValue($user, $app, $key, $default);
        }
 
        /**
@@ -87,12 +64,16 @@ class OC_Preferences{
         * @param string $value value
         * @param string $preCondition only set value if the key had a specific value before
         * @return bool true if value was set, otherwise false
+        * @deprecated use setUserValue of \OCP\IConfig instead
         *
         * Adds a value to the preferences. If the key did not exist before, it
         * will be added automagically.
         */
        public static function setValue( $user, $app, $key, $value, $preCondition = null ) {
-               return self::$object->setValue( $user, $app, $key, $value, $preCondition );
+               return \OC::$server->getConfig()->setUserValue($user, $app, $key, $value);
+
+               // TODO maybe catch exceptions and then return false
+               return true;
        }
 
        /**
@@ -100,24 +81,13 @@ class OC_Preferences{
         * @param string $user user
         * @param string $app app
         * @param string $key key
+        * @return bool true
+        * @deprecated use deleteUserValue of \OCP\IConfig instead
         *
         * Deletes a key.
         */
        public static function deleteKey( $user, $app, $key ) {
-               self::$object->deleteKey( $user, $app, $key );
-               return true;
-       }
-
-       /**
-        * Remove app of user from preferences
-        * @param string $user user
-        * @param string $app app
-        * @return bool
-        *
-        * Removes all keys in preferences belonging to the app and the user.
-        */
-       public static function deleteApp( $user, $app ) {
-               self::$object->deleteApp( $user, $app );
+               \OC::$server->getConfig()->deleteUserValue($user, $app, $key);
                return true;
        }
 
@@ -125,11 +95,12 @@ class OC_Preferences{
         * Remove user from preferences
         * @param string $user user
         * @return bool
+        * @deprecated use deleteUser of \OCP\IConfig instead
         *
         * Removes all keys in preferences belonging to the user.
         */
        public static function deleteUser( $user ) {
-               self::$object->deleteUser( $user );
+               \OC::$server->getConfig()->deleteAllUserValues($user);
                return true;
        }
 
@@ -137,11 +108,12 @@ class OC_Preferences{
         * Remove app from all users
         * @param string $app app
         * @return bool
+        * @deprecated use deleteAppFromAllUsers of \OCP\IConfig instead
         *
         * Removes all keys in preferences belonging to the app.
         */
        public static function deleteAppFromAllUsers( $app ) {
-               self::$object->deleteAppFromAllUsers( $app );
+               \OC::$server->getConfig()->deleteAppFromAllUsers($app);
                return true;
        }
 }
index cdaa207449d8b2b186190d7cbbcc8190d8702c48..9f33136aeb2b5967febaefa8441e7d40107d371d 100644 (file)
@@ -41,12 +41,9 @@ use OCP\IDBConnection;
 
 /**
  * This class provides an easy way for storing user preferences.
+ * @deprecated use \OCP\IConfig methods instead
  */
 class Preferences {
-       /**
-        * @var \OC\DB\Connection
-        */
-       protected $conn;
 
        /**
         * 3 dimensional array with the following structure:
@@ -60,65 +57,14 @@ class Preferences {
         */
        protected $cache = array();
 
+       /** @var \OCP\IConfig */
+       protected $config;
+
        /**
         * @param \OCP\IDBConnection $conn
         */
        public function __construct(IDBConnection $conn) {
-               $this->conn = $conn;
-       }
-
-       /**
-        * Get all users using the preferences
-        * @return array an array of user ids
-        *
-        * This function returns a list of all users that have at least one entry
-        * in the preferences table.
-        */
-       public function getUsers() {
-               $query = 'SELECT DISTINCT `userid` FROM `*PREFIX*preferences`';
-               $result = $this->conn->executeQuery($query);
-
-               $users = array();
-               while ($userid = $result->fetchColumn()) {
-                       $users[] = $userid;
-               }
-
-               return $users;
-       }
-
-       /**
-        * @param string $user
-        * @return array[]
-        */
-       protected function getUserValues($user) {
-               if (isset($this->cache[$user])) {
-                       return $this->cache[$user];
-               }
-               $data = array();
-               $query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';
-               $result = $this->conn->executeQuery($query, array($user));
-               while ($row = $result->fetch()) {
-                       $app = $row['appid'];
-                       if (!isset($data[$app])) {
-                               $data[$app] = array();
-                       }
-                       $data[$app][$row['configkey']] = $row['configvalue'];
-               }
-               $this->cache[$user] = $data;
-               return $data;
-       }
-
-       /**
-        * Get all apps of an user
-        * @param string $user user
-        * @return integer[] with app ids
-        *
-        * This function returns a list of all apps of the user that have at least
-        * one entry in the preferences table.
-        */
-       public function getApps($user) {
-               $data = $this->getUserValues($user);
-               return array_keys($data);
+               $this->config = \OC::$server->getConfig();
        }
 
        /**
@@ -126,17 +72,13 @@ class Preferences {
         * @param string $user user
         * @param string $app the app we are looking for
         * @return array an array of key names
+        * @deprecated use getUserKeys of \OCP\IConfig instead
         *
         * This function gets all keys of an app of an user. Please note that the
         * values are not returned.
         */
        public function getKeys($user, $app) {
-               $data = $this->getUserValues($user);
-               if (isset($data[$app])) {
-                       return array_keys($data[$app]);
-               } else {
-                       return array();
-               }
+               return $this->config->getUserKeys($user, $app);
        }
 
        /**
@@ -146,17 +88,13 @@ class Preferences {
         * @param string $key key
         * @param string $default = null, default value if the key does not exist
         * @return string the value or $default
+        * @deprecated use getUserValue of \OCP\IConfig instead
         *
         * This function gets a value from the preferences table. If the key does
         * not exist the default value will be returned
         */
        public function getValue($user, $app, $key, $default = null) {
-               $data = $this->getUserValues($user);
-               if (isset($data[$app]) and isset($data[$app][$key])) {
-                       return $data[$app][$key];
-               } else {
-                       return $default;
-               }
+               return $this->config->getUserValue($user, $app, $key, $default);
        }
 
        /**
@@ -167,59 +105,16 @@ class Preferences {
         * @param string $value value
         * @param string $preCondition only set value if the key had a specific value before
         * @return bool true if value was set, otherwise false
+        * @deprecated use setUserValue of \OCP\IConfig instead
         *
         * Adds a value to the preferences. If the key did not exist before, it
         * will be added automagically.
         */
        public function setValue($user, $app, $key, $value, $preCondition = null) {
-               // Check if the key does exist
-               $query = 'SELECT `configvalue` FROM `*PREFIX*preferences`'
-                       . ' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?';
-               $oldValue = $this->conn->fetchColumn($query, array($user, $app, $key));
-               $exists = $oldValue !== false;
-
-               if($oldValue === strval($value)) {
-                       // no changes
-                       return true;
-               }
-               
-               $affectedRows = 0;
-
-               if (!$exists && $preCondition === null) {
-                       $data = array(
-                               'userid' => $user,
-                               'appid' => $app,
-                               'configkey' => $key,
-                               'configvalue' => $value,
-                       );
-                       $affectedRows = $this->conn->insert('*PREFIX*preferences', $data);
-               } elseif ($exists) {
-                       $data = array($value, $user, $app, $key);
-                       $sql  = "UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
-                                       . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?";
-
-                       if ($preCondition !== null) {
-                               if (\OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') {
-                                       //oracle hack: need to explicitly cast CLOB to CHAR for comparison
-                                       $sql .= " AND to_char(`configvalue`) = ?";
-                               } else {
-                                       $sql .= " AND `configvalue` = ?";
-                               }
-                               $data[] = $preCondition;
-                       }
-                       $affectedRows = $this->conn->executeUpdate($sql, $data);
-               }
-
-               // only add to the cache if we already loaded data for the user
-               if ($affectedRows > 0 && isset($this->cache[$user])) {
-                       if (!isset($this->cache[$user][$app])) {
-                               $this->cache[$user][$app] = array();
-                       }
-                       $this->cache[$user][$app][$key] = $value;
-               }
-
-               return ($affectedRows > 0) ? true : false;
+               return $this->config->setUserValue($user, $app, $key, $value);
 
+               // TODO maybe catch exceptions and then return false
+               return true;
        }
 
        /**
@@ -228,35 +123,10 @@ class Preferences {
         * @param string $key
         * @param array $users
         * @return array Mapped values: userid => value
+        * @deprecated use getUserValueForUsers of \OCP\IConfig instead
         */
        public function getValueForUsers($app, $key, $users) {
-               if (empty($users) || !is_array($users)) {
-                       return array();
-               }
-
-               $chunked_users = array_chunk($users, 50, true);
-               $placeholders_50 = implode(',', array_fill(0, 50, '?'));
-
-               $userValues = array();
-               foreach ($chunked_users as $chunk) {
-                       $queryParams = $chunk;
-                       array_unshift($queryParams, $key);
-                       array_unshift($queryParams, $app);
-
-                       $placeholders = (sizeof($chunk) == 50) ? $placeholders_50 : implode(',', array_fill(0, sizeof($chunk), '?'));
-
-                       $query = 'SELECT `userid`, `configvalue` '
-                               . ' FROM `*PREFIX*preferences` '
-                               . ' WHERE `appid` = ? AND `configkey` = ?'
-                               . ' AND `userid` IN (' . $placeholders . ')';
-                       $result = $this->conn->executeQuery($query, $queryParams);
-
-                       while ($row = $result->fetch()) {
-                               $userValues[$row['userid']] = $row['configvalue'];
-                       }
-               }
-
-               return $userValues;
+               return $this->config->getUserValueForUsers($app, $key, $users);
        }
 
        /**
@@ -265,28 +135,10 @@ class Preferences {
         * @param string $key
         * @param string $value
         * @return array
+        * @deprecated use getUsersForUserValue of \OCP\IConfig instead
         */
        public function getUsersForValue($app, $key, $value) {
-               $users = array();
-
-               $query = 'SELECT `userid` '
-                       . ' FROM `*PREFIX*preferences` '
-                       . ' 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()) {
-                       $users[] = $row['userid'];
-               }
-
-               return $users;
+               return $this->config->getUsersForUserValue($app, $key, $value);
        }
 
        /**
@@ -294,72 +146,33 @@ class Preferences {
         * @param string $user user
         * @param string $app app
         * @param string $key key
+        * @deprecated use deleteUserValue of \OCP\IConfig instead
         *
         * Deletes a key.
         */
        public function deleteKey($user, $app, $key) {
-               $where = array(
-                       'userid' => $user,
-                       'appid' => $app,
-                       'configkey' => $key,
-               );
-               $this->conn->delete('*PREFIX*preferences', $where);
-
-               if (isset($this->cache[$user]) and isset($this->cache[$user][$app])) {
-                       unset($this->cache[$user][$app][$key]);
-               }
-       }
-
-       /**
-        * Remove app of user from preferences
-        * @param string $user user
-        * @param string $app app
-        *
-        * Removes all keys in preferences belonging to the app and the user.
-        */
-       public function deleteApp($user, $app) {
-               $where = array(
-                       'userid' => $user,
-                       'appid' => $app,
-               );
-               $this->conn->delete('*PREFIX*preferences', $where);
-
-               if (isset($this->cache[$user])) {
-                       unset($this->cache[$user][$app]);
-               }
+               $this->config->deleteUserValue($user, $app, $key);
        }
 
        /**
         * Remove user from preferences
         * @param string $user user
+        * @deprecated use deleteAllUserValues of \OCP\IConfig instead
         *
         * Removes all keys in preferences belonging to the user.
         */
        public function deleteUser($user) {
-               $where = array(
-                       'userid' => $user,
-               );
-               $this->conn->delete('*PREFIX*preferences', $where);
-
-               unset($this->cache[$user]);
+               $this->config->deleteAllUserValues($user);
        }
 
        /**
         * Remove app from all users
         * @param string $app app
+        * @deprecated use deleteAppFromAllUsers of \OCP\IConfig instead
         *
         * Removes all keys in preferences belonging to the app.
         */
        public function deleteAppFromAllUsers($app) {
-               $where = array(
-                       'appid' => $app,
-               );
-               $this->conn->delete('*PREFIX*preferences', $where);
-
-               foreach ($this->cache as &$userCache) {
-                       unset($userCache[$app]);
-               }
+               $this->config->deleteAppFromAllUsers($app);
        }
 }
-
-require_once __DIR__ . '/legacy/' . basename(__FILE__);
index 5a1e955bdd2691964da8993bb73b696aa4d33fe6..28406d873193f91efc2ab57a34f102819c3350b9 100644 (file)
@@ -168,7 +168,8 @@ class Server extends SimpleContainer implements IServerContainer {
                });
                $this->registerService('AllConfig', function (Server $c) {
                        return new \OC\AllConfig(
-                               $c->getSystemConfig()
+                               $c->getSystemConfig(),
+                               $c->getDatabaseConnection()
                        );
                });
                $this->registerService('SystemConfig', function ($c) {
index fe155cc61b0bf90e22c09f143e11871bb4148c8b..1d3502ffb4c79c7d8d7a71fbeb4d204ba388fc03 100644 (file)
@@ -109,7 +109,6 @@ interface IConfig {
         * @param string $appName the appName that we want to store the value under
         * @param string $key the key under which the value is being stored
         * @param string $value the value that you want to store
-        * @return void
         */
        public function setUserValue($userId, $appName, $key, $value);
 
@@ -124,6 +123,16 @@ interface IConfig {
         */
        public function getUserValue($userId, $appName, $key, $default = '');
 
+       /**
+        * Fetches a mapped list of userId -> value, for a specified app and key and a list of user IDs.
+        *
+        * @param $appName app to get the value for
+        * @param $key the key to get the value for
+        * @param $userIds the user IDs to fetch the values for
+        * @return array Mapped values: userId => value
+        */
+       public function getUserValueForUsers($appName, $key, $userIds);
+
        /**
         * Get the keys of all stored by an app for the user
         *
@@ -148,4 +157,21 @@ interface IConfig {
         * @param string $userId the userId of the user that we want to remove all values from
         */
        public function deleteAllUserValues($userId);
+
+       /**
+        * Delete all user related values of one app
+        *
+        * @param string $appName the appName of the app that we want to remove all values from
+        */
+       public function deleteAppFromAllUsers($appName);
+
+       /**
+        * Determines the users that have the given value set for a specific app-key-pair
+        *
+        * @param string $appName the app to get the user for
+        * @param string $key the key to get the user for
+        * @param string $value the value to get the user for
+        * @return array of user IDs
+        */
+       public function getUsersForUserValue($appName, $key, $value);
 }
diff --git a/tests/lib/allconfig.php b/tests/lib/allconfig.php
new file mode 100644 (file)
index 0000000..a2da46a
--- /dev/null
@@ -0,0 +1,334 @@
+<?php
+/**
+ * Copyright (c) 2014 Morris Jobke <hey@morrisjobke.de>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test;
+
+class TestAllConfig extends \Test\TestCase {
+
+       /** @var  \OCP\IDBConnection */
+       protected $connection;
+
+       protected function getConfig($systemConfig = null, $connection = null) {
+               if($this->connection === null) {
+                       $this->connection = \OC::$server->getDatabaseConnection();
+               }
+               if($connection === null) {
+                       $connection = $this->connection;
+               }
+               if($systemConfig === null) {
+                       $systemConfig = $this->getMock('\OC\SystemConfig');
+               }
+               return new \OC\AllConfig($systemConfig, $connection);
+       }
+
+       public function testDeleteUserValue() {
+               $config = $this->getConfig();
+
+               // preparation - add something to the database
+               $this->connection->executeUpdate(
+                       'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                       '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                       array('userDelete', 'appDelete', 'keyDelete', 'valueDelete')
+               );
+
+               $config->deleteUserValue('userDelete', 'appDelete', 'keyDelete');
+
+               $result = $this->connection->executeQuery(
+                               'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences` WHERE `userid` = ?',
+                               array('userDelete')
+                       )->fetch();
+               $actualCount = $result['count'];
+
+               $this->assertEquals(0, $actualCount, 'There was one value in the database and after the tests there should be no entry left.');
+       }
+
+       public function testSetUserValue() {
+               $selectAllSQL = 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';
+               $config = $this->getConfig();
+
+               $config->setUserValue('userSet', 'appSet', 'keySet', 'valueSet');
+
+               $result = $this->connection->executeQuery($selectAllSQL, array('userSet'))->fetchAll();
+
+               $this->assertEquals(1, count($result));
+               $this->assertEquals(array(
+                       'userid'      => 'userSet',
+                       'appid'       => 'appSet',
+                       'configkey'   => 'keySet',
+                       'configvalue' => 'valueSet'
+               ), $result[0]);
+
+               // test if the method overwrites existing database entries
+               $config->setUserValue('userSet', 'appSet', 'keySet', 'valueSet2');
+
+               $result = $this->connection->executeQuery($selectAllSQL, array('userSet'))->fetchAll();
+
+               $this->assertEquals(1, count($result));
+               $this->assertEquals(array(
+                       'userid'      => 'userSet',
+                       'appid'       => 'appSet',
+                       'configkey'   => 'keySet',
+                       'configvalue' => 'valueSet2'
+               ), $result[0]);
+
+               // cleanup - it therefore relies on the successful execution of the previous test
+               $config->deleteUserValue('userSet', 'appSet', 'keySet');
+       }
+
+       public function testSetUserValueUnchanged() {
+               $resultMock = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement')
+                       ->disableOriginalConstructor()->getMock();
+               $resultMock->expects($this->once())
+                       ->method('fetchColumn')
+                       ->will($this->returnValue('valueSetUnchanged'));
+
+               $connectionMock = $this->getMock('\OCP\IDBConnection');
+               $connectionMock->expects($this->once())
+                       ->method('executeQuery')
+                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences` '.
+                                       'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
+                               $this->equalTo(array('userSetUnchanged', 'appSetUnchanged', 'keySetUnchanged')))
+                       ->will($this->returnValue($resultMock));
+               $connectionMock->expects($this->never())
+                       ->method('executeUpdate');
+
+               $config = $this->getConfig(null, $connectionMock);
+
+               $config->setUserValue('userSetUnchanged', 'appSetUnchanged', 'keySetUnchanged', 'valueSetUnchanged');
+       }
+
+       public function testGetUserValue() {
+               $config = $this->getConfig();
+
+               // setup - it therefore relies on the successful execution of the previous test
+               $config->setUserValue('userGet', 'appGet', 'keyGet', 'valueGet');
+               $value = $config->getUserValue('userGet', 'appGet', 'keyGet');
+
+               $this->assertEquals('valueGet', $value);
+
+               $result = $this->connection->executeQuery(
+                       'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?',
+                       array('userGet')
+               )->fetchAll();
+
+               $this->assertEquals(1, count($result));
+               $this->assertEquals(array(
+                       'userid'      => 'userGet',
+                       'appid'       => 'appGet',
+                       'configkey'   => 'keyGet',
+                       'configvalue' => 'valueGet'
+               ), $result[0]);
+
+               // drop data from database - but the config option should be cached in the config object
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?', array('userGet'));
+
+               // testing the caching mechanism
+               $value = $config->getUserValue('userGet', 'appGet', 'keyGet');
+
+               $this->assertEquals('valueGet', $value);
+
+               $result = $this->connection->executeQuery(
+                       'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?',
+                       array('userGet')
+               )->fetchAll();
+
+               $this->assertEquals(0, count($result));
+       }
+
+       public function testGetUserKeys() {
+               $config = $this->getConfig();
+
+               // preparation - add something to the database
+               $data = array(
+                       array('userFetch', 'appFetch1', 'keyFetch1', 'value1'),
+                       array('userFetch', 'appFetch1', 'keyFetch2', 'value2'),
+                       array('userFetch', 'appFetch2', 'keyFetch3', 'value3'),
+                       array('userFetch', 'appFetch1', 'keyFetch4', 'value4'),
+                       array('userFetch', 'appFetch4', 'keyFetch1', 'value5'),
+                       array('userFetch', 'appFetch5', 'keyFetch1', 'value6'),
+                       array('userFetch2', 'appFetch', 'keyFetch1', 'value7')
+               );
+               foreach ($data as $entry) {
+                       $this->connection->executeUpdate(
+                               'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                               '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                               $entry
+                       );
+               }
+
+               $value = $config->getUserKeys('userFetch', 'appFetch1');
+               $this->assertEquals(array('keyFetch1', 'keyFetch2', 'keyFetch4'), $value);
+
+               $value = $config->getUserKeys('userFetch2', 'appFetch');
+               $this->assertEquals(array('keyFetch1'), $value);
+
+               // cleanup
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`');
+       }
+
+       public function testGetUserValueDefault() {
+               $config = $this->getConfig();
+
+               $this->assertEquals('', $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset'));
+               $this->assertEquals(null, $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset', null));
+               $this->assertEquals('foobar', $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset', 'foobar'));
+       }
+
+       public function testGetUserValueForUsers() {
+               $config = $this->getConfig();
+
+               // preparation - add something to the database
+               $data = array(
+                       array('userFetch1', 'appFetch2', 'keyFetch1', 'value1'),
+                       array('userFetch2', 'appFetch2', 'keyFetch1', 'value2'),
+                       array('userFetch3', 'appFetch2', 'keyFetch1', 3),
+                       array('userFetch4', 'appFetch2', 'keyFetch1', 'value4'),
+                       array('userFetch5', 'appFetch2', 'keyFetch1', 'value5'),
+                       array('userFetch6', 'appFetch2', 'keyFetch1', 'value6'),
+                       array('userFetch7', 'appFetch2', 'keyFetch1', 'value7')
+               );
+               foreach ($data as $entry) {
+                       $this->connection->executeUpdate(
+                               'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                               '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                               $entry
+                       );
+               }
+
+               $value = $config->getUserValueForUsers('appFetch2', 'keyFetch1',
+                       array('userFetch1', 'userFetch2', 'userFetch3', 'userFetch5'));
+               $this->assertEquals(array(
+                               'userFetch1' => 'value1',
+                               'userFetch2' => 'value2',
+                               'userFetch3' => 3,
+                               'userFetch5' => 'value5'
+                       ), $value);
+
+               $value = $config->getUserValueForUsers('appFetch2', 'keyFetch1',
+                       array('userFetch1', 'userFetch4', 'userFetch9'));
+               $this->assertEquals(array(
+                       'userFetch1' => 'value1',
+                       'userFetch4' => 'value4'
+               ), $value, 'userFetch9 is an non-existent user and should not be shown.');
+
+               // cleanup
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`');
+       }
+
+       public function testDeleteAllUserValues() {
+               $config = $this->getConfig();
+
+               // preparation - add something to the database
+               $data = array(
+                       array('userFetch3', 'appFetch1', 'keyFetch1', 'value1'),
+                       array('userFetch3', 'appFetch1', 'keyFetch2', 'value2'),
+                       array('userFetch3', 'appFetch2', 'keyFetch3', 'value3'),
+                       array('userFetch3', 'appFetch1', 'keyFetch4', 'value4'),
+                       array('userFetch3', 'appFetch4', 'keyFetch1', 'value5'),
+                       array('userFetch3', 'appFetch5', 'keyFetch1', 'value6'),
+                       array('userFetch4', 'appFetch2', 'keyFetch1', 'value7')
+               );
+               foreach ($data as $entry) {
+                       $this->connection->executeUpdate(
+                               'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                               '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                               $entry
+                       );
+               }
+
+               $config->deleteAllUserValues('userFetch3');
+
+               $result = $this->connection->executeQuery(
+                       'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`'
+               )->fetch();
+               $actualCount = $result['count'];
+
+               $this->assertEquals(1, $actualCount, 'After removing `userFetch3` there should be exactly 1 entry left.');
+
+               // cleanup
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`');
+       }
+
+       public function testDeleteAppFromAllUsers() {
+               $config = $this->getConfig();
+
+               // preparation - add something to the database
+               $data = array(
+                       array('userFetch5', 'appFetch1', 'keyFetch1', 'value1'),
+                       array('userFetch5', 'appFetch1', 'keyFetch2', 'value2'),
+                       array('userFetch5', 'appFetch2', 'keyFetch3', 'value3'),
+                       array('userFetch5', 'appFetch1', 'keyFetch4', 'value4'),
+                       array('userFetch5', 'appFetch4', 'keyFetch1', 'value5'),
+                       array('userFetch5', 'appFetch5', 'keyFetch1', 'value6'),
+                       array('userFetch6', 'appFetch2', 'keyFetch1', 'value7')
+               );
+               foreach ($data as $entry) {
+                       $this->connection->executeUpdate(
+                               'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                               '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                               $entry
+                       );
+               }
+
+               $config->deleteAppFromAllUsers('appFetch1');
+
+               $result = $this->connection->executeQuery(
+                       'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`'
+               )->fetch();
+               $actualCount = $result['count'];
+
+               $this->assertEquals(4, $actualCount, 'After removing `appFetch1` there should be exactly 4 entries left.');
+
+               $config->deleteAppFromAllUsers('appFetch2');
+
+               $result = $this->connection->executeQuery(
+                       'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`'
+               )->fetch();
+               $actualCount = $result['count'];
+
+               $this->assertEquals(2, $actualCount, 'After removing `appFetch2` there should be exactly 2 entries left.');
+
+               // cleanup
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`');
+       }
+
+       public function testGetUsersForUserValue() {
+               // mock the check for the database to run the correct SQL statements for each database type
+               $systemConfig = $this->getMock('\OC\SystemConfig');
+               $systemConfig->expects($this->once())
+                       ->method('getValue')
+                       ->with($this->equalTo('dbtype'),
+                               $this->equalTo('sqlite'))
+                       ->will($this->returnValue(\OC::$server->getConfig()->getSystemValue('dbtype', 'sqlite')));
+               $config = $this->getConfig($systemConfig);
+
+               // preparation - add something to the database
+               $data = array(
+                       array('user1', 'appFetch9', 'keyFetch9', 'value9'),
+                       array('user2', 'appFetch9', 'keyFetch9', 'value9'),
+                       array('user3', 'appFetch9', 'keyFetch9', 'value8'),
+                       array('user4', 'appFetch9', 'keyFetch8', 'value9'),
+                       array('user5', 'appFetch8', 'keyFetch9', 'value9'),
+                       array('user6', 'appFetch9', 'keyFetch9', 'value9'),
+               );
+               foreach ($data as $entry) {
+                       $this->connection->executeUpdate(
+                               'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' .
+                               '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)',
+                               $entry
+                       );
+               }
+
+               $value = $config->getUsersForUserValue('appFetch9', 'keyFetch9', 'value9');
+               $this->assertEquals(array('user1', 'user2', 'user6'), $value);
+
+               // cleanup
+               $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`');
+       }
+
+}
diff --git a/tests/lib/preferences-singleton.php b/tests/lib/preferences-singleton.php
deleted file mode 100644 (file)
index 01e15ac..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it>
- * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-class Test_Preferences extends \Test\TestCase {
-       public static function setUpBeforeClass() {
-               parent::setUpBeforeClass();
-
-               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
-               $query->execute(array("Someuser", "someapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getusersapp", "somekey", "somevalue"));
-               $query->execute(array("Anotheruser", "getusersapp", "somekey", "someothervalue"));
-               $query->execute(array("Anuser", "getusersapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getappsapp", "somekey", "somevalue"));
-
-               $query->execute(array("Someuser", "getkeysapp", "firstkey", "somevalue"));
-               $query->execute(array("Someuser", "getkeysapp", "anotherkey", "somevalue"));
-               $query->execute(array("Someuser", "getkeysapp", "key-tastic", "somevalue"));
-
-               $query->execute(array("Someuser", "getvalueapp", "key", "a value for a key"));
-
-               $query->execute(array("Deleteuser", "deleteapp", "deletekey", "somevalue"));
-               $query->execute(array("Deleteuser", "deleteapp", "somekey", "somevalue"));
-               $query->execute(array("Deleteuser", "someapp", "somekey", "somevalue"));
-       }
-
-       public static function tearDownAfterClass() {
-               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $query->execute(array('Someuser'));
-               $query->execute(array('Anotheruser'));
-               $query->execute(array('Anuser'));
-
-               parent::tearDownAfterClass();
-       }
-
-       public function testGetUsers() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`');
-               $result = $query->execute();
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['userid'];
-               }
-
-               sort($expected);
-               $users = \OC_Preferences::getUsers();
-               sort($users);
-               $this->assertEquals($expected, $users);
-       }
-
-       public function testGetApps() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $result = $query->execute(array('Someuser'));
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['appid'];
-               }
-
-               sort($expected);
-               $apps = \OC_Preferences::getApps('Someuser');
-               sort($apps);
-               $this->assertEquals($expected, $apps);
-       }
-
-       public function testGetKeys() {
-               $query = \OC_DB::prepare('SELECT DISTINCT `configkey` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
-               $result = $query->execute(array('Someuser', 'getkeysapp'));
-               $expected = array();
-               while ($row = $result->fetchRow()) {
-                       $expected[] = $row['configkey'];
-               }
-
-               sort($expected);
-               $keys = \OC_Preferences::getKeys('Someuser', 'getkeysapp');
-               sort($keys);
-               $this->assertEquals($expected, $keys);
-       }
-
-       public function testGetValue() {
-               $this->assertNull(\OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant'));
-
-               $this->assertEquals('default', \OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant', 'default'));
-
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'getvalueapp', 'key'));
-               $row = $result->fetchRow();
-               $expected = $row['configvalue'];
-               $this->assertEquals($expected, \OC_Preferences::getValue('Someuser', 'getvalueapp', 'key'));
-       }
-
-       public function testSetValue() {
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('othervalue', $value);
-       }
-
-       public function testSetValueWithPreCondition() {
-               // remove existing key
-               $this->assertTrue(\OC_Preferences::deleteKey('Someuser', 'setvalueapp', 'newkey'));
-
-               // add new preference with pre-condition should fails
-               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue', 'preCondition'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $this->assertFalse($row);
-
-               // add new preference without pre-condition should insert the new value
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               // wrong pre-condition, value should stay the same
-               $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'preCondition'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('newvalue', $value);
-
-               // correct pre-condition, value should change
-               $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'newvalue'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey'));
-               $row = $result->fetchRow();
-               $value = $row['configvalue'];
-               $this->assertEquals('othervalue', $value);
-       }
-
-       public function testDeleteKey() {
-               $this->assertTrue(\OC_Preferences::deleteKey('Deleteuser', 'deleteapp', 'deletekey'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
-               $result = $query->execute(array('Deleteuser', 'deleteapp', 'deletekey'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteApp() {
-               $this->assertTrue(\OC_Preferences::deleteApp('Deleteuser', 'deleteapp'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
-               $result = $query->execute(array('Deleteuser', 'deleteapp'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteUser() {
-               $this->assertTrue(\OC_Preferences::deleteUser('Deleteuser'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?');
-               $result = $query->execute(array('Deleteuser'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-
-       public function testDeleteAppFromAllUsers() {
-               $this->assertTrue(\OC_Preferences::deleteAppFromAllUsers('someapp'));
-               $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `appid` = ?');
-               $result = $query->execute(array('someapp'));
-               $this->assertEquals(0, count($result->fetchAll()));
-       }
-}
diff --git a/tests/lib/preferences.php b/tests/lib/preferences.php
deleted file mode 100644 (file)
index 193b1f8..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it>
- * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-class Test_Preferences_Object extends \Test\TestCase {
-       public function testGetUsers()
-       {
-               $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
-               $statementMock->expects($this->exactly(2))
-                       ->method('fetchColumn')
-                       ->will($this->onConsecutiveCalls('foo', false));
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->once())
-                       ->method('executeQuery')
-                       ->with($this->equalTo('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`'))
-                       ->will($this->returnValue($statementMock));
-
-               $preferences = new OC\Preferences($connectionMock);
-               $apps = $preferences->getUsers();
-               $this->assertEquals(array('foo'), $apps);
-       }
-
-       public function testSetValue()
-       {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->exactly(2))
-                       ->method('fetchColumn')
-                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
-                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
-                               $this->equalTo(array('grg', 'bar', 'foo')))
-                       ->will($this->onConsecutiveCalls(false, 'v1'));
-               $connectionMock->expects($this->once())
-                       ->method('insert')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                               'appid' => 'bar',
-                                               'configkey' => 'foo',
-                                               'configvalue' => 'v1',
-                                       )
-                               ));
-               $connectionMock->expects($this->once())
-                       ->method('executeUpdate')
-                       ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
-                                               . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"),
-                               $this->equalTo(array('v2', 'grg', 'bar', 'foo'))
-                               );
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->setValue('grg', 'bar', 'foo', 'v1');
-               $preferences->setValue('grg', 'bar', 'foo', 'v2');
-       }
-
-       public function testSetValueUnchanged() {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->exactly(3))
-                       ->method('fetchColumn')
-                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
-                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
-                               $this->equalTo(array('grg', 'bar', 'foo')))
-                       ->will($this->onConsecutiveCalls(false, 'v1', 'v1'));
-               $connectionMock->expects($this->once())
-                       ->method('insert')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                               'appid' => 'bar',
-                                               'configkey' => 'foo',
-                                               'configvalue' => 'v1',
-                                       )
-                               ));
-               $connectionMock->expects($this->never())
-                       ->method('executeUpdate');
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->setValue('grg', 'bar', 'foo', 'v1');
-               $preferences->setValue('grg', 'bar', 'foo', 'v1');
-               $preferences->setValue('grg', 'bar', 'foo', 'v1');
-       }
-
-       public function testSetValueUnchanged2() {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->exactly(3))
-                       ->method('fetchColumn')
-                       ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`'
-                               .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'),
-                               $this->equalTo(array('grg', 'bar', 'foo')))
-                       ->will($this->onConsecutiveCalls(false, 'v1', 'v2'));
-               $connectionMock->expects($this->once())
-                       ->method('insert')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                               'appid' => 'bar',
-                                               'configkey' => 'foo',
-                                               'configvalue' => 'v1',
-                                       )
-                               ));
-               $connectionMock->expects($this->once())
-                       ->method('executeUpdate')
-                       ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?"
-                                               . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"),
-                               $this->equalTo(array('v2', 'grg', 'bar', 'foo'))
-                               );
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->setValue('grg', 'bar', 'foo', 'v1');
-               $preferences->setValue('grg', 'bar', 'foo', 'v2');
-               $preferences->setValue('grg', 'bar', 'foo', 'v2');
-       }
-
-       public function testGetUserValues()
-       {
-               $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
-               $query->execute(array('SomeUser', 'testGetUserValues', 'somekey', 'somevalue'));
-               $query->execute(array('AnotherUser', 'testGetUserValues', 'somekey', 'someothervalue'));
-               $query->execute(array('AUser', 'testGetUserValues', 'somekey', 'somevalue'));
-
-               $preferences = new OC\Preferences(\OC_DB::getConnection());
-               $users = array('SomeUser', 'AnotherUser', 'NoValueSet');
-
-               $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
-               $this->assertUserValues($values);
-
-               // Add a lot of users so the array is chunked
-               for ($i = 1; $i <= 75; $i++) {
-                       array_unshift($users, 'NoValueBefore#' . $i);
-                       array_push($users, 'NoValueAfter#' . $i);
-               }
-
-               $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
-               $this->assertUserValues($values);
-
-               // Clean DB after the test
-               $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?');
-               $query->execute(array('testGetUserValues'));
-       }
-
-       protected function assertUserValues($values) {
-               $this->assertEquals(2, sizeof($values));
-
-               $this->assertArrayHasKey('SomeUser', $values);
-               $this->assertEquals('somevalue', $values['SomeUser']);
-
-               $this->assertArrayHasKey('AnotherUser', $values);
-               $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());
-               $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` = ?');
-               $query->execute(array('testGetUsersForValue'));
-       }
-
-       public function testDeleteKey()
-       {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->once())
-                       ->method('delete')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                               'appid' => 'bar',
-                                               'configkey' => 'foo',
-                                       )
-                               ));
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->deleteKey('grg', 'bar', 'foo');
-       }
-
-       public function testDeleteApp()
-       {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->once())
-                       ->method('delete')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                               'appid' => 'bar',
-                                       )
-                               ));
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->deleteApp('grg', 'bar');
-       }
-
-       public function testDeleteUser()
-       {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->once())
-                       ->method('delete')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'userid' => 'grg',
-                                       )
-                               ));
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->deleteUser('grg');
-       }
-
-       public function testDeleteAppFromAllUsers()
-       {
-               $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
-               $connectionMock->expects($this->once())
-                       ->method('delete')
-                       ->with($this->equalTo('*PREFIX*preferences'),
-                               $this->equalTo(
-                                       array(
-                                               'appid' => 'bar',
-                                       )
-                               ));
-
-               $preferences = new OC\Preferences($connectionMock);
-               $preferences->deleteAppFromAllUsers('bar');
-       }
-}