summaryrefslogtreecommitdiff
path: root/program/include/rcube_imap.php
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2010-10-20 18:42:45 +0000
committeralecpl <alec@alec.pl>2010-10-20 18:42:45 +0000
commit659cf14cdd8862a126b775392d59727a5e8a790b (patch)
tree85fa5e0b0a4cccf5e0b0226ac6d0e2ffd7122857 /program/include/rcube_imap.php
parent710e2748498ed97e7086b0dc3c40f11b29aeec8f (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.php19
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 {