uw              Sat Mar  3 11:02:54 2001 EDT

  Modified files:              
    /php4/pear/Cache/Container  file.php 
  Log:
  Changes for the new cache structure / features.
   - added delDirectory() as a helper function for flush
   - new file format
  
  
  
Index: php4/pear/Cache/Container/file.php
diff -u php4/pear/Cache/Container/file.php:1.3 php4/pear/Cache/Container/file.php:1.4
--- php4/pear/Cache/Container/file.php:1.3      Fri Mar  2 06:00:43 2001
+++ php4/pear/Cache/Container/file.php  Sat Mar  3 11:02:54 2001
@@ -16,7 +16,7 @@
 // |          Sebastian Bergmann <[EMAIL PROTECTED]>               |
 // +----------------------------------------------------------------------+
 //
-// $Id: file.php,v 1.3 2001/03/02 14:00:43 uw Exp $
+// $Id: file.php,v 1.4 2001/03/03 19:02:54 uw Exp $
 
 require_once 'Cache/Container.php';
 
@@ -24,7 +24,7 @@
 * Stores cache contents in a file.
 *
 * @author   Ulf Wendel  <[EMAIL PROTECTED]>
-* @version  $Id: file.php,v 1.3 2001/03/02 14:00:43 uw Exp $
+* @version  $Id: file.php,v 1.4 2001/03/03 19:02:54 uw Exp $
 */
 class Cache_Container_file extends Cache_Container {
 
@@ -64,17 +64,19 @@
         if (is_array($options))
             $this->setOptions($options, array("cache_dir", "filename_prefix"));
 
+        clearstatcache();
+        
         if (!file_exists($this->cache_dir) || !is_dir($this->cache_dir))
             mkdir($this->cache_dir, 0755);
         
     } // end func contructor
     
     
-    function fetch($id) {
+    function fetch($id, $group) {
         
-        $file = $this->getFilename($id);
+        $file = $this->getFilename($id, $group);
         if (!file_exists($file)) 
-            return array(NULL, NULL);
+            return array(NULL, NULL, NULL);
        
         // retrive the content
         if (!($fh = @fopen($file, "rb")))
@@ -82,30 +84,39 @@
         
         // file format:
         // 1st line: expiration date
-        // 2nd+ lines: cache data
+        // 2nd line: user data
+        // 3rd+ lines: cache data
         $expire = trim(fgets($fh, 11));
-        $data = $this->decode(fread($fh, filesize($file)));
-        
+        $userdata = trim(fgets($fh, 257));
+        $cachedata = $this->decode(fread($fh, filesize($file)));
         fclose($fh);
         
-        return array($expire, $data);
+        return array($expire, $cachedata, $userdata);
     } // end func fetch
     
     
-    function save($id, $data, $expire = 0) {
+    /**
+    * Stores a dataset.
+    * 
+    * WARNING: If you supply userdata it must not contain any linebreaks,
+    * otherwise it will break the filestructure.
+    */
+    function save($id, $cachedata, $expires, $group, $userdata) {
         
-        $this->flushPreload($id);
+        $this->flushPreload($id, $group);
 
-        $file = $this->getFilename($id);
+        $file = $this->getFilename($id, $group);
         if (!($fh = @fopen($file, "wb")))
             return new CacheError("Can't access '$file' to store cache data. Check 
access rights and path.", __FILE__, __LINE__);
 
         // file format:
         // 1st line: expiration date
-        // 2nd+ lines: cache data
-        $expire = ($expire) ? $expire + time() : 0;
-        fwrite($fh, $expire . "\r\n");
-        fwrite($fh, $this->encode($data));
+        // 2nd line: user data
+        // 3rd+ lines: cache data
+        $expires = ($expires) ? $expires + time() : 0;
+        fwrite($fh, $expires . "\n");
+        fwrite($fh, $userdata . "\n");
+        fwrite($fh, $this->encode($cachedata));
         
         fclose($fh);
         
@@ -114,50 +125,39 @@
         
         return true;        
     } // end func save
-    
     
-    function delete($id) {
+    function delete($id, $group) {
 
-        $this->flushPreload($id);
+        $this->flushPreload($id, $group);
 
-        $file = $this->getFilename($id);
+        $file = $this->getFilename($id, $group);
         if (file_exists($file)) {
-            
-            unlink($file);
+                   
+            $ok = unlink($file);
             clearstatcache();
             
-            return true;
+            return $ok;
         }
                     
         return false;            
     } // end func delete
     
     
-    function flush() {
+    function flush($group) {
 
         $this->flushPreload();
-
-        if (!($dh = opendir($this->cache_dir)))
-            return new CacheError("Can't access the cache directory 
'$this->cache_dir'. Check access rights and path", __FILE__, __LINE__);
-
-        $num_removed = 0;                
-        while ($file = readdir($dh)) {
-            if ("." == $file || ".." == $file)
-                continue;
-                
-            unlink($this->cache_dir . $file);
-            $num_removed++;
-        }
+        $dir = ($group) ? $this->cache_dir . $group . "/" : $this->cache_dir;
         
+        $num_removed = $this->deleteDir($dir);
         clearstatcache();
-
+        
         return $num_removed;
     } // end func flush
 
     
-    function idExists($id) {
+    function idExists($id, $group) {
     
-        return file_exists($this->cache_dir . $this->filename_prefix . $id);
+        return file_exists($this->getFilename($id, $group));
         
     } // end func idExists
     
@@ -171,23 +171,31 @@
     * read from them and if neccessary they have to be unlinked (removed).
     * If you have a user comment for a good default gc probability please add it to
     * to the inline docs.
+    * 
+    * @param    string  directory to examine - don't sets this parameter, it's used 
+for a 
+    *                   recursive function call!
     */
-    function garbageCollection() {
+    function garbageCollection($dir = "") {
         
         $this->flushPreload();      
-
-        if (!($dh = opendir($this->cache_dir)))
-            return new CacheError("Can't access cache directory.", __FILE__, 
__LINE__);
+        
+        if (!$dir)
+            $dir = $this->cache_dir;
+            
+        if (!($dh = opendir($dir)))
+            return new CacheError("Can't access cache directory '$dir'. Check 
+permissions and path.", __FILE__, __LINE__);
 
         while ($file = readdir($dh)) {
             if ("." == $file || ".." == $file)
                 continue;
 
-            $file = $this->cache_dir . $file;
+            $file = $dir . $file;
+            if (is_dir($file))
+                $this->garbageCollection($file . "/");
                     
             // skip trouble makers but inform the user                
             if (!($fh = @fopen($file, "rb"))) {
-                new CacheError("Can't access cache file '$file' skipping for garbage 
collection. Check access rights and path.", __FILE__, __LINE__);
+                new CacheError("Can't access cache file '$file', skipping it. Check 
+permissions and path.", __FILE__, __LINE__);
                 continue;
             }
             
@@ -195,8 +203,8 @@
             fclose($fh);
             
             // remove if expired
-            if ($expire && $expire <= time())
-                unlink($file);                
+            if ($expire && $expire <= time() && !unlink($file))
+                new CacheError("Can't unlink cache file '$file', skipping. Check 
+permissions and path.", __FILE__, __LINE__);
         }            
     
         closedir($dh);
@@ -211,12 +219,68 @@
     * Returns the filename for the specified id.
     *
     * @param    string  dataset ID
+    * @param    string  cache group
     * @return   string  full filename with the path
     * @access   public
     */
-    function getFilename($id) {
-        return $this->cache_dir . $this->filename_prefix . $id;
+    function getFilename($id, $group) {
+        static $group_dirs = array();
+        
+        if (isset($group_dirs[$group]))
+            return $group_dirs[$group] . $this->filename_prefix . $id;
+
+          
+        $dir = $this->cache_dir . $group . "/";
+        if (!file_exists($dir)) {
+            mkdir($dir, 0755);
+            clearstatcache();
+        }
+                
+        $group_dirs[$group] = $dir;
+        
+        return $dir . $this->filename_prefix . $id;
     } // end func getFilename
+    
+    
+    /**
+    * Deletes a directory and all files in it.
+    * 
+    * @param    string  directory
+    * @return   integer number of removed files
+    * @throws   CacheError
+    */
+    function deleteDir($dir) {
+        
+        if (!($dh = opendir($dir)))
+            return new CacheError("Can't remove directory '$dir'. Check permissions 
+and path.", __FILE__, __LINE__);
+
+        $num_removed = 0;
+                    
+        while ($file = readdir($dh)) {
+            if ("." == $file || ".." == $file)
+                continue;
 
-}
+            $file = $dir . $file;
+            if (is_dir($file)) {
+            
+                $file .= "/";
+                $num = $this->deleteDir($file . "/");
+                if (is_int($num))
+                    $num_removed += $num;
+                    
+            } else {
+            
+                if (unlink($file))
+                    $num_removed++;
+                
+            }
+
+
+        }
+        
+        return $num_removed;
+    } // end func deleteDir
+
+    
+} // end class file
 ?>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to