From efe93ad11610fcfd42c76a1cdddb07be00f8cf1b Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Mon, 19 Oct 2009 03:47:10 -0400 Subject: [PATCH] - fix message cache clearing when folder is empty + small max() warning fix --- program/include/rcube_imap.php | 79 +++++++++++++++++++++------------------ 1 files changed, 42 insertions(+), 37 deletions(-) diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 96a4a65..31156e4 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -112,7 +112,7 @@ $ICL_PORT = $port; $IMAP_USE_INTERNAL_DATE = false; - + $attempt = 0; do { $data = rcmail::get_instance()->plugins->exec_hook('imap_connect', array('host' => $host, 'user' => $user, 'attempt' => ++$attempt)); @@ -144,13 +144,13 @@ // get server properties if ($this->conn) { - if (!empty($this->conn->delimiter)) - $this->delimiter = $this->conn->delimiter; if (!empty($this->conn->rootdir)) { $this->set_rootdir($this->conn->rootdir); $this->root_ns = preg_replace('/[.\/]$/', '', $this->conn->rootdir); } + if (empty($this->delimiter)) + $this->get_hierarchy_delimiter(); } return $this->conn ? TRUE : FALSE; @@ -485,7 +485,6 @@ */ private function _messagecount($mailbox='', $mode='ALL', $force=FALSE) { - $a_mailbox_cache = FALSE; $mode = strtoupper($mode); if (empty($mailbox)) @@ -603,21 +602,24 @@ if ($this->index_sort && $this->sort_field == 'date') { if ($this->skip_deleted) { - $msg_index = $this->_search_index($mailbox, 'ALL'); - $max = max($msg_index); - list($begin, $end) = $this->_get_message_range(count($msg_index), $page); - $msg_index = array_slice($msg_index, $begin, $end-$begin); + // @TODO: this could be cached + if ($msg_index = $this->_search_index($mailbox, 'ALL UNDELETED')) { + $max = max($msg_index); + list($begin, $end) = $this->_get_message_range(count($msg_index), $page); + $msg_index = array_slice($msg_index, $begin, $end-$begin); + } } else if ($max = iil_C_CountMessages($this->conn, $mailbox)) { list($begin, $end) = $this->_get_message_range($max, $page); $msg_index = range($begin+1, $end); } else - return array(); + $msg_index = array(); if ($slice) $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice); // fetch reqested headers from server - $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key); + if ($msg_index) + $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key); } // use SORT command else if ($this->get_capability('sort') && ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : ''))) @@ -633,13 +635,8 @@ $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key); } // fetch specified header for all messages and sort - else + else if ($a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted)) { - $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted); - - if (empty($a_index)) - return array(); - asort($a_index); // ASC $msg_index = array_keys($a_index); $max = max($msg_index); @@ -1226,6 +1223,16 @@ else $this->struct_charset = $this->_structure_charset($structure); + // Here we can recognize malformed BODYSTRUCTURE and + // 1. [@TODO] parse the message in other way to create our own message structure + // 2. or just show the raw message body. + // Example of structure for malformed MIME message: + // ("text" "plain" ("charset" "us-ascii") NIL NIL "7bit" 2154 70 NIL NIL NIL) + if ($headers->ctype && $headers->ctype != 'text/plain' + && $structure[0] == 'text' && $structure[1] == 'plain') { + return false; + } + $struct = &$this->_structure_part($structure); $struct->headers = get_object_vars($headers); @@ -1543,7 +1550,7 @@ // convert charset (if text or message part) if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') { // assume default if no charset specified - if (empty($o_part->charset)) + if (empty($o_part->charset) || strtolower($o_part->charset) == 'us-ascii') $o_part->charset = $this->default_charset; $body = rcube_charset_convert($body, $o_part->charset); @@ -2140,8 +2147,8 @@ */ function get_cache($key) { - // read cache - if (!isset($this->cache[$key]) && $this->caching_enabled) + // read cache (if it was not read before) + if (!count($this->cache) && $this->caching_enabled) { return $this->_read_cache_record($key); } @@ -2218,7 +2225,8 @@ { $sql_key = preg_replace('/^IMAP\./', '', $sql_arr['cache_key']); $this->cache_keys[$sql_key] = $sql_arr['cache_id']; - $this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE; + if (!isset($this->cache[$sql_key])) + $this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE; } } @@ -2232,23 +2240,6 @@ { if (!$this->db) return FALSE; - - // check if we already have a cache entry for this key - if (!isset($this->cache_keys[$key])) - { - $sql_result = $this->db->query( - "SELECT cache_id - FROM ".get_table_name('cache')." - WHERE user_id=? - AND cache_key=?", - $_SESSION['user_id'], - 'IMAP.'.$key); - - if ($sql_arr = $this->db->fetch_assoc($sql_result)) - $this->cache_keys[$key] = $sql_arr['cache_id']; - else - $this->cache_keys[$key] = FALSE; - } // update existing cache record if ($this->cache_keys[$key]) @@ -2272,6 +2263,18 @@ $_SESSION['user_id'], 'IMAP.'.$key, $data); + + // get cache entry ID for this key + $sql_result = $this->db->query( + "SELECT cache_id + FROM ".get_table_name('cache')." + WHERE user_id=? + AND cache_key=?", + $_SESSION['user_id'], + 'IMAP.'.$key); + + if ($sql_arr = $this->db->fetch_assoc($sql_result)) + $this->cache_keys[$key] = $sql_arr['cache_id']; } } @@ -2286,6 +2289,8 @@ AND cache_key=?", $_SESSION['user_id'], 'IMAP.'.$key); + + unset($this->cache_keys[$key]); } -- Gitblit v1.9.1