mirror of
https://github.com/phpbb/phpbb.git
synced 2025-10-09 22:17:14 +02:00
PHPBB3-11015 This allows us to just create the object without having to include the driver first. However, it also means that users must specify the full class name in config.php
208 lines
5.3 KiB
PHP
208 lines
5.3 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* @package phpBB3
|
|
* @copyright (c) 2010 phpBB Group
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
if (!defined('IN_PHPBB'))
|
|
{
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Configuration container class
|
|
* @package phpBB3
|
|
*/
|
|
class phpbb_config_db extends phpbb_config
|
|
{
|
|
/**
|
|
* Cache instance
|
|
* @var phpbb_cache_driver_interface
|
|
*/
|
|
protected $cache;
|
|
|
|
/**
|
|
* Database connection
|
|
* @var dbal
|
|
*/
|
|
protected $db;
|
|
|
|
/**
|
|
* Name of the database table used for configuration.
|
|
* @var string
|
|
*/
|
|
protected $table;
|
|
|
|
/**
|
|
* Creates a configuration container with a default set of values
|
|
*
|
|
* @param dbal $db Database connection
|
|
* @param phpbb_cache_driver_interface $cache Cache instance
|
|
* @param string $table Configuration table name
|
|
*/
|
|
public function __construct(phpbb_db_driver $db, phpbb_cache_driver_interface $cache, $table)
|
|
{
|
|
$this->db = $db;
|
|
$this->cache = $cache;
|
|
$this->table = $table;
|
|
|
|
if (($config = $cache->get('config')) !== false)
|
|
{
|
|
$sql = 'SELECT config_name, config_value
|
|
FROM ' . $this->table . '
|
|
WHERE is_dynamic = 1';
|
|
$result = $this->db->sql_query($sql);
|
|
|
|
while ($row = $this->db->sql_fetchrow($result))
|
|
{
|
|
$config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
$this->db->sql_freeresult($result);
|
|
}
|
|
else
|
|
{
|
|
$config = $cached_config = array();
|
|
|
|
$sql = 'SELECT config_name, config_value, is_dynamic
|
|
FROM ' . $this->table;
|
|
$result = $this->db->sql_query($sql);
|
|
|
|
while ($row = $this->db->sql_fetchrow($result))
|
|
{
|
|
if (!$row['is_dynamic'])
|
|
{
|
|
$cached_config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
|
|
$config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
$this->db->sql_freeresult($result);
|
|
|
|
$cache->put('config', $cached_config);
|
|
}
|
|
|
|
parent::__construct($config);
|
|
}
|
|
|
|
/**
|
|
* Removes a configuration option
|
|
*
|
|
* @param String $key The configuration option's name
|
|
* @param bool $use_cache Whether this variable should be cached or if it
|
|
* changes too frequently to be efficiently cached
|
|
* @return void
|
|
*/
|
|
public function delete($key, $use_cache = true)
|
|
{
|
|
$sql = 'DELETE FROM ' . $this->table . "
|
|
WHERE config_name = '" . $this->db->sql_escape($key) . "'";
|
|
$this->db->sql_query($sql);
|
|
|
|
unset($this->config[$key]);
|
|
|
|
if ($use_cache)
|
|
{
|
|
$this->cache->destroy('config');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets a configuration option's value
|
|
*
|
|
* @param string $key The configuration option's name
|
|
* @param string $value New configuration value
|
|
* @param bool $use_cache Whether this variable should be cached or if it
|
|
* changes too frequently to be efficiently cached.
|
|
*/
|
|
public function set($key, $value, $use_cache = true)
|
|
{
|
|
$this->set_atomic($key, false, $value, $use_cache);
|
|
}
|
|
|
|
/**
|
|
* Sets a configuration option's value only if the old_value matches the
|
|
* current configuration value or the configuration value does not exist yet.
|
|
*
|
|
* @param string $key The configuration option's name
|
|
* @param mixed $old_value Current configuration value or false to ignore
|
|
* the old value
|
|
* @param string $new_value New configuration value
|
|
* @param bool $use_cache Whether this variable should be cached or if it
|
|
* changes too frequently to be efficiently cached
|
|
* @return bool True if the value was changed, false otherwise
|
|
*/
|
|
public function set_atomic($key, $old_value, $new_value, $use_cache = true)
|
|
{
|
|
$sql = 'UPDATE ' . $this->table . "
|
|
SET config_value = '" . $this->db->sql_escape($new_value) . "'
|
|
WHERE config_name = '" . $this->db->sql_escape($key) . "'";
|
|
|
|
if ($old_value !== false)
|
|
{
|
|
$sql .= " AND config_value = '" . $this->db->sql_escape($old_value) . "'";
|
|
}
|
|
|
|
$result = $this->db->sql_query($sql);
|
|
|
|
if (!$this->db->sql_affectedrows($result) && isset($this->config[$key]))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!isset($this->config[$key]))
|
|
{
|
|
$sql = 'INSERT INTO ' . $this->table . ' ' . $this->db->sql_build_array('INSERT', array(
|
|
'config_name' => $key,
|
|
'config_value' => $new_value,
|
|
'is_dynamic' => ($use_cache) ? 0 : 1));
|
|
$this->db->sql_query($sql);
|
|
}
|
|
|
|
if ($use_cache)
|
|
{
|
|
$this->cache->destroy('config');
|
|
}
|
|
|
|
$this->config[$key] = $new_value;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Increments an integer config value directly in the database.
|
|
*
|
|
* Using this method instead of setting the new value directly avoids race
|
|
* conditions and unlike set_atomic it cannot fail.
|
|
*
|
|
* @param string $key The configuration option's name
|
|
* @param int $increment Amount to increment by
|
|
* @param bool $use_cache Whether this variable should be cached or if it
|
|
* changes too frequently to be efficiently cached.
|
|
*/
|
|
function increment($key, $increment, $use_cache = true)
|
|
{
|
|
if (!isset($this->config[$key]))
|
|
{
|
|
$this->set($key, '0', $use_cache);
|
|
}
|
|
|
|
$sql_update = $this->db->cast_expr_to_string($this->db->cast_expr_to_bigint('config_value') . ' + ' . (int) $increment);
|
|
|
|
$this->db->sql_query('UPDATE ' . $this->table . '
|
|
SET config_value = ' . $sql_update . "
|
|
WHERE config_name = '" . $this->db->sql_escape($key) . "'");
|
|
|
|
if ($use_cache)
|
|
{
|
|
$this->cache->destroy('config');
|
|
}
|
|
|
|
$this->config[$key] += $increment;
|
|
}
|
|
}
|