Skip to content
This repository was archived by the owner on Nov 8, 2018. It is now read-only.

Commit 9ab88c1

Browse files
Merge pull request #1486 from owncloud/alternative-fetch-strategy
fetch UIDs and DATEs of all messages and do the pagination client side
2 parents a923838 + 8498a52 commit 9ab88c1

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

lib/mailbox.php

+34-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
namespace OCA\Mail;
3232

3333
use Horde_Imap_Client;
34+
use Horde_Imap_Client_Exception;
35+
use Horde_Imap_Client_Fetch_Query;
3436
use Horde_Imap_Client_Ids;
3537
use Horde_Imap_Client_Mailbox;
3638
use Horde_Imap_Client_Search_Query;
@@ -88,7 +90,7 @@ public function __construct($conn, $mailBox, $attributes, $delimiter='/') {
8890
$this->makeDisplayName();
8991
}
9092

91-
public function getMessages($from = 0, $count = 2, $filter = '') {
93+
private function getSearchIds($from, $count, $filter) {
9294
if ($filter instanceof Horde_Imap_Client_Search_Query) {
9395
$query = $filter;
9496
} else {
@@ -105,11 +107,39 @@ public function getMessages($from = 0, $count = 2, $filter = '') {
105107
if ($from >= 0 && $count >= 0) {
106108
$ids = array_slice($ids, $from, $count);
107109
}
108-
$ids = new \Horde_Imap_Client_Ids($ids, false);
110+
return new \Horde_Imap_Client_Ids($ids, false);
111+
}
112+
113+
private function getFetchIds($from, $count) {
114+
$q = new Horde_Imap_Client_Fetch_Query();
115+
$q->uid();
116+
$q->imapDate();
117+
118+
$result = $this->conn->fetch($this->mailBox, $q);
119+
$uidMap = [];
120+
foreach ($result as $r) {
121+
$uidMap[$r->getUid()] = $r->getImapDate()->getTimeStamp();
122+
}
123+
// sort by time
124+
uasort($uidMap, function($a, $b) {
125+
return $a < $b;
126+
});
127+
if ($from >= 0 && $count >= 0) {
128+
$uidMap = array_slice($uidMap, $from, $count, true);
129+
}
130+
return new \Horde_Imap_Client_Ids(array_keys($uidMap), false);
131+
}
132+
133+
public function getMessages($from = 0, $count = 2, $filter = '') {
134+
if (!$this->conn->capability->query('SORT') && (is_null($filter) || $filter === '')) {
135+
$ids = $this->getFetchIds($from, $count);
136+
} else {
137+
$ids = $this->getSearchIds($from, $count, $filter);
138+
}
109139

110140
$headers = [];
111141

112-
$fetch_query = new \Horde_Imap_Client_Fetch_Query();
142+
$fetch_query = new Horde_Imap_Client_Fetch_Query();
113143
$fetch_query->envelope();
114144
$fetch_query->flags();
115145
$fetch_query->size();
@@ -266,7 +296,7 @@ public function getListArray($accountId, $status = null) {
266296
'uidnext' => $status['uidnext'],
267297
'delimiter' => $this->delimiter
268298
];
269-
} catch (\Horde_Imap_Client_Exception $e) {
299+
} catch (Horde_Imap_Client_Exception $e) {
270300
return [
271301
'id' => base64_encode($this->getFolderId()),
272302
'parent' => null,

0 commit comments

Comments
 (0)