From 7a229b9e33f7955db3cd6725d357f01735293216 Mon Sep 17 00:00:00 2001 From: alecpl Date: Thu, 8 Jan 2009 12:40:18 +0000 Subject: - Improve messages display performance --- program/include/rcube_imap.php | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'program/include/rcube_imap.php') diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index f378f2c9f..36a346300 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -1047,9 +1047,10 @@ class rcube_imap * @param int Message ID * @param string Mailbox to read from * @param boolean True if $id is the message UID + * @param boolean True if we need also BODYSTRUCTURE in headers * @return object Message headers representation */ - function get_headers($id, $mbox_name=NULL, $is_uid=TRUE) + function get_headers($id, $mbox_name=NULL, $is_uid=TRUE, $bodystr=FALSE) { $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox; $uid = $is_uid ? $id : $this->_id2uid($id); @@ -1058,7 +1059,7 @@ class rcube_imap if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid))) return $headers; - $headers = iil_C_FetchHeader($this->conn, $mailbox, $id, $is_uid); + $headers = iil_C_FetchHeader($this->conn, $mailbox, $id, $is_uid, $bodystr); // write headers cache if ($headers) @@ -1078,9 +1079,10 @@ class rcube_imap * an object structure similar to the one generated by PEAR::Mail_mimeDecode * * @param int Message UID to fetch + * @param string Message BODYSTRUCTURE string (optional) * @return object rcube_message_part Message part tree or False on failure */ - function &get_structure($uid) + function &get_structure($uid, $structure_str='') { $cache_key = $this->mailbox.'.msg'; $headers = &$this->get_cached_message($cache_key, $uid, true); @@ -1095,7 +1097,8 @@ class rcube_imap return FALSE; } - $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); + if (!$structure_str) + $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); $structure = iml_GetRawStructureArray($structure_str); $struct = false; @@ -1130,7 +1133,7 @@ class rcube_imap * * @access private */ - function &_structure_part($part, $count=0, $parent='') + function &_structure_part($part, $count=0, $parent='', $raw_headers=null) { $struct = new rcube_message_part; $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count"; @@ -1150,11 +1153,25 @@ class rcube_imap $struct->mimetype = 'multipart/'.$struct->ctype_secondary; + // build parts list for headers pre-fetching + for ($i=0, $count=0; $i 3) + // fetch message headers if message/rfc822 or named part (could contain Content-Location header) + if (strtolower($part[$i][0]) == 'message' || + (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL'))) { + $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.$i+1 : $i+1; + } + + // pre-fetch headers of all parts (in one command for better performance) + if ($part_headers) + $part_headers = iil_C_FetchMIMEHeaders($this->conn, $this->mailbox, $this->_msg_id, $part_headers); + $struct->parts = array(); for ($i=0, $count=0; $i 3) - $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id); - + $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id, + $part_headers[$struct->mime_id ? $struck->mime_id.'.'.$i+1 : $i+1]); + return $struct; } @@ -1219,8 +1236,9 @@ class rcube_imap // fetch message headers if message/rfc822 or named part (could contain Content-Location header) if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) { - $part_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id); - $struct->headers = $this->_parse_headers($part_headers) + $struct->headers; + if (empty($raw_headers)) + $raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id); + $struct->headers = $this->_parse_headers($raw_headers) + $struct->headers; } if ($struct->ctype_primary=='message') { @@ -2341,7 +2359,7 @@ class rcube_imap { if (empty($key) || !is_object($headers) || empty($headers->uid)) return; - + // add to internal (fast) cache $this->cache['__single_msg'][$headers->uid] = $headers; $this->cache['__single_msg'][$headers->uid]->structure = $struct; -- cgit v1.2.3