From 9ae29c9525dbd878cff63d691625bb0c6f6cbf5c Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Fri, 29 Oct 2010 14:02:19 -0400 Subject: [PATCH] - Improve performance of message cache status checking when skip_disabled=true --- program/include/rcube_imap_generic.php | 32 +++++++++++++++++++++++--------- 1 files changed, 23 insertions(+), 9 deletions(-) diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index 5d16dc0..a7bfe05 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -1008,8 +1008,8 @@ } // message IDs - if (is_array($add)) - $add = $this->compressMessageSet(join(',', $add)); + if (!empty($add)) + $add = $this->compressMessageSet($add); list($code, $response) = $this->execute($is_uid ? 'UID SORT' : 'SORT', array("($field)", $encoding, 'ALL' . (!empty($add) ? ' '.$add : ''))); @@ -1026,7 +1026,7 @@ function fetchHeaderIndex($mailbox, $message_set, $index_field='', $skip_deleted=true, $uidfetch=false) { if (is_array($message_set)) { - if (!($message_set = $this->compressMessageSet(join(',', $message_set)))) + if (!($message_set = $this->compressMessageSet($message_set))) return false; } else { list($from_idx, $to_idx) = explode(':', $message_set); @@ -1150,12 +1150,12 @@ return $result; } - private function compressMessageSet($messages, $force=false) + static function compressMessageSet($messages, $force=false) { // given a comma delimited list of independent mid's, // compresses by grouping sequences together - if (!is_array($message_set)) { + if (!is_array($messages)) { // if less than 255 bytes long, let's not bother if (!$force && strlen($messages)<255) { return $messages; @@ -1197,6 +1197,23 @@ // return as comma separated string return implode(',', $result); + } + + static function uncompressMessageSet($messages) + { + $result = array(); + $messages = explode(',', $messages); + + foreach ($messages as $part) { + $items = explode(':', $part); + $max = max($items[0], $items[1]); + + for ($x=$items[0]; $x<=$max; $x++) { + $result[] = $x; + } + } + + return $result; } /** @@ -1264,9 +1281,6 @@ if (!$this->select($mailbox)) { return false; } - - if (is_array($message_set)) - $message_set = join(',', $message_set); $message_set = $this->compressMessageSet($message_set); @@ -1824,7 +1838,7 @@ if (in_array('MAX', $items)) $result['MAX'] = !empty($response) ? max($response) : 0; if (in_array('ALL', $items)) - $result['ALL'] = $this->compressMessageSet(implode(',', $response), true); + $result['ALL'] = $this->compressMessageSet($response, true); return $result; } -- Gitblit v1.9.1