diff options
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | program/include/rcube_imap.php | 30 | ||||
-rw-r--r-- | program/include/rcube_imap_generic.php | 71 | ||||
-rw-r--r-- | program/steps/mail/mark.inc | 4 |
4 files changed, 48 insertions, 58 deletions
@@ -56,6 +56,7 @@ CHANGELOG Roundcube Webmail - Add SORT=DISPLAY support (RFC 5957) - Plugin API: add possibility to disable plugin in AJAX mode, 'noajax' property - Plugin API: add possibility to disable plugin in framed mode, 'noframe' property +- Improve performance of setting IMAP flags using .SILENT suffix RELEASE 0.4.2 ------------- diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 3fd9e1a31..d08554206 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -2353,7 +2353,7 @@ class rcube_imap * @param string $flag Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT * @param string $mbox_name Folder name * @param boolean $skip_cache True to skip message cache clean up - * @return int Number of flagged messages, -1 on failure + * @return boolean Operation status */ function set_flag($uids, $flag, $mbox_name=NULL, $skip_cache=false) { @@ -2367,7 +2367,7 @@ class rcube_imap else $result = $this->conn->flag($mailbox, $uids, $flag); - if ($result >= 0) { + if ($result) { // reload message headers if cached if ($this->caching_enabled && !$skip_cache) { $cache_key = $mailbox.'.msg'; @@ -2376,13 +2376,15 @@ class rcube_imap else $this->remove_message_cache($cache_key, explode(',', $uids)); } - // update counters - if ($flag=='SEEN') - $this->_set_messagecount($mailbox, 'UNSEEN', $result*(-1)); - else if ($flag=='UNSEEN') - $this->_set_messagecount($mailbox, 'UNSEEN', $result); - else if ($flag=='DELETED') - $this->_set_messagecount($mailbox, 'ALL', $result*(-1)); + + // clear cached counters + if ($flag == 'SEEN' || $flag == 'UNSEEN') { + $this->_clear_messagecount($mailbox, 'SEEN'); + $this->_clear_messagecount($mailbox, 'UNSEEN'); + } + else if ($flag == 'DELETED') { + $this->_clear_messagecount($mailbox, 'DELETED'); + } } return $result; @@ -4425,15 +4427,19 @@ class rcube_imap * Remove messagecount of a specific mailbox from cache * @access private */ - private function _clear_messagecount($mbox_name='') + private function _clear_messagecount($mbox_name='', $mode=null) { - $a_mailbox_cache = false; $mailbox = $mbox_name ? $mbox_name : $this->mailbox; $a_mailbox_cache = $this->get_cache('messagecount'); if (is_array($a_mailbox_cache[$mailbox])) { - unset($a_mailbox_cache[$mailbox]); + if ($mode) { + unset($a_mailbox_cache[$mailbox][$mode]); + } + else { + unset($a_mailbox_cache[$mailbox]); + } $this->update_cache('messagecount', $a_mailbox_cache); } } diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index 0383543a4..e9a5a2d44 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -1007,11 +1007,6 @@ class rcube_imap_generic return false; } - // RFC 5957: SORT=DISPLAY - if (($field == 'FROM' || $field == 'TO') && $this->getCapability('SORT=DISPLAY')) { - $field = 'DISPLAY' . $field; - } - // message IDs if (is_array($add)) $add = $this->compressMessageSet(join(',', $add)); @@ -1155,29 +1150,32 @@ class rcube_imap_generic return $result; } - private function compressMessageSet($message_set, $force=false) + private function compressMessageSet($messages, $force=false) { // given a comma delimited list of independent mid's, // compresses by grouping sequences together - // if less than 255 bytes long, let's not bother - if (!$force && strlen($message_set)<255) { - return $message_set; - } + if (!is_array($message_set)) { + // if less than 255 bytes long, let's not bother + if (!$force && strlen($messages)<255) { + return $messages; + } - // see if it's already been compressed - if (strpos($message_set, ':') !== false) { - return $message_set; - } + // see if it's already been compressed + if (strpos($messages, ':') !== false) { + return $messages; + } - // separate, then sort - $ids = explode(',', $message_set); - sort($ids); + // separate, then sort + $messages = explode(',', $messages); + } + + sort($messages); $result = array(); - $start = $prev = $ids[0]; + $start = $prev = $messages[0]; - foreach ($ids as $id) { + foreach ($messages as $id) { $incr = $id - $prev; if ($incr > 1) { //found a gap if ($start == $prev) { @@ -1191,7 +1189,7 @@ class rcube_imap_generic } // handle the last sequence/id - if ($start==$prev) { + if ($start == $prev) { $result[] = $prev; } else { $result[] = $start.':'.$prev; @@ -1587,35 +1585,19 @@ class rcube_imap_generic function modFlag($mailbox, $messages, $flag, $mod) { if ($mod != '+' && $mod != '-') { - return -1; + $mod = '+'; } - $flag = $this->flags[strtoupper($flag)]; - if (!$this->select($mailbox)) { - return -1; + return false; } - $c = 0; - $key = $this->next_tag(); - $command = "$key UID STORE $messages {$mod}FLAGS ($flag)"; - if (!$this->putLine($command)) { - $this->set_error(self::ERROR_COMMAND, "Unable to send command: $command"); - return -1; - } - - do { - $line = $this->readLine(); - if ($line[0] == '*') { - $c++; - } - } while (!$this->startsWith($line, $key, true, true)); - - if ($this->parseResult($line, 'STORE: ') == self::ERROR_OK) { - return $c; - } + $flag = $this->flags[strtoupper($flag)]; + $result = $this->execute('UID STORE', array( + $this->compressMessageSet($messages), $mod . 'FLAGS.SILENT', "($flag)"), + self::COMMAND_NORESPONSE); - return -1; + return ($result == self::ERROR_OK); } function flag($mailbox, $messages, $flag) { @@ -1640,7 +1622,8 @@ class rcube_imap_generic return -1; } - $result = $this->execute('UID COPY', array($messages, $this->escape($to)), + $result = $this->execute('UID COPY', array( + $this->compressMessageSet($messages), $this->escape($to)), self::COMMAND_NORESPONSE); return $result; diff --git a/program/steps/mail/mark.inc b/program/steps/mail/mark.inc index 9266cf404..57eae64e2 100644 --- a/program/steps/mail/mark.inc +++ b/program/steps/mail/mark.inc @@ -43,7 +43,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va $marked = $IMAP->set_flag($uids, $flag); - if ($marked == -1) { + if (!$marked) { // send error message if ($_POST['_from'] != 'show') $OUTPUT->command('list_mailbox'); @@ -56,7 +56,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va $ruids = get_input_value('_ruid', RCUBE_INPUT_POST); $read = $IMAP->set_flag($ruids, 'SEEN'); - if ($read != -1 && !$CONFIG['skip_deleted']) + if ($read && !$CONFIG['skip_deleted']) $OUTPUT->command('flag_deleted_as_read', $ruids); } |