]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fetch all appconfig values for an app at once and cache the results
authorRobin Appelman <icewind@owncloud.com>
Wed, 18 Dec 2013 14:10:12 +0000 (15:10 +0100)
committerRobin Appelman <icewind@owncloud.com>
Wed, 18 Dec 2013 14:10:12 +0000 (15:10 +0100)
lib/private/appconfig.php

index 4f170e054e9bd0148586d3f9eb6a4eb60edb5149..58c037a91e756e8ba35b23d05d17ace673ba69dc 100644 (file)
  * This class provides an easy way for apps to store config values in the
  * database.
  */
-class OC_Appconfig{
+class OC_Appconfig {
+
+       private static $cache = array();
+
        /**
         * @brief Get all apps using the config
         * @return array with app ids
@@ -47,11 +50,11 @@ class OC_Appconfig{
         */
        public static function getApps() {
                // No magic in here!
-               $query = OC_DB::prepare( 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`' );
+               $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`');
                $result = $query->execute();
 
                $apps = array();
-               while$row = $result->fetchRow()) {
+               while ($row = $result->fetchRow()) {
                        $apps[] = $row["appid"];
                }
 
@@ -66,19 +69,32 @@ class OC_Appconfig{
         * This function gets all keys of an app. Please note that the values are
         * not returned.
         */
-       public static function getKeys( $app ) {
+       public static function getKeys($app) {
                // No magic in here as well
-               $query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?' );
-               $result = $query->execute( array( $app ));
+               $query = OC_DB::prepare('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?');
+               $result = $query->execute(array($app));
 
                $keys = array();
-               while$row = $result->fetchRow()) {
+               while ($row = $result->fetchRow()) {
                        $keys[] = $row["configkey"];
                }
 
                return $keys;
        }
 
+       private static function getAppValues($app) {
+               if (!isset(self::$cache[$app])) {
+                       self::$cache[$app] = array();
+               }
+               $query = OC_DB::prepare('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`'
+                       . ' WHERE `appid` = ?');
+               $result = $query->execute(array($app));
+               while ($row = $result->fetchRow()) {
+                       self::$cache[$app][$row['configkey']] = $row['configvalue'];
+               }
+               return self::$cache[$app];
+       }
+
        /**
         * @brief Gets the config value
         * @param string $app app
@@ -89,15 +105,18 @@ class OC_Appconfig{
         * This function gets a value from the appconfig table. If the key does
         * not exist the default value will be returned
         */
-       public static function getValue( $app, $key, $default = null ) {
-               // At least some magic in here :-)
-               $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*appconfig`'
-                       .' WHERE `appid` = ? AND `configkey` = ?' );
-               $result = $query->execute( array( $app, $key ));
-               $row = $result->fetchRow();
-               if($row) {
-                       return $row["configvalue"];
-               }else{
+       public static function getValue($app, $key, $default = null) {
+               if (!isset(self::$cache[$app])) {
+                       self::$cache[$app] = array();
+               }
+               if (isset(self::$cache[$app][$key])) {
+                       return self::$cache[$app][$key];
+               }
+               $values = self::getAppValues($app);
+               if (isset($values[$key])) {
+                       return $values[$key];
+               } else {
+                       self::$cache[$app][$key] = $default;
                        return $default;
                }
        }
@@ -109,8 +128,11 @@ class OC_Appconfig{
         * @return bool
         */
        public static function hasKey($app, $key) {
-               $exists = self::getKeys( $app );
-               return in_array( $key, $exists );
+               if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) {
+                       return true;
+               }
+               $exists = self::getKeys($app);
+               return in_array($key, $exists);
        }
 
        /**
@@ -122,17 +144,16 @@ class OC_Appconfig{
         *
         * Sets a value. If the key did not exist before it will be created.
         */
-       public static function setValue( $app, $key, $value ) {
+       public static function setValue($app, $key, $value) {
                // Does the key exist? yes: update. No: insert
-               if(! self::hasKey($app, $key)) {
-                       $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )'
-                               .' VALUES( ?, ?, ? )' );
-                       $query->execute( array( $app, $key, $value ));
-               }
-               else{
-                       $query = OC_DB::prepare( 'UPDATE `*PREFIX*appconfig` SET `configvalue` = ?'
-                               .' WHERE `appid` = ? AND `configkey` = ?' );
-                       $query->execute( array( $value, $app, $key ));
+               if (!self::hasKey($app, $key)) {
+                       $query = OC_DB::prepare('INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )'
+                               . ' VALUES( ?, ?, ? )');
+                       $query->execute(array($app, $key, $value));
+               } else {
+                       $query = OC_DB::prepare('UPDATE `*PREFIX*appconfig` SET `configvalue` = ?'
+                               . ' WHERE `appid` = ? AND `configkey` = ?');
+                       $query->execute(array($value, $app, $key));
                }
                // TODO where should this be documented?
                \OC_Hook::emit('OC_Appconfig', 'post_set_value', array(
@@ -140,6 +161,10 @@ class OC_Appconfig{
                        'key' => $key,
                        'value' => $value
                ));
+               if (!isset(self::$cache[$app])) {
+                       self::$cache[$app] = array();
+               }
+               self::$cache[$app][$key] = $value;
        }
 
        /**
@@ -150,10 +175,13 @@ class OC_Appconfig{
         *
         * Deletes a key.
         */
-       public static function deleteKey( $app, $key ) {
+       public static function deleteKey($app, $key) {
                // Boring!
-               $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' );
-               $query->execute( array( $app, $key ));
+               $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?');
+               $query->execute(array($app, $key));
+               if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) {
+                       unset(self::$cache[$app][$key]);
+               }
 
                return true;
        }
@@ -165,44 +193,46 @@ class OC_Appconfig{
         *
         * Removes all keys in appconfig belonging to the app.
         */
-       public static function deleteApp( $app ) {
+       public static function deleteApp($app) {
                // Nothing special
-               $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?' );
-               $query->execute( array( $app ));
+               $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?');
+               $query->execute(array($app));
+               self::$cache[$app] = array();
 
                return true;
        }
 
        /**
         * get multiply values, either the app or key can be used as wildcard by setting it to false
+        *
         * @param app
         * @param key
         * @return array
         */
        public static function getValues($app, $key) {
-               if($app!==false and $key!==false) {
+               if ($app !== false and $key !== false) {
                        return false;
                }
-               $fields='`configvalue`';
-               $where='WHERE';
-               $params=array();
-               if($app!==false) {
-                       $fields.=', `configkey`';
-                       $where.=' `appid` = ?';
-                       $params[]=$app;
-                       $key='configkey';
-               }else{
-                       $fields.=', `appid`';
-                       $where.=' `configkey` = ?';
-                       $params[]=$key;
-                       $key='appid';
+               $fields = '`configvalue`';
+               $where = 'WHERE';
+               $params = array();
+               if ($app !== false) {
+                       $fields .= ', `configkey`';
+                       $where .= ' `appid` = ?';
+                       $params[] = $app;
+                       $key = 'configkey';
+               } else {
+                       $fields .= ', `appid`';
+                       $where .= ' `configkey` = ?';
+                       $params[] = $key;
+                       $key = 'appid';
                }
-               $queryString='SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where;
-               $query=OC_DB::prepare($queryString);
-               $result=$query->execute($params);
-               $values=array();
-               while($row=$result->fetchRow()) {
-                       $values[$row[$key]]=$row['configvalue'];
+               $queryString = 'SELECT ' . $fields . ' FROM `*PREFIX*appconfig` ' . $where;
+               $query = OC_DB::prepare($queryString);
+               $result = $query->execute($params);
+               $values = array();
+               while ($row = $result->fetchRow()) {
+                       $values[$row[$key]] = $row['configvalue'];
                }
                return $values;
        }