diff options
author | alecpl <alec@alec.pl> | 2010-10-20 18:42:45 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2010-10-20 18:42:45 +0000 |
commit | 659cf14cdd8862a126b775392d59727a5e8a790b (patch) | |
tree | 85fa5e0b0a4cccf5e0b0226ac6d0e2ffd7122857 /program/include/rcube_imap.php | |
parent | 710e2748498ed97e7086b0dc3c40f11b29aeec8f (diff) |
- Improve performance of messages counting using ESEARCH extension (RFC4731)
Diffstat (limited to 'program/include/rcube_imap.php')
-rw-r--r-- | program/include/rcube_imap.php | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 5d90fe41f..4bf7cac88 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -539,19 +539,26 @@ class rcube_imap // use SEARCH for message counting else if ($this->skip_deleted) { $search_str = "ALL UNDELETED"; + $keys = array('COUNT'); + $need_uid = false; - // get message count and store in cache - if ($mode == 'UNSEEN') + if ($mode == 'UNSEEN') { $search_str .= " UNSEEN"; - // get message count using SEARCH + } + else if ($status) { + $keys[] = 'MAX'; + $need_uid = true; + } + + // get message count using (E)SEARCH // not very performant but more precise (using UNDELETED) - $index = $this->conn->search($mailbox, $search_str); + $index = $this->conn->search($mailbox, $search_str, $need_uid, $keys); - $count = is_array($index) ? count($index) : 0; + $count = is_array($index) ? $index['COUNT'] : 0; if ($mode == 'ALL' && $status) { $this->set_folder_stats($mailbox, 'cnt', $count); - $this->set_folder_stats($mailbox, 'maxuid', $index ? $this->_id2uid(max($index), $mailbox) : 0); + $this->set_folder_stats($mailbox, 'maxuid', is_array($index) ? $index['MAX'] : 0); } } else { |