X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Flibs%2Fcache_functions.php;h=7959501e951768abe20f08f9721ef2034b411233;hp=d5b3639477adb24ff08b65b35794b764c33a3bc3;hb=a1ec36b53a12be97992e4b8ce49b5a635af44e46;hpb=249af9b67343a73df780d95982ccc32d81e564ab diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index d5b3639477..7959501e95 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -10,9 +10,14 @@ * -------------------------------------------------------------------- * * Kurzbeschreibung : Funktionen fuer die admins-Erweiterung * * -------------------------------------------------------------------- * - * * + * $Revision:: $ * + * $Date:: $ * + * $Tag:: 0.2.1-FINAL $ * + * $Author:: $ * + * 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 * + * Copyright (c) 2003 - 2009 by Roland Haeder * * For more information visit: http://www.mxchange.org * * * * This program is free software; you can redistribute it and/or modify * @@ -33,367 +38,57 @@ // Some security stuff... if (!defined('__SECURITY')) { - $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4) . "/security.php"; - require($INC); -} - -// Caching class -class mxchange_cache -{ - // 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 = ""; - - // Constructor - function mxchange_cache($interval, $path, $tested) { - // Failed is the default - $this->ret = "failed"; - - // Remember interval in class - $this->update_interval = $interval; - - // Remeber path - $this->cache_path = $path; - - // Check if path exists - if ((is_dir($path)) && (!$tested)) { - // Check if we can create a file inside the path - touch($path."dummy.tmp", 'w'); - if (FILE_READABLE($path."dummy.tmp")) { - // Yes, we can do. So let's remove it - unlink($path."dummy.tmp"); - - // Is there a .htaccess file? - if (FILE_READABLE($path.".htaccess")) { - // Update database that we have tested it - UPDATE_CONFIG("cache_tested", 1); - - // All done! - $this->ret = "done"; - } else { - // Stop! Set a .htaccess file first - $this->ret = "htaccess"; - } - } - } elseif ($tested) { - // System already tested - $this->ret = "done"; - } - } - - // Checks validity of cache file and if content is given - function cache_file ($file, $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; - - // 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; - } - - // Remember change date/time in class - $this->cache_ctime = $ctime; - - // 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"); - } - - // Return status - return $status; - } - - function cache_init($array) { - // 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." !"); - - // Begin of cache file - fwrite($this->cache_pointer, "store_extension_version("cache"); - } else { - // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function add_row ($data) { - global $cacheArray; - - if (is_resource($this->cache_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; - } else { - $cacheArray['extensions'][$k][$data['ext_id']] = $v; - } - if (($k == "ext_keep") && ($v == "Y")) { - $cacheArray['active_extensions'][$data['ext_name']] = $v; - } // END - if - } elseif (is_array($v)) { - // Serialize and BASE64-encode the array - $v = base64_encode(serialize($v)); - } - - // Write cache line to file - fwrite($this->cache_pointer, $this->add_raw_row($k, $v)); - } - } else { - // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function cache_close() { - // Quit function when no pointer is set - if (empty($this->cache_pointer)) return; - if (is_resource($this->cache_pointer)) { - // Write footer - fwrite($this->cache_pointer, "?>\n"); - - // Close file add destroy handler - fclose($this->cache_pointer); - - // Set rights - if (FILE_READABLE($this->cache_inc)) chmod($this->cache_inc, 0666); + die(); +} // END - if - // Remove pointer - unset($this->cache_pointer); - } else { - // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } +// Destroy the cache on extension changes +function FILTER_CACHE_DESTROY_ON_EXT_CHANGE ($data) { + // Return the data anyway if there is no cache extension + if (!isCacheInstanceValid()) return $data; - function cache_load() { - // Is the cache already loaded? - if (isset($this->cache_data[$this->cache_file])) { - // Return it's content! - return $this->cache_data[$this->cache_file]; - } // END - if + // Remove cache + foreach (array('config','extension','modules') as $cache) { + if ($GLOBALS['cache_instance']->loadCacheFile($cache)) $GLOBALS['cache_instance']->removeCacheFile(); + } // END - foreach - // Is the cache file there? - if (FILE_READABLE($this->cache_inc)) { - // Prepare temporary array - $data = array(); - $cache_version = null; - - // Load cache file - require_once($this->cache_inc); - - // Is there an array? - if (is_array($data)) { - // Cache data - $this->cache_data[$this->cache_file] = $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; - } else { - // Invalid cache so destroy it - $this->cache_destroy(); - - // Clear cached data - $this->cache_data[$this->cache_file] = array(); - } - - // Return cache - return $this->cache_data[$this->cache_file]; - } else { - // Cache problem detected! - $this->cache_destroy(); - } - } else { - // Cache file not found or not readable - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->cache_inc.CACHE_CANNOT_LOAD_2); - } - } - - // Destroy an existing cache file - function cache_destroy() { - // Is the cache file there? - if (FILE_READABLE($this->cache_inc)) { - // Remove cache file from system - unlink($this->cache_inc); - if (!FILE_READABLE($this->cache_inc)) { - // Close cache automatically (we don't need it anymore!) - $this->cache_close(); - } else { - // Not removed! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); - } - } else { - // Does not exist! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); - } - } - - function cache_remove($search, $data, $array) { - global $ARRAY; - if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { - // Load cache into dummy array - $dummy = $this->cache_load(); - - // Search for key in array - $key = array_search($data, $dummy[$search]); - if (!empty($key)) { - // Key (hopefully) found? - foreach ($array as $a) { - // So we can remove all elements as requested - unset($dummy[$a][$key]); - } - - // Flush array to cache file - $this->cache_init($ARRAY); - - // Write array out - $this->cache_write_array($dummy); - - // Close cache file - $this->cache_close(); - } - } else { - // Cannot write to cache! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function cache_write_array ($array) { - if (is_resource($this->cache_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); - } - } else { - // Single line found - $LINE = $this->add_raw_row($k, $v); - } - - // Write line(s) - fwrite($this->cache_pointer, $LINE); - } // END - foreach - } else { - // Cannot write array! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function cache_replace($search, $replace, $search_key, $array) { - global $ARRAY; - if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { - // Load cache into dummy array - $dummy = $this->cache_load(); - - // Check if $dummy is valid (prevents some errors) - if ((is_array($dummy)) && (isset($dummy[$search])) && (is_array($dummy[$search]))) { - // Search for key in array - $key_found = array_key_exists($search_key, $dummy[$search]); - if ($key_found == true) { - $key = $search_key; - // Key (hopefully) found? - foreach ($dummy as $a => $v) { - // So we can update all entries - if ($a == $search) { - // Update now... - $dummy[$a][$search_key] = $replace; - } - } - - // Flush array to cache file - $this->cache_init($ARRAY); - - // Write array out - $this->cache_write_array($dummy); - - // Close cache file - $this->cache_close(); - } - } - } else { - // Cannot write to cache! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function store_extension_version ($ext_name) { - // Valid cache pointer? - if (is_resource($this->cache_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"); - } else { - // Cannot create file - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); - } - } - - function ext_version_matches ($ext_name) { - // Load cache (dummy) - $this->cache_load(); + // Return it + return $data; +} - // Get extension version - $ext_ver = GET_EXT_VERSION($ext_name); +// Destroy the cache on changing admin +function FILTER_CACHE_DESTROY_ON_ADMIN_CHANGE ($data) { + // Skip this step if the cache instance is not there + if (!isCacheInstanceValid()) return false; - // Compare both - return ((isset($this->cache_version[$this->cache_file][$ext_name])) && ($this->cache_version[$this->cache_file][$ext_name] == $ext_ver)); - } + // Remove cache + if ($GLOBALS['cache_instance']->loadCacheFile('admins')) $GLOBALS['cache_instance']->removeCacheFile(); - function add_raw_row ($key, $value) { - // Init line - $line = ""; + // Return the data + return $data; +} - // String or non-string? ;-) - if ((is_string($value)) || (is_null($value))) { - // String... - $line = "\$data['".$key."'][] = \"".$value."\";\n"; - } else { - // Non-string - $line = "\$data['".$key."'][] = ".$value.";\n"; - } +// Destroy all cache files +function FILTER_CACHE_DESTROY_ALL () { + // Skip this step if the cache instance is not there + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Called!'); + if (!isCacheInstanceValid()) return false; + + // Remove cache files + foreach (array('admin','admin_acls','config','extension','modules','refdepths','refsystem','themes','revision','filter','imprint') as $cache) { + /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Trying to remove cache %s.", $cache)); + if ($GLOBALS['cache_instance']->loadCacheFile($cache)) $GLOBALS['cache_instance']->removeCacheFile(); + } // END - foreach + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Done!'); +} - // Return line - return $line; - } +// Filter for purging 'filter' cache +function FILTER_CACHE_DESTROY_FILTER () { + // Skip this step if the cache instance is not there + if ((!isCacheInstanceValid()) || (getConfig('update_filter_usage') != 'Y')) return false; - function getStatus () { - return $this->ret; - } + // Remove cache files + if ($GLOBALS['cache_instance']->loadCacheFile('filter')) $GLOBALS['cache_instance']->removeCacheFile(); } -// + +// [EOF] ?>