ret = 'failed'; // Remeber path $this->path = $path; // Check if path exists if ((isDirectory($path)) && (!$tested)) { // Make FQFN for dummy file $fqfn = $path . 'dummy.tmp'; // Check if we can create a file inside the path touch($fqfn, 'w'); // Is the file there? if (FILE_READABLE($fqfn)) { // Yes, we can do. So let's remove it unlink($fqfn); // 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 = $this->statusDone; } else { // Stop! Set a .htaccess file first $this->ret = 'htaccess'; } } } elseif ($tested) { // System already tested $this->ret = $this->statusDone; } } // Checks validity of cache file and if content is given function loadCacheFile ($cacheName, $forceContent = false) { // Remember cache file $this->name = $cacheName; // Construct include filename for LOAD_INC_ONCE() call $this->inc = $this->path . $cacheName . $this->extension; // Construct FQFN (full qualified file name) $this->fqfn = constant('PATH') . $this->inc; // Check if file exists and if version matches $status = ($this->isCacheReadable() && (is_writeable($this->fqfn)) && ($this->extensionVersionMatches('cache'))); // Return status return $status; } // Initializes the cache file function init () { // This will destory an existing cache file! if ($this->ret == $this->statusDone) { // Create file if ($this->isCacheReadable()) chmod($this->fqfn, 0666); $this->pointer = fopen($this->fqfn, 'w') or app_die(__METHOD__, __LINE__, "Cannot write to cache ".$this->fqfn." !"); // Add open PHP tag fwrite($this->pointer, "storeExtensionVersion('cache'); } else { // Cannot create file addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } 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') { $GLOBALS['cache_array']['extensions'][$k][$data['ext_name']] = $v; } else { $GLOBALS['cache_array']['extensions'][$k][$data['ext_id']] = $v; } if (($k == 'ext_keep') && ($v == 'Y')) { $GLOBALS['cache_array']['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->pointer, $this->rewriteEntry($k, $v)); } } else { // Cannot create file addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } function finalize () { // Quit function when no pointer is set if (is_resource($this->pointer)) { // Write footer fwrite($this->pointer, "?>\n"); // Close file add destroy handler fclose($this->pointer); // Set rights if ($this->isCacheReadable()) chmod($this->fqfn, 0666); // Remove pointer $this->pointer = false; //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - FINALIZED!
\n"; } // END - if } function getArrayFromCache () { // Is the cache already loaded? if (isset($this->data[$this->name])) { // Return it's content! return $this->data[$this->name]; } // END - if // Is the cache file there? if ($this->isCacheReadable()) { // Prepare temporary array $data = array(); $cache_version = null; // Load cache file require($this->inc); // Is there an array? if (is_array($data)) { // Cache data $this->data[$this->name] = $data; // Cache version found? if ((is_array($cache_version)) && (count($cache_version) > 0)) { // Remember it as well... $this->version[$this->name] = $cache_version; } else { // Invalid cache so destroy it $this->destroyCacheFile(); // Clear cached data $this->data[$this->name] = array(); } // Return cache return $this->data[$this->name]; } else { // Cache problem detected! $this->destroyCacheFile(); } } else { // Cache file not found or not readable addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->fqfn.CACHE_CANNOT_LOAD_2); } } // Destroy an existing cache file function destroyCacheFile () { // Is the cache file there? if ((!isset($this->rebuilt[$this->name])) && ($this->isCacheReadable())) { // Close cache $this->finalize(); // Remove cache file from system //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - DESTROYED!
\n"; unlink($this->fqfn); // @TODO remove from $GLOBALS['cache_array']!!! // Is the file there? if (!$this->isCacheReadable()) { // The cache does no longer exist so kill the content unset($this->data[$this->name]); unset($this->version[$this->name]); $this->rebuilt[$this->name] = true; } else { // Not removed! addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->fqfn.CACHE_CANNOT_UNLINK_2); } } // END - if } // Unused method: function removeEntry ($search, $data, $array) { if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array $dummy = $this->getArrayFromCache(); // 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]); } // END - foreach // Flush array to cache file $this->init(); // Write array out $this->writeArray($dummy); // Close cache file $this->finalize(); } } else { // Cannot write to cache! addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } 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->rewriteEntry($k, $v2); } } else { // Single line found $LINE = $this->rewriteEntry($k, $v); } // Write line(s) fwrite($this->pointer, $LINE); } // END - foreach } else { // Cannot write array! addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } // Unused method function replaceEntry ($search, $replace, $search_key, $array) { if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array $dummy = $this->getArrayFromCache(); // 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; } // END - if } // END - foreach // Flush array to cache file $this->init(); // Write array out $this->writeArray($dummy); // Close cache file $this->finalize(); } // END - if } // END - if } else { // Cannot write to cache! addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } // Writes the version of given extension to the cache file function storeExtensionVersion ($ext_name) { // Valid cache pointer? if (is_resource($this->pointer)) { // Get extension version $ext_ver = GET_EXT_VERSION($ext_name); // Write cache line to file 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 addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } // Checks wether versions from cache and extension matches function extensionVersionMatches ($ext_name) { // Load cache (dummy) $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->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); } // 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)) { // 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"; } // Return line 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) { // Return the data anyway if there is no cache extension if (!isCacheInstanceValid()) return $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 () { // Skip this step if the cache instance is not there if (!isCacheInstanceValid()) return false; // Remove cache if ($GLOBALS['cache_instance']->loadCacheFile('admins')) $GLOBALS['cache_instance']->destroyCacheFile(); } // Destroy all cache files function FILTER_CACHE_DESTROY_ALL () { // Skip this step if the cache instance is not there if (!isCacheInstanceValid()) return false; // 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(); } // ?>