From 7ad8e2c3180e2357cbc395da18c5f9d4ad509b0a Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 23 May 2011 05:34:57 -0400
Subject: [PATCH] - Add TTL parameter to rcube_cache class (and rcmail::get_cache method)

---
 program/include/rcube_cache.php |   22 ++++++++--------------
 program/include/rcmail.php      |   11 ++++++-----
 2 files changed, 14 insertions(+), 19 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 7844b98..acd661d 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -333,7 +333,7 @@
         $this->memcache = false;
         return false;
       }
-      
+
       $this->memcache = new Memcache;
       $mc_available = 0;
       foreach ($this->config->get('memcache_hosts', array()) as $host) {
@@ -343,11 +343,11 @@
         if ($this->memcache->addServer($host, $port) && !$mc_available)
           $mc_available += intval($this->memcache->connect($host, $port));
       }
-      
+
       if (!$mc_available)
         $this->memcache = false;
     }
-    
+
     return $this->memcache;
   }
 
@@ -357,13 +357,14 @@
    *
    * @param string $name Cache identifier
    * @param string $type Cache type ('db', 'apc' or 'memcache')
+   * @param int    $ttl  Expiration time for cache items in seconds
    *
    * @return rcube_cache Cache object
    */
-  public function get_cache($name, $type)
+  public function get_cache($name, $type='db', $ttl=0)
   {
     if (!isset($this->caches[$name])) {
-      $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name);
+      $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name, $ttl);
     }
 
     return $this->caches[$name];
diff --git a/program/include/rcube_cache.php b/program/include/rcube_cache.php
index 8c5a750..4c193db 100644
--- a/program/include/rcube_cache.php
+++ b/program/include/rcube_cache.php
@@ -41,6 +41,7 @@
     private $type;
     private $userid;
     private $prefix;
+    private $ttl;
     private $index;
     private $cache         = array();
     private $cache_keys    = array();
@@ -54,12 +55,13 @@
      * @param string $type   Engine type ('db' or 'memcache' or 'apc')
      * @param int    $userid User identifier
      * @param string $prefix Key name prefix
+     * @param int    $ttl    Expiration time of memcache/apc items in seconds (max.2592000)
      */
-    function __construct($type, $userid, $prefix='')
+    function __construct($type, $userid, $prefix='', $ttl=0)
     {
         $rcmail = rcmail::get_instance();
         $type   = strtolower($type);
-    
+
         if ($type == 'memcache') {
             $this->type = 'memcache';
             $this->db   = $rcmail->get_memcache();
@@ -74,6 +76,7 @@
         }
 
         $this->userid = (int) $userid;
+        $this->ttl    = (int) $ttl;
         $this->prefix = $prefix;
     }
 
@@ -179,7 +182,6 @@
      * @param string $key Cache key name
      *
      * @return mixed Cached value
-     * @access private
      */
     private function read_record($key)
     {
@@ -228,7 +230,6 @@
      *
      * @param string $key  Cache key name
      * @param mxied  $data Serialized cache data 
-     * @access private
      */
     private function write_record($key, $data)
     {
@@ -285,7 +286,6 @@
      * @param boolean $prefix_mode Enable it to clear all keys starting
      *                             with prefix specified in $key
      *
-     * @access private;
      */
     private function remove_record($key=null, $prefix_mode=false)
     {
@@ -341,28 +341,26 @@
 
     /**
      * Adds entry into memcache/apc DB.
-     * @access private
      */
     private function add_record($key, $data)
     {
         if ($this->type == 'memcache') {
-            $result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED);
+            $result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED, $this->ttl);
             if (!$result)
-                $result = $this->db->set($key, $data, MEMCACHE_COMPRESSED);
+                $result = $this->db->set($key, $data, MEMCACHE_COMPRESSED, $this->ttl);
             return $result;
         }
 
         if ($this->type == 'apc') {
             if (apc_exists($key))
                 apc_delete($key);
-            return apc_store($key, $data);
+            return apc_store($key, $data, $this->ttl);
         }
     }
 
 
     /**
      * Deletes entry from memcache/apc DB.
-     * @access private
      */
     private function delete_record($index=true)
     {
@@ -381,7 +379,6 @@
 
     /**
      * Writes the index entry into memcache/apc DB.
-     * @access private
      */
     private function write_index()
     {
@@ -411,7 +408,6 @@
 
     /**
      * Gets the index entry from memcache/apc DB.
-     * @access private
      */
     private function load_index()
     {
@@ -441,7 +437,6 @@
      * @param string $key Cache key name
      *
      * @return string Cache key
-     * @access private
      */
     private function ckey($key)
     {
@@ -453,7 +448,6 @@
      * Creates per-user index cache key name (for memcache and apc)
      *
      * @return string Cache key
-     * @access private
      */
     private function ikey()
     {

--
Gitblit v1.9.1