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 ADD_FATAL(__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 ADD_FATAL(__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; } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } 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 require_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 ADD_FATAL(__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 (FILE_READABLE($this->inc)) { // Close cache $this->finalize(); // Remove cache file from system 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]); } else { // Not removed! ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->inc.CACHE_CANNOT_UNLINK_2); } } else { // Does not exist! ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } // 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]); } // Flush array to cache file $this->init(); // Write array out $this->writeArray($dummy); // Close cache file $this->finalize(); } } else { // Cannot write to cache! ADD_FATAL(__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! ADD_FATAL(__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; } } // Flush array to cache file $this->init(); // Write array out $this->writeArray($dummy); // Close cache file $this->finalize(); } } } else { // Cannot write to cache! ADD_FATAL(__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"); } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } function extensionVersionMatches ($ext_name) { // Load cache (dummy) $this->getArrayFromCache(); // Get extension version $ext_ver = GET_EXT_VERSION($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; } } // ?>