3.0.2 Version 1.0.6, on 2008-02-29, by Skrol29 ******************************************************** */ define('TBS_CACHE','clsTbsCacheSytem'); define('TBS_DELETE', -1); // For compatibility define('TBS_CANCEL', -2); // For compatibility define('TBS_CACHEDELETE', -1); define('TBS_CACHECANCEL', -2); define('TBS_CACHENOW', -3); define('TBS_CACHEONSHOW', -4); define('TBS_CACHELOAD', -5); define('TBS_CACHEGETAGE', -6); define('TBS_CACHEGETNAME', -7); define('TBS_CACHEISONSHOW', -8); define('TBS_CACHEDELETEMASK', -9); class clsTbsCacheSytem { function OnInstall($CacheDir=false,$CacheMask=false) { $this->Version = '1.0.6'; $this->ShowFromCache = false; $this->CacheFile = array(); $TBS =& $this->TBS; if (!isset($TBS->CacheMask)) $TBS->CacheMask = 'cache_tbs_*.php'; // for compatibility if (!isset($TBS->CacheDir)) $TBS->CacheDir = ''; if ($CacheMask!==false) $TBS->CacheMask = $CacheMask; if ($CacheDir!==false ) $TBS->CacheDir = $CacheDir; return array('OnCommand','BeforeShow','AfterShow'); } function OnCommand($CacheId,$Action=3600,$Dir=false) { $TBS =& $this->TBS; $CacheId = trim($CacheId); $Res = false; if ($Dir===false) $Dir = $TBS->CacheDir; if (!isset($this->CacheFile[$TBS->_Mode])) $this->CacheFile[$TBS->_Mode] = false; if ($Action===TBS_CACHECANCEL) { // Cancel cache save if any $this->CacheFile[$TBS->_Mode] = false; } elseif (($CacheId === '*') and ($Action===TBS_CACHEDELETE)) { $Res = tbs_Cache_DeleteAll($Dir,$TBS->CacheMask); } elseif ($Action===TBS_CACHEDELETEMASK) { $Res = tbs_Cache_DeleteAll($Dir,$CacheId); } else { $CacheFile = tbs_Cache_File($Dir,$CacheId,$TBS->CacheMask); if ($Action===TBS_CACHENOW) { $this->meth_Cache_Save($CacheFile,$TBS->Source); } elseif ($Action===TBS_CACHEGETAGE) { if (file_exists($CacheFile)) $Res = time()-filemtime($CacheFile); } elseif ($Action===TBS_CACHEGETNAME) { $Res = $CacheFile; } elseif ($Action===TBS_CACHEISONSHOW) { $Res = ($this->CacheFile[$TBS->_Mode]!==false); } elseif ($Action===TBS_CACHELOAD) { if (file_exists($CacheFile)) { if ($TBS->f_Misc_GetFile($TBS->Source,$CacheFile)) { $this->CacheFile[$TBS->_Mode] = $CacheFile; $Res = true; } } if ($Res===false) $TBS->Source = ''; } elseif ($Action===TBS_CACHEDELETE) { if (file_exists($CacheFile)) $Res = @unlink($CacheFile); } elseif ($Action===TBS_CACHEONSHOW) { $this->CacheFile[$TBS->_Mode] = $CacheFile; @touch($CacheFile); } elseif($Action>=0) { $Res = tbs_Cache_IsValide($CacheFile,$Action); if ($Res) { // Load the cache if ($TBS->f_Misc_GetFile($TBS->Source,$CacheFile)) { // Display cache contents $this->ShowFromCache = true; $TBS->Show(); $this->ShowFromCache = false; } else { $TBS->meth_Misc_Alert('CacheSystem plug-in','Unable to read the file \''.$CacheFile.'\'.'); $Res==false; } $this->CacheFile[$TBS->_Mode] = false; } else { // The result will be saved in the cache when the Show() method is called $this->CacheFile[$TBS->_Mode] = $CacheFile; @touch($CacheFile); } } } return $Res; } function BeforeShow(&$Render) { if ($this->ShowFromCache) return false; // Cancel automatic merges } function AfterShow(&$Render) { // Save cache file if planned to if (isset($this->CacheFile[$this->TBS->_Mode]) and is_string($this->CacheFile[$this->TBS->_Mode])) { $this->meth_Cache_Save($this->CacheFile[$this->TBS->_Mode],$this->TBS->Source); } } function meth_Cache_Save($CacheFile,&$Txt) { $fid = @fopen($CacheFile, 'w'); if ($fid===false) { $this->TBS->meth_Misc_Alert('CacheSystem plug-in','The cache file \''.$CacheFile.'\' can not be saved.'); return false; } else { flock($fid,2); // acquire an exlusive lock fwrite($fid,$Txt); flock($fid,3); // release the lock fclose($fid); return true; } } } function tbs_Cache_IsValide($CacheFile,$TimeOut) { // Return True if there is a existing valid cache for the given file id. if (file_exists($CacheFile)) { if (time()-filemtime($CacheFile)>$TimeOut) { return false; } else { return true; } } else { return false; } } function tbs_Cache_File($Dir,$CacheId,$Mask) { // Return the cache file path for a given Id. if (strlen($Dir)>0) { if ($Dir[strlen($Dir)-1]<>'/') { $Dir .= '/'; } } return $Dir.str_replace('*',$CacheId,$Mask); } function tbs_Cache_DeleteAll($Dir,$Mask) { if (strlen($Dir)==0) { $Dir = '.'; } if ($Dir[strlen($Dir)-1]<>'/') { $Dir .= '/'; } $DirObj = dir($Dir); $Nbr = 0; // Get the list of cache files $FileLst = array(); while ($FileName = $DirObj->read()) { $FullPath = $Dir.$FileName; if (strtolower(filetype($FullPath))==='file') { if (@preg_match('/^' . strtr(addcslashes($Mask, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $FileName)) { $FileLst[] = $FullPath; } } } // Delete all listed files foreach ($FileLst as $FullPath) { if (@unlink($FullPath)) $Nbr++; } return $Nbr; } ?>