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

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