ret = "failed"; // Remeber path $this->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 loadCacheFile ($file, $forceContent = false) { // Remember cache file $this->name = $file; // Construct FQFN (full qualified file name) $this->inc = $this->path.$file.".cache"; // Check if file exists and if version matches $status = (FILE_READABLE($this->inc) && (is_writeable($this->inc)) && ($this->extensionVersionMatches("cache"))); // Return status return $status; } function init () { // This will destory an existing cache file! if ($this->ret == "done") { // Create file if (FILE_READABLE($this->inc)) chmod($this->inc, 0666); $this->pointer = fopen($this->inc, 'w') or mxchange_die("Cannot write to cache ".$this->inc." !"); // Add open PHP tag fwrite($this->pointer, "storeExtensionVersion("cache"); } else { // Cannot create file addFatalMessage(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } function addRow ($data) { global $cacheArray; 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; } 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->pointer, $this->rewriteEntry($k, $v)); } } else { // Cannot create file addFatalMessage(__FILE__."(".__LINE__."): ".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 (FILE_READABLE($this->inc)) chmod($this->inc, 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 (FILE_READABLE($this->inc)) { // Prepare temporary array $data = array(); $cache_version = null; // Load cache file LOAD_INC_ONCE($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(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->inc.CACHE_CANNOT_LOAD_2); } } // Destroy an existing cache file function destroyCacheFile () { // Is the cache file there? if ((!isset($this->rebuilt[$this->name])) && (FILE_READABLE($this->inc))) { // Close cache $this->finalize(); // Remove cache file from system //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - DESTROYED!
\n"; unlink($this->inc); // Is the file there? if (!FILE_READABLE($this->inc)) { // 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(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->inc.CACHE_CANNOT_UNLINK_2); } } // END - if } // Unused method: function removeEntry ($search, $data, $array) { if ((FILE_READABLE($this->inc)) && (is_writeable($this->inc))) { // 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(__FILE__."(".__LINE__."): ".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(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } // Unused method function replaceEntry ($search, $replace, $search_key, $array) { if ((FILE_READABLE($this->inc)) && (is_writeable($this->inc))) { // 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(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } 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(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } 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 entry for extension {$ext_name}!"); } // Compare both return ((isset($this->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); } 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) { $line = "\$data['".$key."'][] = true;\n"; } else { $line = "\$data['".$key."'][] = false;\n"; } } else { // Non-string $line = "\$data['".$key."'][] = ".$value.";\n"; } // Return line return $line; } function getStatus () { return $this->ret; } } // Destroy the cache on extension changes function FILTER_CACHE_DESTROY_ON_EXT_CHANGE ($data) { global $cacheInstance; // Remove cache if (EXT_IS_ACTIVE("cache")) { if ($cacheInstance->loadCacheFile("config")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("extensions")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("mod_reg")) $cacheInstance->destroyCacheFile(); } // END - if // Return it return $data; } // Destroy the cache on changing admin function FILTER_CACHE_DESTROY_ON_ADMIN_CHANGE () { global $cacheInstance; // Remove cache if (EXT_IS_ACTIVE("cache")) { if ($cacheInstance->loadCacheFile("admins")) $cacheInstance->destroyCacheFile(); } // END - if } // Destroy all cache files function FILTER_CACHE_DESTROY_ALL () { global $cacheInstance; // Remove cache if (EXT_IS_ACTIVE("cache")) { if ($cacheInstance->loadCacheFile("admins")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("admins_acls")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("config")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("extensions")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("mod_reg")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("refdepths")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("refsystem")) $cacheInstance->destroyCacheFile(); if ($cacheInstance->loadCacheFile("themes")) $cacheInstance->destroyCacheFile(); } // END - if } // Filter for purging entire admin menu cache function FILTER_CACHE_PURGE_ADMIN_MENU () { // Just call the function CACHE_PURGE_ADMIN_MENU(); } // ?>