Fetch all appconfig values for an app at once and cache the results

This commit is contained in:
Robin Appelman 2013-12-18 15:10:12 +01:00
parent 930a46e8e2
commit 5a646477a5
1 changed files with 84 additions and 54 deletions

View File

@ -38,6 +38,9 @@
* database.
*/
class OC_Appconfig {
private static $cache = array();
/**
* @brief Get all apps using the config
* @return array with app ids
@ -79,6 +82,19 @@ class OC_Appconfig{
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
@ -90,14 +106,17 @@ class OC_Appconfig{
* 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"];
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,6 +128,9 @@ class OC_Appconfig{
* @return bool
*/
public static function hasKey($app, $key) {
if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) {
return true;
}
$exists = self::getKeys($app);
return in_array($key, $exists);
}
@ -128,8 +150,7 @@ class OC_Appconfig{
$query = OC_DB::prepare('INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )'
. ' VALUES( ?, ?, ? )');
$query->execute(array($app, $key, $value));
}
else{
} else {
$query = OC_DB::prepare('UPDATE `*PREFIX*appconfig` SET `configvalue` = ?'
. ' WHERE `appid` = ? AND `configkey` = ?');
$query->execute(array($value, $app, $key));
@ -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;
}
/**
@ -154,6 +179,9 @@ class OC_Appconfig{
// Boring!
$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;
}
@ -169,12 +197,14 @@ class OC_Appconfig{
// Nothing special
$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