Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Wurst <ChristophWurst@users.noreply.github.com>2016-06-16 15:46:47 +0300
committerGitHub <noreply@github.com>2016-06-16 15:46:47 +0300
commit9ab88c145b95a99ea343f8b39793d934ed56d446 (patch)
treef00edb14cf1fa59666d76b6b11233a085f9a1a7b
parenta923838536afc7e896b87dd287d1d6ebdedae218 (diff)
parent8498a528e8d893901198baa19120cbc95dbdb1d1 (diff)
Merge pull request #1486 from owncloud/alternative-fetch-strategyv0.5.2
fetch UIDs and DATEs of all messages and do the pagination client side
-rw-r--r--lib/mailbox.php38
1 files changed, 34 insertions, 4 deletions
diff --git a/lib/mailbox.php b/lib/mailbox.php
index 7ae036982..55dbc16d7 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,39 @@ 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();
+
+ $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 (!$this->conn->capability->query('SORT') && (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 +296,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,