From 5d66a4bcf3ad5d584255184776f1f04451c929fc Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 19 Apr 2012 03:42:19 -0400
Subject: [PATCH] - Improved ttl values handling

---
 program/include/rcube.php        |    2 +-
 program/include/rcube_shared.inc |   34 ++++++++++++++++++++++------------
 program/include/rcube_cache.php  |    8 ++++++--
 program/include/rcube_imap.php   |    2 --
 4 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/program/include/rcube.php b/program/include/rcube.php
index 2566def..780f9b6 100644
--- a/program/include/rcube.php
+++ b/program/include/rcube.php
@@ -236,7 +236,7 @@
    *
    * @param string $name   Cache identifier
    * @param string $type   Cache type ('db', 'apc' or 'memcache')
-   * @param int    $ttl    Expiration time for cache items in seconds
+   * @param string $ttl    Expiration time for cache items
    * @param bool   $packed Enables/disables data serialization
    *
    * @return rcube_cache Cache object
diff --git a/program/include/rcube_cache.php b/program/include/rcube_cache.php
index 6d7a9ea..ef04beb 100644
--- a/program/include/rcube_cache.php
+++ b/program/include/rcube_cache.php
@@ -59,7 +59,7 @@
      * @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)
+     * @param string $ttl    Expiration time of memcache/apc items
      * @param bool   $packed Enables/disabled data serialization.
      *                       It's possible to disable data serialization if you're sure
      *                       stored data will be always a safe string
@@ -82,8 +82,12 @@
             $this->db   = $rcube->get_dbh();
         }
 
+        // convert ttl string to seconds
+        $ttl = get_offset_sec($ttl);
+        if ($ttl > 2592000) $ttl = 2592000;
+
         $this->userid    = (int) $userid;
-        $this->ttl       = (int) $ttl;
+        $this->ttl       = $ttl;
         $this->packed    = $packed;
         $this->prefix    = $prefix;
     }
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index daba72e..78c282d 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -3532,8 +3532,6 @@
         if ($this->caching && !$this->cache) {
             $rcube = rcube::get_instance();
             $ttl = $rcube->config->get('message_cache_lifetime', '10d');
-            $ttl = get_offset_time($ttl) - time();
-
             $this->cache = $rcube->get_cache('IMAP', $this->caching, $ttl);
         }
 
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index b391165..176a462 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -146,25 +146,23 @@
 
 
 /**
- * Create a unix timestamp with a specified offset from now.
+ * Returns number of seconds for a specified offset string.
  *
- * @param string $offset_str  String representation of the offset (e.g. 20min, 5h, 2days)
- * @param int    $factor      Factor to multiply with the offset
+ * @param string $str  String representation of the offset (e.g. 20min, 5h, 2days, 1week)
  *
- * @return int Unix timestamp
+ * @return int Number of seconds
  */
-function get_offset_time($offset_str, $factor=1)
+function get_offset_sec($str)
 {
-    if (preg_match('/^([0-9]+)\s*([smhdw])/i', $offset_str, $regs)) {
-        $amount = (int)$regs[1];
+    if (preg_match('/^([0-9]+)\s*([smhdw])/i', $str, $regs)) {
+        $amount = (int) $regs[1];
         $unit   = strtolower($regs[2]);
     }
     else {
-        $amount = (int)$offset_str;
+        $amount = (int) $str;
         $unit   = 's';
     }
 
-    $ts = time();
     switch ($unit) {
     case 'w':
         $amount *= 7;
@@ -174,11 +172,23 @@
         $amount *= 60;
     case 'm':
         $amount *= 60;
-    case 's':
-        $ts += $amount * $factor;
     }
 
-    return $ts;
+    return $amount;
+}
+
+
+/**
+ * Create a unix timestamp with a specified offset from now.
+ *
+ * @param string $offset_str  String representation of the offset (e.g. 20min, 5h, 2days)
+ * @param int    $factor      Factor to multiply with the offset
+ *
+ * @return int Unix timestamp
+ */
+function get_offset_time($offset_str, $factor=1)
+{
+    return time() + get_offset_sec($offset_str) * $factor;
 }
 
 

--
Gitblit v1.9.1