summaryrefslogtreecommitdiff
path: root/program/lib
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2013-10-15 11:44:34 +0200
committerThomas Bruederli <thomas@roundcube.net>2014-01-16 11:33:57 +0100
commitb6e24c6946606cd504d522451c36b6dc574fe75d (patch)
tree47c14c635e1ed60ca73c5fabae0d85a3065bb032 /program/lib
parent566747af00ae413c942a7c6702e24c044af36f17 (diff)
Minor improvements to threaded searching
Diffstat (limited to 'program/lib')
-rw-r--r--program/lib/Roundcube/rcube_imap.php8
-rw-r--r--program/lib/Roundcube/rcube_imap_search.php36
2 files changed, 26 insertions, 18 deletions
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index db94e7678..0cf34b2ca 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -969,7 +969,7 @@ class rcube_imap extends rcube_storage
$to = $from + $page_size;
// sort headers
- if (!$this->threading) {
+ if (!$this->threading && !empty($a_msg_headers)) {
$a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
}
@@ -1476,10 +1476,8 @@ class rcube_imap extends rcube_storage
new rcube_result_index; // trigger autoloader and make these classes available for threaded context
new rcube_result_thread;
- // connect IMAP
- if (!defined('PTHREADS_INHERIT_ALL')) {
- $this->check_connection();
- }
+ // connect IMAP to have all the required classes and settings loaded
+ $this->check_connection();
$searcher = new rcube_imap_search($this->options, $this->conn);
$results = $searcher->exec(
diff --git a/program/lib/Roundcube/rcube_imap_search.php b/program/lib/Roundcube/rcube_imap_search.php
index ed4face98..d82ec8a24 100644
--- a/program/lib/Roundcube/rcube_imap_search.php
+++ b/program/lib/Roundcube/rcube_imap_search.php
@@ -172,9 +172,9 @@ class rcube_imap_search_job extends Stackable
public function run()
{
- #trigger_error("Start search $this->folder", E_USER_NOTICE);
+ // trigger_error("Start search $this->folder", E_USER_NOTICE);
$this->result = $this->search_index();
- #trigger_error("End search $this->folder: " . $this->result->count(), E_USER_NOTICE);
+ // trigger_error("End search $this->folder: " . $this->result->count(), E_USER_NOTICE);
}
/**
@@ -182,6 +182,7 @@ class rcube_imap_search_job extends Stackable
*/
protected function search_index()
{
+ $pthreads = defined('PTHREADS_INHERIT_ALL');
$criteria = $this->search;
$charset = $this->charset;
@@ -216,6 +217,10 @@ class rcube_imap_search_job extends Stackable
rcube_imap::convert_criteria($criteria, $charset), true, 'US-ASCII');
}
+ // close IMAP connection again
+ if ($pthreads)
+ $imap->closeConnection();
+
return $threads;
}
@@ -228,21 +233,23 @@ class rcube_imap_search_job extends Stackable
$messages = $imap->sort($this->folder, $this->sort_field,
rcube_imap::convert_criteria($criteria, $charset), true, 'US-ASCII');
}
-
- if (!$messages->is_error()) {
- return $messages;
- }
}
- $messages = $imap->search($this->folder,
- ($charset && $charset != 'US-ASCII' ? "CHARSET $charset " : '') . $criteria, true);
-
- // Error, try with US-ASCII (some servers may support only US-ASCII)
- if ($messages->is_error() && $charset && $charset != 'US-ASCII') {
+ if (!$messages || !$messages->is_error()) {
$messages = $imap->search($this->folder,
- rcube_imap::convert_criteria($criteria, $charset), true);
+ ($charset && $charset != 'US-ASCII' ? "CHARSET $charset " : '') . $criteria, true);
+
+ // Error, try with US-ASCII (some servers may support only US-ASCII)
+ if ($messages->is_error() && $charset && $charset != 'US-ASCII') {
+ $messages = $imap->search($this->folder,
+ rcube_imap::convert_criteria($criteria, $charset), true);
+ }
}
+ // close IMAP connection again
+ if ($pthreads)
+ $imap->closeConnection();
+
return $messages;
}
@@ -279,6 +286,8 @@ class rcube_imap_search_worker extends Worker
*/
public function __construct($id, $options)
{
+ $options['ident']['command'] = 'search-'.$id;
+
$this->id = $id;
$this->options = $options;
}
@@ -296,11 +305,12 @@ class rcube_imap_search_worker extends Worker
# $conn->setDebug(true, function($conn, $message){ trigger_error($message, E_USER_NOTICE); });
if ($this->options['user'] && $this->options['password']) {
+ // TODO: do this synchronized to avoid warnings like "Only one Id allowed in non-authenticated state"
$conn->connect($this->options['host'], $this->options['user'], $this->options['password'], $this->options);
}
if ($conn->error)
- trigger_error($this->conn->error, E_USER_WARNING);
+ trigger_error($conn->error, E_USER_WARNING);
#$this->conn = $conn;
return $conn;