From b76a3a69dbbb1ad846ed78fcae4212129970783f Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 10 May 2016 10:44:38 +0200 Subject: fetch UIDs and DATEs of all messages and do the pagination client side --- lib/mailbox.php | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/mailbox.php b/lib/mailbox.php index 7ae036982..e1216fdda 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -31,6 +31,8 @@ namespace OCA\Mail; use Horde_Imap_Client; +use Horde_Imap_Client_Exception; +use Horde_Imap_Client_Fetch_Query; use Horde_Imap_Client_Ids; use Horde_Imap_Client_Mailbox; use Horde_Imap_Client_Search_Query; @@ -88,7 +90,7 @@ class Mailbox implements IMailBox { $this->makeDisplayName(); } - public function getMessages($from = 0, $count = 2, $filter = '') { + private function getSearchIds($from, $count, $filter) { if ($filter instanceof Horde_Imap_Client_Search_Query) { $query = $filter; } else { @@ -105,11 +107,40 @@ class Mailbox implements IMailBox { if ($from >= 0 && $count >= 0) { $ids = array_slice($ids, $from, $count); } - $ids = new \Horde_Imap_Client_Ids($ids, false); + return new \Horde_Imap_Client_Ids($ids, false); + } + + private function getFetchIds($from, $count) { + $q = new Horde_Imap_Client_Fetch_Query(); + $q->uid(); + $q->imapDate(); + // FIXME: $q->headers('DATE', ['DATE']); could be a better option than the INTERNALDATE + + $result = $this->conn->fetch($this->mailBox, $q); + $uidMap = []; + foreach ($result as $r) { + $uidMap[$r->getUid()] = $r->getImapDate()->getTimeStamp(); + } + // sort by time + uasort($uidMap, function($a, $b) { + return $a < $b; + }); + if ($from >= 0 && $count >= 0) { + $uidMap = array_slice($uidMap, $from, $count, true); + } + return new \Horde_Imap_Client_Ids(array_keys($uidMap), false); + } + + public function getMessages($from = 0, $count = 2, $filter = '') { + if (is_null($filter) || $filter === '') { + $ids = $this->getFetchIds($from, $count); + } else { + $ids = $this->getSearchIds($from, $count, $filter); + } $headers = []; - $fetch_query = new \Horde_Imap_Client_Fetch_Query(); + $fetch_query = new Horde_Imap_Client_Fetch_Query(); $fetch_query->envelope(); $fetch_query->flags(); $fetch_query->size(); @@ -266,7 +297,7 @@ class Mailbox implements IMailBox { 'uidnext' => $status['uidnext'], 'delimiter' => $this->delimiter ]; - } catch (\Horde_Imap_Client_Exception $e) { + } catch (Horde_Imap_Client_Exception $e) { return [ 'id' => base64_encode($this->getFolderId()), 'parent' => null, -- cgit v1.2.3 From 8498a528e8d893901198baa19120cbc95dbdb1d1 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 14:08:05 +0200 Subject: use search strategy only if SORT is not supported --- lib/mailbox.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/mailbox.php b/lib/mailbox.php index e1216fdda..55dbc16d7 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -114,7 +114,6 @@ class Mailbox implements IMailBox { $q = new Horde_Imap_Client_Fetch_Query(); $q->uid(); $q->imapDate(); - // FIXME: $q->headers('DATE', ['DATE']); could be a better option than the INTERNALDATE $result = $this->conn->fetch($this->mailBox, $q); $uidMap = []; @@ -132,7 +131,7 @@ class Mailbox implements IMailBox { } public function getMessages($from = 0, $count = 2, $filter = '') { - if (is_null($filter) || $filter === '') { + if (!$this->conn->capability->query('SORT') && (is_null($filter) || $filter === '')) { $ids = $this->getFetchIds($from, $count); } else { $ids = $this->getSearchIds($from, $count, $filter); -- cgit v1.2.3