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! return "done"; } else { // Stop! Set a .htaccess file first $this->ret="htaccess"; return "htaccess"; } } } elseif ($tested) { // System already tested $this->ret="done"; return "done"; } // Something goes wrong here! $this->ret="failed"; return "failed"; } function cache_file($file, $ignore_ctime=false) { global $INC; // 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 (((time() - $ctime) >= $this->update_interval) && (!$ignore_ctime)) { // Ok, we need an update! $status = false; } // 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); $fp = @fopen($this->cache_inc, 'w') or mxchange_die("Cannot write to cache ".$this->cache_inc." !"); // Begin of cache file fwrite($fp, "\$ARRAY = \"".$array."\";\n\n"); // Remember file pointer $this->cache_pointer = $fp; } 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 ($this->cache_pointer) { // Close file add destroy handler @fclose($this->cache_pointer); // Set rights if (FILE_READABLE($this->cache_inc)) @chmod($this->cache_inc, 0666); // Remove pointer unset($this->cache_pointer); } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } function cache_load() { // Is the cache file there? if (FILE_READABLE($this->cache_inc)) { // Prepare temporary array $data = array(); $cache_version = null; // Load cache file $this->cache_data = implode("", file($this->cache_inc)); // Execute cache file eval($this->cache_data); if (is_array($data)) { // Cache data $this->cache_data = $data; // Cache version found? if ((isset($cache_version)) && (is_array($cache_version))) { // Remember it as well... $this->cache_version = $cache_version; } // END - if // Return cache return $this->cache_data; } 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); } } function cache_destroy() { 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 $fp = fopen($this->cache_inc, 'w'); fwrite($fp, "\$ARRAY = \"".$ARRAY."\";\n"); foreach ($dummy 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($fp, $LINE); } // Close cache file fclose($fp); } } else { // Cannot write to cache! 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 $fp = fopen($this->cache_inc, 'w'); fwrite($fp, "\$dummy = \"".$ARRAY."\";\n"); foreach ($dummy 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($fp, $LINE); } // Close cache file fclose($fp); } } } 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(); // Get extension version $ext_ver = GET_EXT_VERSION($ext_name); //* DEBUG: */ echo __METHOD__.": ext_name={$ext_name},ext_ver={$ext_ver},cache_version={$this->cache_version}
\n"; // Compare both return ((isset($this->cache_version[$ext_name])) && ($this->cache_version[$ext_name] == $ext_ver)); } function add_raw_row ($key, $value) { // Init line $line = ""; // String or non-string? ;-) if (is_string($value)) { // String... $line = "\$data['".$key."'][] = \"".$value."\";\n"; } else { // Non-string $line = "\$data['".$key."'][] = ".$value.";\n"; } // Return line return $line; } } // ?>