From 79db33098381dd843cd8b9a1932688d3bafd5cc4 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sun, 27 Nov 2011 10:11:20 -0500
Subject: [PATCH] - Fix fit_string_to_size() renders browser and ui unresponsive (#1488207):   1) improve its performance by half,   2) don't call it on UI init, it's called after getunread action   3) don't call it for big number of folders (limit is 100 for IE and 500 for others)

---
 program/include/rcube_cache.php |   63 ++++++++++++++++++++++---------
 1 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/program/include/rcube_cache.php b/program/include/rcube_cache.php
index a9af8b1..018d5f5 100644
--- a/program/include/rcube_cache.php
+++ b/program/include/rcube_cache.php
@@ -28,7 +28,7 @@
  * @package    Cache
  * @author     Thomas Bruederli <roundcube@gmail.com>
  * @author     Aleksander Machniak <alec@alec.pl>
- * @version    1.0
+ * @version    1.1
  */
 class rcube_cache
 {
@@ -188,6 +188,24 @@
 
 
     /**
+     * Remove cache records older than ttl
+     */
+    function expunge()
+    {
+        if ($this->type == 'db' && $this->db) {
+            $this->db->query(
+                "DELETE FROM ".get_table_name('cache').
+                " WHERE user_id = ?".
+                " AND cache_key LIKE ?".
+                " AND " . $this->db->unixtimestamp('created')." < ?",
+                $this->userid,
+                $this->prefix.'.%',
+                time() - $this->ttl);
+        }
+    }
+
+
+    /**
      * Writes the cache back to the DB.
      */
     function close()
@@ -227,26 +245,30 @@
             return null;
         }
 
-        if ($this->type == 'memcache') {
-            $data = $this->db->get($this->ckey($key));
-        }
-        else if ($this->type == 'apc') {
-            $data = apc_fetch($this->ckey($key));
-	    }
-
-        if ($data) {
-            $md5sum = md5($data);
-            $data   = $this->packed ? unserialize($data) : $data;
-
-            if ($nostore) {
-                return $data;
+        if ($this->type != 'db') {
+            if ($this->type == 'memcache') {
+                $data = $this->db->get($this->ckey($key));
             }
+            else if ($this->type == 'apc') {
+                $data = apc_fetch($this->ckey($key));
+	        }
 
-            $this->cache_sums[$key] = $md5sum;
-            $this->cache[$key]      = $data;
+            if ($data) {
+                $md5sum = md5($data);
+                $data   = $this->packed ? unserialize($data) : $data;
+
+                if ($nostore) {
+                    return $data;
+                }
+
+                $this->cache_sums[$key] = $md5sum;
+                $this->cache[$key]      = $data;
+            }
+            else {
+                $this->cache[$key] = null;
+            }
         }
-
-        if ($this->type == 'db') {
+        else {
             $sql_result = $this->db->limitquery(
                 "SELECT cache_id, data, cache_key".
                 " FROM ".get_table_name('cache').
@@ -271,6 +293,9 @@
                 $this->cache[$key]      = $data;
 	            $this->cache_sums[$key] = $md5sum;
                 $this->cache_keys[$key] = $sql_arr['cache_id'];
+            }
+            else {
+                $this->cache[$key] = null;
             }
         }
 
@@ -434,7 +459,7 @@
     /**
      * Deletes entry from memcache/apc DB.
      */
-    private function delete_record($index=true)
+    private function delete_record($key, $index=true)
     {
         if ($this->type == 'memcache')
             $this->db->delete($this->ckey($key));

--
Gitblit v1.9.1