diff options
Diffstat (limited to 'scire/phpgacl/Cache_Lite/Hashed_Cache_Lite.php')
-rw-r--r-- | scire/phpgacl/Cache_Lite/Hashed_Cache_Lite.php | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/scire/phpgacl/Cache_Lite/Hashed_Cache_Lite.php b/scire/phpgacl/Cache_Lite/Hashed_Cache_Lite.php new file mode 100644 index 0000000..894952f --- /dev/null +++ b/scire/phpgacl/Cache_Lite/Hashed_Cache_Lite.php @@ -0,0 +1,184 @@ +<?php +/* + * phpGACL - Generic Access Control List - Hashed Directory Caching. + * Copyright (C) 2002 Mike Benoit + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For questions, help, comments, discussion, etc., please join the + * phpGACL mailing list. http://sourceforge.net/mail/?group_id=57103 + * + * You may contact the author of phpGACL by e-mail at: + * ipso@snappymail.ca + * + * The latest version of phpGACL can be obtained from: + * http://phpgacl.sourceforge.net/ + * + */ + +if ( !class_exists('Cache_Lite') ) { + require_once(dirname(__FILE__) .'/Lite.php'); +} + +define('DIR_SEP',DIRECTORY_SEPARATOR); + +class Hashed_Cache_Lite extends Cache_Lite +{ + /** + * Make a file name (with path) + * + * @param string $id cache id + * @param string $group name of the group + * @access private + */ + function _setFileName($id, $group) + { + // CRC32 with SUBSTR is still faster then MD5. + $encoded_id = substr(crc32($id),1); + // $encoded_id = md5($id); + + // Generate just the directory, so it can be created. + // Groups will have their own top level directory, for quick/easy purging of an entire group. + $dir = $this->_cacheDir.$group.'/'.substr($encoded_id,0,3); + $this->_create_dir_structure($dir); + + $this->_file = $dir.'/'.$encoded_id; + } + + /** + * Create full directory structure, Ripped straight from the Smarty Template engine. + * Version: 2.3.0 + * Copyright: 2001,2002 ispi of Lincoln, Inc. + * + * @param string $dir Full directory. + * @access private + */ + function _create_dir_structure($dir) + { + if (!@file_exists($dir)) { + $dir_parts = preg_split('![\/]+!', $dir, -1, PREG_SPLIT_NO_EMPTY); + $new_dir = ($dir{0} == DIR_SEP) ? DIR_SEP : ''; + foreach ($dir_parts as $dir_part) { + $new_dir .= $dir_part; + if (!file_exists($new_dir) && !mkdir($new_dir, 0771)) { + Cache_Lite::raiseError('Cache_Lite : problem creating directory \"$dir\" !', -3); + return false; + } + $new_dir .= DIR_SEP; + } + } + } + + function _remove_dir_structure($dir,$remove_dir = false) + { + if (in_array(substr($dir,-1),array(DIR_SEP,'/','\\'))) { + $dir = substr($dir,0,-1); + } + + if (!($dh = opendir($dir))) { + $this->raiseError('Cache_Lite : Unable to open cache directory !', -4); + return false; + } + + while ($file = readdir($dh)) { + if ($file == '.' || $file == '..') { + continue; + } + $file = $dir . DIR_SEP . $file; + if (is_dir($file)) { + $this->_remove_dir_structure($file,true); + continue; + } + if (is_file($file)) { + if (!@unlink($file)) { + closedir($dh); + $this->raiseError('Cache_Lite : Unable to remove cache !', -3); + return false; + } + continue; + } + } + + closedir($dh); + + if ($remove_dir) { + clearstatcache(); + if (!@rmdir($dir)) { + $this->raiseError('Cache_Lite : Unable to remove cache directory !', -4); + return false; + } + } + + return true; + } + + /** + * Clean the cache + * + * if no group is specified all cache files will be destroyed + * else only cache files of the specified group will be destroyed + * + * @param string $group name of the cache group + * @return boolean true if no problem + * @access public + */ + function clean($group = false) + { + if ($group) { + $motif = $this->_cacheDir.$group.'/'; + + if ($this->_memoryCaching) { + foreach ($this->_memoryCachingArray as $key => $value) { + if (strpos($key, $motif, 0)) { + unset($this->_memoryCachingArray[$key]); + } + } + $this->_memoryCachingCounter = count($this->_memoryCachingArray); + if ($this->_onlyMemoryCaching) { + return true; + } + } + + return $this->_remove_dir_structure($motif); + } + + if ($this->_memoryCaching) { + $this->_memoryCachingArray = array(); + $this->_memoryCachingCounter = 0; + if ($this->_onlyMemoryCaching) { + return true; + } + } + + if (!($dh = opendir($this->_cacheDir))) { + $this->raiseError('Cache_Lite : Unable to open cache directory !', -4); + return false; + } + + while ($file = readdir($dh)) { + if ($file == '.' || $file == '..') { + continue; + } + $file = $this->_cacheDir . $file; + if (is_dir($file) && !$this->_remove_dir_structure($file,true)) { + return false; + } + } + + return true; + } +} + +// end of script |