summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2008-11-07 14:32:16 +0000
committeralecpl <alec@alec.pl>2008-11-07 14:32:16 +0000
commite0c9741ef550f36706888dee124700bae4f7dbfc (patch)
tree77e4abd79ed8128e565a6f1ee1eff0358a81eb74
parent68af648117f563311c717b5a086df0ae2e5c538f (diff)
- improve messages searching with many criterias (call one SEARCH command)
-rw-r--r--CHANGELOG1
-rw-r--r--program/include/rcube_imap.php49
2 files changed, 23 insertions, 27 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 230f3849c..051a947e6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ CHANGELOG RoundCube Webmail
2008/11/06 (alec)
----------
- Fix empty file sending (#1485389)
+- Improved searching with many criterias (calling one SEARCH command)
2008/11/05 (alec)
----------
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 7a8b00c1c..b0a6ed9d4 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -285,10 +285,10 @@ class rcube_imap
* @param string Search string
* @param array List of message ids or NULL if empty
*/
- function set_search_set($subject, $str=null, $msgs=null, $charset=null)
+ function set_search_set($subject, $str=null, $msgs=null, $charset=null, $sorted=null)
{
if (is_array($subject) && $str == null && $msgs == null)
- list($subject, $str, $msgs, $charset) = $subject;
+ list($subject, $str, $msgs, $charset, $sorted) = $subject;
if ($msgs != null && !is_array($msgs))
$msgs = split(',', $msgs);
@@ -900,33 +900,27 @@ class rcube_imap
function search($mbox_name='', $criteria='ALL', $str=NULL, $charset=NULL)
{
$mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+ $search = '';
- // have an array of criterias => execute multiple searches
- if (is_array($criteria) && $str)
- {
- $results = array();
- foreach ($criteria as $crit)
- if ($search_result = $this->search($mbox_name, $crit, $str, $charset))
- $results = array_merge($results, $search_result);
-
- $results = array_unique($results);
- $this->set_search_set($criteria, $str, $results, $charset);
- return $results;
- }
- else if ($str && $criteria)
- {
- $search = (!empty($charset) ? "CHARSET $charset " : '') . sprintf("%s {%d}\r\n%s", $criteria, strlen($str), $str);
- $results = $this->_search_index($mailbox, $search);
+ // have an array of criterias => create search string
+ if (is_array($criteria))
+ $search .= 'OR';
- // try search with ISO charset (should be supported by server)
- if (empty($results) && !empty($charset) && $charset!='ISO-8859-1')
- $results = $this->search($mbox_name, $criteria, rcube_charset_convert($str, $charset, 'ISO-8859-1'), 'ISO-8859-1');
-
- $this->set_search_set($criteria, $str, $results, $charset);
- return $results;
- }
- else
- return $this->_search_index($mailbox, $criteria);
+ $criteria = (array) $criteria;
+ foreach($criteria as $idx => $crit)
+ if ($str)
+ $search .= sprintf(" (%s {%d}\r\n%s)", $crit, strlen($str), $str);
+ else
+ $search .= '('. $crit .')';
+
+ $results = $this->_search_index($mailbox, (!empty($charset) ? "CHARSET $charset " : '') . $search);
+
+ // try search with ISO charset (should be supported by server)
+ if (empty($results) && !empty($charset) && $charset!='ISO-8859-1')
+ $results = $this->search($mbox_name, $criteria, rcube_charset_convert($str, $charset, 'ISO-8859-1'), 'ISO-8859-1');
+
+ $this->set_search_set($criteria, $str, $results, $charset);
+ return $results;
}
@@ -940,6 +934,7 @@ class rcube_imap
function _search_index($mailbox, $criteria='ALL')
{
$a_messages = iil_C_Search($this->conn, $mailbox, $criteria);
+
// clean message list (there might be some empty entries)
if (is_array($a_messages))
{