From 4ded6cf5eef0892f9ef1d7351664e1d78445c419 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Sun, 28 Dec 2008 13:28:50 +0000 Subject: [PATCH] forgot the bootstrap file for phpbb::$acm git-svn-id: file:///svn/phpbb/trunk@9241 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/acm/bootstrap.php | 491 +++++++++++++++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 phpBB/includes/acm/bootstrap.php diff --git a/phpBB/includes/acm/bootstrap.php b/phpBB/includes/acm/bootstrap.php new file mode 100644 index 0000000000..849f3e3863 --- /dev/null +++ b/phpBB/includes/acm/bootstrap.php @@ -0,0 +1,491 @@ + NULL, 'sql' => NULL); + + /** + * Constructor + * @access public + */ + public function __construct() { } + + /** + * Magic method for calling type-specific functions. + * Functions directly supported are: get(), put(), exists(), destroy() + * see {@link phpbb_acm_abstract phpbb_acm_abstract} for more information + * + * @access public + */ + public function __call($method, $arguments) + { + $supported_internal_functions = array('get', 'put', 'exists', 'destroy'); + $internal_method = explode('_', $method, 2); + + // Get cache type and method + if (in_array($internal_method[0], $supported_internal_functions)) + { + $cache_type = (empty($internal_method[1])) ? 'data' : $internal_method[1]; + $method = $internal_method[0]; + } + else + { + $cache_type = $arguments[0]; + array_shift($arguments); + } + + // Check if the cache type is initialized and exist + if (!$this->type_exists($cache_type)) + { + return false; + } + + // $this->cache_types[$cache_type]->$method($arguments); + return call_user_func_array(array($this->cache_types[$cache_type], $method), $arguments); + } + + /** + * Tidy cache. This removes all expired cache data. + * @access public + */ + public function tidy() + { + foreach ($this->cache_types as $cache_type => $object) + { + if ($object === NULL) + { + continue; + } + + $this->cache_types[$cache_type]->tidy(); + } + } + + /** + * Purge cache. This removes all cache data, not only the expired one. + * @access public + */ + public function purge() + { + foreach ($this->cache_types as $cache_type => $object) + { + if ($object === NULL) + { + continue; + } + + $this->cache_types[$cache_type]->purge(); + } + } + + /** + * Load cache data. This is usually only used internally. + * @access public + */ + public function load() + { + foreach ($this->cache_types as $cache_type => $object) + { + if ($object === NULL) + { + continue; + } + + $this->cache_types[$cache_type]->load(); + } + } + + /** + * Unload everything from cache and make sure non-stored cache items are properly saved. + * @access public + */ + public function unload() + { + foreach ($this->cache_types as $cache_type => $object) + { + if ($object === NULL) + { + continue; + } + + $this->cache_types[$cache_type]->unload(); + } + } + + /** + * Register a custom cache type/class. + * + * @param string $cache_type The cache type to register/set + * @param string $cache_append String to append to the cached data as identifier (if the coder has different types to distinct from) + * @param string $cache_object The exact name of the cache class to load. + * The filename must be: includes/acm/acm_{$cache_object}.php + * The class definition must be: class phpbb_acm_{$cache_object} extends phpbb_acm_abstract + * Additionally it is possible to define classes for every cache type... + * for example: phpbb_acm_{$cache_object}_{$cache_type} extends phpbb_acm_{$cache_object} + * + * @return bool Returns true on success, else false. + * @access public + */ + public function register($cache_type, $cache_append = false, $cache_object = CONFIG_ACM_TYPE) + { + // We need to init every cache type... + if (!isset($this->cache_types[$cache_type])) + { + $this->cache_types[$cache_type] = NULL; + } + + // Unregister if already registered + if ($this->cache_types[$cache_type] !== NULL) + { + $this->cache_types[$cache_type] = NULL; + } + + if ($this->cache_types[$cache_type] === NULL) + { + $class_name = 'phpbb_acm_' . $cache_object; + + if (!class_exists($class_name)) + { + if (!file_exists(PHPBB_ROOT_PATH . 'includes/acm/acm_' . $cache_object . '.' . PHP_EXT)) + { + return false; + } + + require_once PHPBB_ROOT_PATH . 'includes/acm/acm_' . $cache_object . '.' . PHP_EXT; + } + + $class_name = (class_exists('phpbb_acm_' . $cache_object . '_' . $cache_type)) ? 'phpbb_acm_' . $cache_object . '_' . $cache_type : 'phpbb_acm_' . $cache_object; + + // Set cache prefix, for example ctpl_prosilver + $cache_prefix = ($cache_append === false) ? $cache_type : $cache_type . '_' . $cache_append; + + $this->cache_types[$cache_type] = new $class_name($cache_prefix); + + if (!$this->supported($cache_type)) + { + $this->cache_types[$cache_type] = NULL; + return false; + } + } + + return true; + } + + /** + * Check if a specified cache type is supported with the ACM class + * + * @param string $cache_type The cache type to check. + * + * @return bool True if the type is supported, else false. + * @access public + */ + public function supported($cache_type) + { + if (!$this->type_exists($cache_type)) + { + return false; + } + + return !empty($this->cache_types[$cache_type]->supported[$cache_type]) || $this->cache_types[$cache_type]->supported === true; + } + + /** + * Check if the cache type exists. Sometimes some types do not exist if the relevant files are not there or do not support the given cache type. + * + * @param string $cache_type The cache type to check. + * + * @return bool True if the type exist, else false. + * @access private + */ + private function type_exists($cache_type) + { + if (!isset($this->cache_types[$cache_type]) || $this->cache_types[$cache_type] === NULL) + { + $this->register($cache_type); + } + + return $this->cache_types[$cache_type] !== NULL; + } +} + + +/** +* The abstract class all ACM plugins must extend. +* @package acm +*/ +abstract class phpbb_acm_abstract +{ + /** + * @var string The current cache prefix + */ + public $cache_prefix = ''; + + /** + * @var array Cached global data + */ + protected $vars = array(); + + /** + * @var array Expire information for cached global data + */ + protected $var_expires = array(); + + /** + * @var bool Is true if global data is modified + */ + protected $is_modified = false; + + /** + * Get cached data + * + * @param string $var_name Variable name. Global variable name is prefixed with #. + * + * @return mixed Returns false if there is no data available, else returns the data + * @access public + */ + abstract public function get($var_name); + + /** + * Put data into cache + * + * @param string $var_name Variable name. Global variable name is prefixed with #. + * @param mixed $data Data to be put into cache. + * @param int $ttl Cache lifetime in seconds. + * + * @return mixed Returns $data + * @access public + */ + abstract public function put($var_name, $data, $ttl = 31536000); + + /** + * Destroy cached data. + * + * @param string $var_name Variable name. Global variable name is prefixed with #. + * + * @return mixed Returns false if the cached data does not exist + * @access public + */ + abstract public function destroy($var_name); + + /** + * Check if cached data exists. + * + * @param string $var_name Variable name. Global variable name is prefixed with #. + * + * @return bool True if it exists + * @access public + */ + abstract public function exists($var_name); + + /** + * Load cache data. This is usually only used internally. + * @access public + */ + abstract public function load(); + + /** + * Unload everything from cache and make sure non-stored cache items are properly saved. + * @access public + */ + abstract public function unload(); + + /** + * Tidy cache. This removes all expired cache data. + * @access public + */ + public function tidy() + { + $this->tidy_local(); + $this->tidy_global(); + + set_config('cache_last_gc', time(), true); + } + + /** + * Purge cache. This removes all cache data, not only the expired one. + * @access public + */ + public function purge() + { + $this->purge_local(); + $this->purge_global(); + } + + /** + * Tidy only local cache data + * @access protected + */ + abstract protected function tidy_local(); + + /** + * Purge only local cache data + * @access protected + */ + abstract protected function purge_local(); + + /** + * Get global cache data. See {@link get() get()}. + * @access protected + */ + protected function get_global($var_name) + { + // Check if we have all variables + if (!sizeof($this->vars)) + { + $this->load(); + } + + if (!isset($this->var_expires[$var_name])) + { + return false; + } + + // If expired... we remove this entry now... + if (time() > $this->var_expires[$var_name]) + { + $this->destroy('#' . $var_name); + return false; + } + + if (isset($this->vars[$var_name])) + { + return $this->vars[$var_name]; + } + + return false; + } + + /** + * Put data into global cache. See {@link put() put()}. + * @access protected + */ + protected function put_global($var_name, $data, $ttl = 31536000) + { + $this->vars[$var_name] = $data; + $this->var_expires[$var_name] = time() + $ttl; + $this->is_modified = true; + + return $data; + } + + /** + * Check if global data exists. See {@link exists() exists()}. + * @access protected + */ + protected function exists_global($var_name) + { + return !empty($this->vars[$var_name]) && time() <= $this->var_expires[$var_name]; + } + + /** + * Destroy global cache data. See {@link destroy() destroy()}. + * @access protected + */ + protected function destroy_global($var_name) + { + $this->is_modified = true; + + unset($this->vars[$var_name]); + unset($this->var_expires[$var_name]); + + // We save here to let the following cache hits succeed + $this->unload(); + } + + /** + * Tidy global cache data. See {@link tidy() tidy()}. + * @access protected + */ + protected function tidy_global() + { + // Now tidy global settings + if (!sizeof($this->vars)) + { + $this->load(); + } + + foreach ($this->var_expires as $var_name => $expires) + { + if (time() > $expires) + { + // We only unset, then save later + unset($this->vars[$var_name]); + unset($this->var_expires[$var_name]); + } + } + + $this->is_modified = true; + $this->unload(); + } + + /** + * Purge global cache data. See {@link purge() purge()}. + * @access protected + */ + protected function purge_global() + { + // Now purge global settings + unset($this->vars); + unset($this->var_expires); + + $this->vars = array(); + $this->var_expires = array(); + + $this->is_modified = true; + $this->unload(); + } +} + + + +?> \ No newline at end of file