X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Flibs%2Fcache_functions.php;h=30209debe85c203c0031b540a3acc6a1ccb9410e;hb=452578b5bf17d14099ee44956deb4e4dc0832874;hp=f1356910d97398e23b953594039edd0e149640ff;hpb=0b0f1ec06f8dda4617f231a208ee30204e041e07;p=mailer.git diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index f1356910d9..30209debe8 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -10,7 +10,12 @@ * -------------------------------------------------------------------- * * Kurzbeschreibung : Funktionen fuer die admins-Erweiterung * * -------------------------------------------------------------------- * - * * + * $Revision:: 856 $ * + * $Date:: 2009-03-06 20:24:32 +0100 (Fr, 06. Mär 2009) $ * + * $Tag:: 0.2.1-FINAL $ * + * $Author:: stelzi $ * + * Needs to be in all Files and every File needs "svn propset * + * svn:keywords Date Revision" (autoprobset!) at least!!!!!! * * -------------------------------------------------------------------- * * Copyright (c) 2003 - 2008 by Roland Haeder * * For more information visit: http://www.mxchange.org * @@ -38,29 +43,25 @@ if (!defined('__SECURITY')) { } // Caching class -class mxchange_cache -{ +class CacheSystem { // Define variables - var $update_interval = 0; var $ret = "init"; - var $cache_path = ""; - var $cache_inc = ""; - var $cache_ctime = 0; - var $cache_pointer = false; - var $cache_data = ""; - var $cache_version = ""; - var $cache_file = ""; + var $path = ""; + var $inc = ""; + var $fqfn = ""; + var $pointer = false; + var $data = array(); + var $version = array(); + var $name = ""; + var $rebuilt = array(); // Constructor - function mxchange_cache($interval, $path, $tested) { + function CacheSystem ($interval, $path, $tested) { // Failed is the default $this->ret = "failed"; - // Remember interval in class - $this->update_interval = $interval; - // Remeber path - $this->cache_path = $path; + $this->path = $path; // Check if path exists if ((is_dir($path)) && (!$tested)) { @@ -89,75 +90,56 @@ class mxchange_cache } // Checks validity of cache file and if content is given - function cache_file ($file, $forceContent = false) { + function loadCacheFile ($cacheName, $forceContent = false) { // Remember cache file - $this->cache_file = $file; - - // Construct FQFN (full qualified file name) - $inc = $this->cache_path.$file.".cache"; - - // Rember it + filename in class - $this->cache_inc = $inc; + $this->name = $cacheName; - // Check if file exists - $status = (FILE_READABLE($inc) && (is_writeable($inc))); - if ($status) { - // Yes, it does. So let's get it's last changed date/time - $ctime = filectime($inc); - } else { - // No, it doesn't. Zero date/time - $ctime = 0; - } + // Construct include filename for LOAD_INC_ONCE() call + $this->inc = $this->path . $cacheName . ".cache"; - // Remember change date/time in class - $this->cache_ctime = $ctime; + // Construct FQFN (full qualified file name) + $this->fqfn = constant('PATH') . $this->inc; - // Is the cache file outdated? - if (($status) && ((time() - $ctime) >= $this->update_interval)) { - // Ok, we need an update! - $status = false; - } elseif ($status) { - // Check on 'cache' extension - $status = $this->ext_version_matches("cache"); - } + // Check if file exists and if version matches + $status = ($this->isCacheReadable() && (is_writeable($this->fqfn)) && ($this->extensionVersionMatches("cache"))); // Return status return $status; } - function cache_init($array) { + // Initializes the cache file + function init () { // This will destory an existing cache file! if ($this->ret == "done") { // Create file - if (FILE_READABLE($this->cache_inc)) chmod($this->cache_inc, 0666); - $this->cache_pointer = fopen($this->cache_inc, 'w') or mxchange_die("Cannot write to cache ".$this->cache_inc." !"); + if ($this->isCacheReadable()) chmod($this->fqfn, 0666); + $this->pointer = fopen($this->fqfn, 'w') or mxchange_die("Cannot write to cache ".$this->fqfn." !"); - // Begin of cache file - fwrite($this->cache_pointer, "pointer, "store_extension_version("cache"); + $this->storeExtensionVersion("cache"); } else { // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function add_row ($data) { - global $cacheArray; - - if (is_resource($this->cache_pointer)) { + function addRow ($data) { + // Is the pointe rvalid? + if (is_resource($this->pointer)) { // Write every array element to cache file foreach ($data as $k => $v) { // Write global cache array for immediate access if ((substr($k, 0, 4) == "ext_") && (isset($data['ext_name'])) && (isset($data['ext_id']))) { if ($k != "ext_name") { - $cacheArray['extensions'][$k][$data['ext_name']] = $v; + $GLOBALS['cache_array']['extensions'][$k][$data['ext_name']] = $v; } else { - $cacheArray['extensions'][$k][$data['ext_id']] = $v; + $GLOBALS['cache_array']['extensions'][$k][$data['ext_id']] = $v; } if (($k == "ext_keep") && ($v == "Y")) { - $cacheArray['active_extensions'][$data['ext_name']] = $v; + $GLOBALS['cache_array']['active_extensions'][$data['ext_name']] = $v; } // END - if } elseif (is_array($v)) { // Serialize and BASE64-encode the array @@ -165,109 +147,107 @@ class mxchange_cache } // Write cache line to file - fwrite($this->cache_pointer, $this->add_raw_row($k, $v)); + fwrite($this->pointer, $this->rewriteEntry($k, $v)); } } else { // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function cache_close() { + function finalize () { // Quit function when no pointer is set - if (empty($this->cache_pointer)) return; - if (is_resource($this->cache_pointer)) { + if (is_resource($this->pointer)) { // Write footer - fwrite($this->cache_pointer, "?>\n"); + fwrite($this->pointer, "?>\n"); // Close file add destroy handler - fclose($this->cache_pointer); + fclose($this->pointer); // Set rights - if (FILE_READABLE($this->cache_inc)) chmod($this->cache_inc, 0666); + if ($this->isCacheReadable()) chmod($this->fqfn, 0666); // Remove pointer - unset($this->cache_pointer); - } else { - // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } + $this->pointer = false; + //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - FINALIZED!
\n"; + } // END - if } - function cache_load() { + function getArrayFromCache () { // Is the cache already loaded? - if (isset($this->cache_data[$this->cache_file])) { + if (isset($this->data[$this->name])) { // Return it's content! - return $this->cache_data[$this->cache_file]; + return $this->data[$this->name]; } // END - if // Is the cache file there? - if (FILE_READABLE($this->cache_inc)) { + if ($this->isCacheReadable()) { // Prepare temporary array $data = array(); $cache_version = null; // Load cache file - require_once($this->cache_inc); + require($this->inc); // Is there an array? if (is_array($data)) { // Cache data - $this->cache_data[$this->cache_file] = $data; + $this->data[$this->name] = $data; // Cache version found? if ((is_array($cache_version)) && (count($cache_version) > 0)) { // Remember it as well... - $this->cache_version[$this->cache_file] = $cache_version; + $this->version[$this->name] = $cache_version; } else { // Invalid cache so destroy it - $this->cache_destroy(); + $this->destroyCacheFile(); // Clear cached data - $this->cache_data[$this->cache_file] = array(); + $this->data[$this->name] = array(); } // Return cache - return $this->cache_data[$this->cache_file]; + return $this->data[$this->name]; } else { // Cache problem detected! - $this->cache_destroy(); + $this->destroyCacheFile(); } } else { // Cache file not found or not readable - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->cache_inc.CACHE_CANNOT_LOAD_2); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->fqfn.CACHE_CANNOT_LOAD_2); } } // Destroy an existing cache file - function cache_destroy() { + function destroyCacheFile () { // Is the cache file there? - if (FILE_READABLE($this->cache_inc)) { + if ((!isset($this->rebuilt[$this->name])) && ($this->isCacheReadable())) { // Close cache - $this->cache_close(); + $this->finalize(); // Remove cache file from system - unlink($this->cache_inc); + //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - DESTROYED!
\n"; + unlink($this->fqfn); + // @TODO remove from $GLOBALS['cache_array']!!! // Is the file there? - if (!FILE_READABLE($this->cache_inc)) { + if (!$this->isCacheReadable()) { // The cache does no longer exist so kill the content - unset($this->cache_data[$this->cache_file]); + unset($this->data[$this->name]); + unset($this->version[$this->name]); + $this->rebuilt[$this->name] = true; } else { // Not removed! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->fqfn.CACHE_CANNOT_UNLINK_2); } - } else { - // Does not exist! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } + } // END - if } - function cache_remove($search, $data, $array) { - global $ARRAY; - if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { + // Unused method: + function removeEntry ($search, $data, $array) { + if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array - $dummy = $this->cache_load(); + $dummy = $this->getArrayFromCache(); // Search for key in array $key = array_search($data, $dummy[$search]); @@ -276,52 +256,52 @@ class mxchange_cache foreach ($array as $a) { // So we can remove all elements as requested unset($dummy[$a][$key]); - } + } // END - foreach // Flush array to cache file - $this->cache_init($ARRAY); + $this->init(); // Write array out - $this->cache_write_array($dummy); + $this->writeArray($dummy); // Close cache file - $this->cache_close(); + $this->finalize(); } } else { // Cannot write to cache! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function cache_write_array ($array) { - if (is_resource($this->cache_pointer)) { + function writeArray ($array) { + if (is_resource($this->pointer)) { foreach ($array as $k => $v) { if (is_array($v)) { // Multi line(s) found $LINE = ""; foreach($v as $k2 => $v2) { // Put every array element in a row... - $LINE .= $this->add_raw_row($k, $v2); + $LINE .= $this->rewriteEntry($k, $v2); } } else { // Single line found - $LINE = $this->add_raw_row($k, $v); + $LINE = $this->rewriteEntry($k, $v); } // Write line(s) - fwrite($this->cache_pointer, $LINE); + fwrite($this->pointer, $LINE); } // END - foreach } else { // Cannot write array! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function cache_replace($search, $replace, $search_key, $array) { - global $ARRAY; - if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { + // Unused method + function replaceEntry ($search, $replace, $search_key, $array) { + if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array - $dummy = $this->cache_load(); + $dummy = $this->getArrayFromCache(); // Check if $dummy is valid (prevents some errors) if ((is_array($dummy)) && (isset($dummy[$search])) && (is_array($dummy[$search]))) { @@ -335,58 +315,86 @@ class mxchange_cache if ($a == $search) { // Update now... $dummy[$a][$search_key] = $replace; - } - } + } // END - if + } // END - foreach // Flush array to cache file - $this->cache_init($ARRAY); + $this->init(); // Write array out - $this->cache_write_array($dummy); + $this->writeArray($dummy); // Close cache file - $this->cache_close(); - } - } + $this->finalize(); + } // END - if + } // END - if } else { // Cannot write to cache! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function store_extension_version ($ext_name) { + // Writes the version of given extension to the cache file + function storeExtensionVersion ($ext_name) { // Valid cache pointer? - if (is_resource($this->cache_pointer)) { + if (is_resource($this->pointer)) { // Get extension version $ext_ver = GET_EXT_VERSION($ext_name); // Write cache line to file - fwrite($this->cache_pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); + fwrite($this->pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); + + // Add the extension version to object (DO NOT REMOVE IT! Endless loop...) + $this->version[$this->name][$ext_name] = $ext_ver; + //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - {$ext_name}={$ext_ver}
\n"; } else { // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } - function ext_version_matches ($ext_name) { + // Checks wether versions from cache and extension matches + function extensionVersionMatches ($ext_name) { // Load cache (dummy) - $this->cache_load(); + $this->getArrayFromCache(); // Get extension version $ext_ver = GET_EXT_VERSION($ext_name); + // Debug messages + if (isset($this->version[$this->name][$ext_name])) { + //* DEBUG: */ print __METHOD__."(".__LINE__."): cache={$this->name},ext_name={$ext_name} - {$ext_ver}/{$this->version[$this->name][$ext_name]}
\n"; + } else { + // No cache version found! + DEBUG_LOG(__METHOD__, __LINE__, "Cache {$this->name} has missing version entry for extension {$ext_name}!"); + } + // Compare both - return ((isset($this->cache_version[$this->cache_file][$ext_name])) && ($this->cache_version[$this->cache_file][$ext_name] == $ext_ver)); + return ((isset($this->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); } - function add_raw_row ($key, $value) { + // Rewrit the entry so it can be stored in cache file + // @TODO Add support for more types which break in last else-block + function rewriteEntry ($key, $value) { // Init line $line = ""; // String or non-string? ;-) - if ((is_string($value)) || (is_null($value))) { + if (is_string($value)) { // String... $line = "\$data['".$key."'][] = \"".$value."\";\n"; + } elseif (is_null($value)) { + // Null + $line = "\$data['".$key."'][] = null;\n"; + } elseif (is_bool($value)) { + // Boolean value + if ($value === true) { + // True + $line = "\$data['".$key."'][] = true;\n"; + } else { + // False + $line = "\$data['".$key."'][] = false;\n"; + } } else { // Non-string $line = "\$data['".$key."'][] = ".$value.";\n"; @@ -396,9 +404,54 @@ class mxchange_cache return $line; } + // Getter for cache status function getStatus () { return $this->ret; } + + // Checks wether the current cache file is readable + function isCacheReadable () { + return INCLUDE_READABLE($this->inc); + } + +} // END - class + +// Destroy the cache on extension changes +function FILTER_CACHE_DESTROY_ON_EXT_CHANGE ($data) { + // Remove cache + if ($GLOBALS['cache_instance']->loadCacheFile("config")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("extensions")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("modreg")) $GLOBALS['cache_instance']->destroyCacheFile(); + + // Return it + return $data; } + +// Destroy the cache on changing admin +function FILTER_CACHE_DESTROY_ON_ADMIN_CHANGE () { + // Remove cache + if ($GLOBALS['cache_instance']->loadCacheFile("admins")) $GLOBALS['cache_instance']->destroyCacheFile(); +} + +// Destroy all cache files +function FILTER_CACHE_DESTROY_ALL () { + // Remove cache files + if ($GLOBALS['cache_instance']->loadCacheFile("admins")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("admins_acls")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("config")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("extensions")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("modreg")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("refdepths")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("refsystem")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("themes")) $GLOBALS['cache_instance']->destroyCacheFile(); + if ($GLOBALS['cache_instance']->loadCacheFile("revision")) $GLOBALS['cache_instance']->destroyCacheFile(); +} + +// Filter for purging entire admin menu cache +function FILTER_CACHE_PURGE_ADMIN_MENU () { + // Just call the function + CACHE_PURGE_ADMIN_MENU(); +} + // ?>