From ee258ce15870e6cb4b733087368a062b5fd66b52 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 23 Jul 2009 08:12:27 -0400
Subject: [PATCH] - performance fix: don't check mbstring functions existence too often

---
 program/include/rcube_imap.php |   49 +++++++++++++++++++++++++++++--------------------
 1 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index be8e084..5b5a98c 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -561,7 +561,7 @@
 
     // use saved message set
     if ($this->search_string && $mailbox == $this->mailbox)
-      return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order);
+      return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order, $slice);
 
     $this->_set_sort_order($sort_field, $sort_order);
 
@@ -574,13 +574,16 @@
       {
       $start_msg = ($page-1) * $this->page_size;
       $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
-      return array_values($a_msg_headers);
+      $result = array_values($a_msg_headers);
+      if ($slice)
+        $result = array_slice($result, -$slice, $slice);
+      return $result;
       }
     // cache is dirty, sync it
     else if ($this->caching_enabled && $cache_status==-1 && !$recursive)
       {
       $this->sync_header_index($mailbox);
-      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE);
+      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE, $slice);
       }
 
     // retrieve headers from IMAP
@@ -648,11 +651,12 @@
    * @param   int      Current page to list
    * @param   string   Header field to sort by
    * @param   string   Sort order [ASC|DESC]
+   * @param   boolean  Number of slice items to extract from result array
    * @return  array    Indexed array with message header objects
    * @access  private
    * @see     rcube_imap::list_header_set()
    */
-  private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL)
+  private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
     {
     if (!strlen($mailbox) || empty($this->search_set))
       return array();
@@ -683,6 +687,9 @@
       // get messages uids for one page
       $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
 
+      if ($slice)
+        $msgs = array_slice($msgs, -$slice, $slice);
+
       // fetch headers
       $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
 
@@ -699,6 +706,8 @@
 	$a_index = $this->message_index('', $this->sort_field, $this->sort_order);
         // get messages uids for one page...
         $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size));
+        if ($slice)
+          $msgs = array_slice($msgs, -$slice, $slice);
 	// ...and fetch headers
         $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
 
@@ -724,7 +733,11 @@
         $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
       
         // only return the requested part of the set
-        return array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
+	$a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
+        if ($slice)
+          $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice);
+
+        return $a_msg_headers;
         }
       }
     }
@@ -1022,14 +1035,6 @@
       }
     else
       $a_messages = iil_C_Search($this->conn, $mailbox, ($charset ? "CHARSET $charset " : '') . $criteria);
-
-    // clean message list (there might be some empty entries)
-    if (is_array($a_messages))
-      {
-      foreach ($a_messages as $i => $val)
-        if (empty($val))
-          unset($a_messages[$i]);
-      }
     
     // update messagecount cache ?
 //    $a_mailbox_cache = get_cache('messagecount');
@@ -1149,7 +1154,7 @@
 
       // write structure to cache
       if ($this->caching_enabled)
-        $this->add_message_cache($cache_key, $msg_id, $headers, $struct);
+        $this->add_message_cache($cache_key, $this->_msg_id, $headers, $struct);
       }
 
     return $struct;
@@ -1429,6 +1434,10 @@
       {
       $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true); 
       $structure = iml_GetRawStructureArray($structure_str);
+      // error or message not found
+      if (empty($structure))
+        return false;
+
       $part_type = iml_GetPartTypeCode($structure, $part);
       $o_part = new rcube_message_part;
       $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other');
@@ -1442,7 +1451,7 @@
 
     $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, $part,
         $o_part->encoding, $print, $fp);
-      
+
     if ($fp || $print)
       return true;
 
@@ -2388,10 +2397,10 @@
         $key,
         $index,
         $headers->uid,
-        (string)rc_substr($this->db->encode($this->decode_header($headers->subject, TRUE)), 0, 128),
-        (string)rc_substr($this->db->encode($this->decode_header($headers->from, TRUE)), 0, 128),
-        (string)rc_substr($this->db->encode($this->decode_header($headers->to, TRUE)), 0, 128),
-        (string)rc_substr($this->db->encode($this->decode_header($headers->cc, TRUE)), 0, 128),
+        (string)mb_substr($this->db->encode($this->decode_header($headers->subject, TRUE)), 0, 128),
+        (string)mb_substr($this->db->encode($this->decode_header($headers->from, TRUE)), 0, 128),
+        (string)mb_substr($this->db->encode($this->decode_header($headers->to, TRUE)), 0, 128),
+        (string)mb_substr($this->db->encode($this->decode_header($headers->cc, TRUE)), 0, 128),
         (int)$headers->size,
         serialize($this->db->encode(clone $headers)),
         is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL
@@ -2779,7 +2788,7 @@
       if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
         $a_defaults[$p] = $folder;
       else
-        $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP'));
+        $folders[$folder] = mb_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP'));
       }
 
     // sort folders and place defaults on the top

--
Gitblit v1.9.1