1
0
Fork 0

1) Refactor App->config[] into Core\Config

This commit is contained in:
Philipp Holzer 2019-02-03 18:54:25 +01:00
commit be6b229534
No known key found for this signature in database
GPG key ID: 517BE60E2CE5C8A5
11 changed files with 191 additions and 177 deletions

View file

@ -20,6 +20,8 @@ use Friendica\BaseObject;
*/
class Config extends BaseObject
{
public static $config = [];
/**
* @var \Friendica\Core\Config\IConfigAdapter
*/
@ -32,7 +34,7 @@ class Config extends BaseObject
return;
}
if (self::getApp()->getConfigValue('system', 'config_adapter') == 'preload') {
if (self::getConfigValue('system', 'config_adapter') == 'preload') {
self::$adapter = new Config\PreloadConfigAdapter();
} else {
self::$adapter = new Config\JITConfigAdapter();
@ -69,7 +71,7 @@ class Config extends BaseObject
* ($family) and a key.
*
* Get a particular config value from the given category ($family)
* and the $key from a cached storage in $a->config[$uid].
* and the $key from a cached storage in static::config[$uid].
* $instore is only used by the set_config function
* to determine if the key already exists in the DB
* If a key is found in the DB but doesn't exist in
@ -88,7 +90,7 @@ class Config extends BaseObject
{
// Database isn't ready or populated yet, fallback to file config
if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return self::getApp()->getConfigValue($family, $key, $default_value);
return self::getConfigValue($family, $key, $default_value);
}
if (empty(self::$adapter)) {
@ -152,4 +154,116 @@ class Config extends BaseObject
return self::$adapter->delete($family, $key);
}
/**
* Tries to load the specified configuration array into the App->config array.
* Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
*
* @param array $config
* @param bool $overwrite Force value overwrite if the config key already exists
*/
public function loadConfigArray(array $config, $overwrite = false)
{
foreach ($config as $category => $values) {
foreach ($values as $key => $value) {
if ($overwrite) {
self::setConfigValue($category, $key, $value);
} else {
self::setDefaultConfigValue($category, $key, $value);
}
}
}
}
/**
* @param string $cat Config category
* @param string $k Config key
* @param mixed $default Default value if it isn't set
*
* @return string Returns the value of the Config entry
*/
public static function getConfigValue($cat, $k = null, $default = null)
{
$return = $default;
if ($cat === 'config') {
if (isset(self::$config[$k])) {
$return = self::$config[$k];
}
} else {
if (isset(self::$config[$cat][$k])) {
$return = self::$config[$cat][$k];
} elseif ($k == null && isset(self::$config[$cat])) {
$return = self::$config[$cat];
}
}
return $return;
}
/**
* Sets a default value in the config cache. Ignores already existing keys.
*
* @param string $cat Config category
* @param string $k Config key
* @param mixed $v Default value to set
*/
private static function setDefaultConfigValue($cat, $k, $v)
{
if (!isset(self::$config[$cat][$k])) {
self::setConfigValue($cat, $k, $v);
}
}
/**
* Sets a value in the config cache. Accepts raw output from the config table
*
* @param string $cat Config category
* @param string $k Config key
* @param mixed $v Value to set
*/
public static function setConfigValue($cat, $k, $v)
{
// Only arrays are serialized in database, so we have to unserialize sparingly
$value = is_string($v) && preg_match("|^a:[0-9]+:{.*}$|s", $v) ? unserialize($v) : $v;
if ($cat === 'config') {
self::$config[$k] = $value;
} else {
if (!isset(self::$config[$cat])) {
self::$config[$cat] = [];
}
self::$config[$cat][$k] = $value;
}
}
/**
* Deletes a value from the config cache
*
* @param string $cat Config category
* @param string $k Config key
*/
public static function deleteConfigValue($cat, $k)
{
if ($cat === 'config') {
if (isset(self::$config[$k])) {
unset(self::$config[$k]);
}
} else {
if (isset(self::$config[$cat][$k])) {
unset(self::$config[$cat][$k]);
}
}
}
/**
* Returns the whole configuration
*
* @return array The configuration
*/
public static function getAll()
{
return self::$config;
}
}

View file

@ -25,7 +25,7 @@ interface IConfigAdapter
* ($family) and a key.
*
* Get a particular config value from the given category ($family)
* and the $key from a cached storage in $a->config[$uid].
* and the $key from a cached storage in static::$config[$uid].
* $instore is only used by the set_config function
* to determine if the key already exists in the DB
* If a key is found in the DB but doesn't exist in

View file

@ -1,7 +1,7 @@
<?php
namespace Friendica\Core\Config;
use Friendica\BaseObject;
use Friendica\Core\Config;
use Friendica\Database\DBA;
/**
@ -11,7 +11,7 @@ use Friendica\Database\DBA;
*
* @author Hypolite Petovan <hypolite@mrpetovan.com>
*/
class JITConfigAdapter extends BaseObject implements IConfigAdapter
class JITConfigAdapter implements IConfigAdapter
{
private $cache;
private $in_db;
@ -28,7 +28,7 @@ class JITConfigAdapter extends BaseObject implements IConfigAdapter
while ($config = DBA::fetch($configs)) {
$k = $config['k'];
self::getApp()->setConfigValue($cat, $k, $config['v']);
Config::setConfigValue($cat, $k, $config['v']);
if ($cat !== 'config') {
$this->cache[$cat][$k] = $config['v'];
@ -40,8 +40,6 @@ class JITConfigAdapter extends BaseObject implements IConfigAdapter
public function get($cat, $k, $default_value = null, $refresh = false)
{
$a = self::getApp();
if (!$refresh) {
// Do we have the cached value? Then return it
if (isset($this->cache[$cat][$k])) {
@ -62,18 +60,18 @@ class JITConfigAdapter extends BaseObject implements IConfigAdapter
$this->cache[$cat][$k] = $value;
$this->in_db[$cat][$k] = true;
return $value;
} elseif (isset($a->config[$cat][$k])) {
} elseif (Config::getConfigValue($cat, $k) !== null) {
// Assign the value (mostly) from config/local.config.php file to the cache
$this->cache[$cat][$k] = $a->config[$cat][$k];
$this->cache[$cat][$k] = Config::getConfigValue($cat, $k);
$this->in_db[$cat][$k] = false;
return $a->config[$cat][$k];
} elseif (isset($a->config[$k])) {
return Config::getConfigValue($cat, $k);
} elseif (Config::getConfigValue('config', $k) !== null) {
// Assign the value (mostly) from config/local.config.php file to the cache
$this->cache[$k] = $a->config[$k];
$this->cache[$k] = Config::getConfigValue('config', $k);
$this->in_db[$k] = false;
return $a->config[$k];
return Config::getConfigValue('config', $k);
}
$this->cache[$cat][$k] = '!<unset>!';
@ -102,7 +100,7 @@ class JITConfigAdapter extends BaseObject implements IConfigAdapter
return true;
}
self::getApp()->setConfigValue($cat, $k, $value);
Config::setConfigValue($cat, $k, $value);
// Assign the just added value to the cache
$this->cache[$cat][$k] = $dbvalue;

View file

@ -3,7 +3,7 @@
namespace Friendica\Core\Config;
use Exception;
use Friendica\BaseObject;
use Friendica\Core\Config;
use Friendica\Database\DBA;
/**
@ -13,7 +13,7 @@ use Friendica\Database\DBA;
*
* @author Hypolite Petovan <hypolite@mrpetovan.com>
*/
class PreloadConfigAdapter extends BaseObject implements IConfigAdapter
class PreloadConfigAdapter implements IConfigAdapter
{
private $config_loaded = false;
@ -30,7 +30,7 @@ class PreloadConfigAdapter extends BaseObject implements IConfigAdapter
$configs = DBA::select('config', ['cat', 'v', 'k']);
while ($config = DBA::fetch($configs)) {
self::getApp()->setConfigValue($config['cat'], $config['k'], $config['v']);
Config::setConfigValue($config['cat'], $config['k'], $config['v']);
}
DBA::close($configs);
@ -42,11 +42,11 @@ class PreloadConfigAdapter extends BaseObject implements IConfigAdapter
if ($refresh) {
$config = DBA::selectFirst('config', ['v'], ['cat' => $cat, 'k' => $k]);
if (DBA::isResult($config)) {
self::getApp()->setConfigValue($cat, $k, $config['v']);
Config::setConfigValue($cat, $k, $config['v']);
}
}
$return = self::getApp()->getConfigValue($cat, $k, $default_value);
$return = Config::getConfigValue($cat, $k, $default_value);
return $return;
}
@ -58,11 +58,11 @@ class PreloadConfigAdapter extends BaseObject implements IConfigAdapter
// The exception are array values.
$compare_value = !is_array($value) ? (string)$value : $value;
if (self::getApp()->getConfigValue($cat, $k) === $compare_value) {
if (Config::getConfigValue($cat, $k) === $compare_value) {
return true;
}
self::getApp()->setConfigValue($cat, $k, $value);
Config::setConfigValue($cat, $k, $value);
// manage array value
$dbvalue = is_array($value) ? serialize($value) : $value;
@ -77,7 +77,7 @@ class PreloadConfigAdapter extends BaseObject implements IConfigAdapter
public function delete($cat, $k)
{
self::getApp()->deleteConfigValue($cat, $k);
Config::deleteConfigValue($cat, $k);
$result = DBA::delete('config', ['cat' => $cat, 'k' => $k]);

View file

@ -100,10 +100,10 @@ HELP;
}
}
$db_host = $a->getConfigValue('database', 'hostname');
$db_user = $a->getConfigValue('database', 'username');
$db_pass = $a->getConfigValue('database', 'password');
$db_data = $a->getConfigValue('database', 'database');
$db_host = Config::getConfigValue('database', 'hostname');
$db_user = Config::getConfigValue('database', 'username');
$db_pass = Config::getConfigValue('database', 'password');
$db_data = Config::getConfigValue('database', 'database');
} else {
// Creating config file
$this->out("Creating config file...\n");

View file

@ -124,9 +124,10 @@ HELP;
$cat = $this->getArgument(0);
Core\Config::load($cat);
if (!is_null($a->config[$cat])) {
if (Core\Config::getConfigValue($cat) !== null) {
$this->out("[{$cat}]");
foreach ($a->config[$cat] as $key => $value) {
$catVal = Core\Config::getConfigValue($cat);
foreach ($catVal as $key => $value) {
if (is_array($value)) {
foreach ($value as $k => $v) {
$this->out("{$key}[{$k}] => " . $v);
@ -147,7 +148,8 @@ HELP;
$this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only');
}
foreach ($a->config as $cat => $section) {
$config = Core\Config::getAll();
foreach ($config as $cat => $section) {
if (is_array($section)) {
foreach ($section as $key => $value) {
if (is_array($value)) {

View file

@ -41,9 +41,7 @@ HELP;
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$a = \get_app();
$php_path = $a->getConfigValue('config', 'php_path', 'php');
$php_path = \Friendica\Core\Config::getConfigValue('config', 'php_path', 'php');
if ($this->getOption('v')) {
$this->out('Directory: src');

View file

@ -34,7 +34,7 @@ class PConfig extends BaseObject
return;
}
if ($a->getConfigValue('system', 'config_adapter') == 'preload') {
if (Config::getConfigValue('system', 'config_adapter') == 'preload') {
self::$adapter = new Config\PreloadPConfigAdapter($uid);
} else {
self::$adapter = new Config\JITPConfigAdapter();