summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2012-06-26 11:11:53 +0200
committerAleksander Machniak <alec@alec.pl>2012-06-26 11:11:53 +0200
commit7ab9c1775243217f3f6cb0717b1894a98303d04e (patch)
tree26dfb5b697344bcfa3bc97ba7e793bf26087ba7c
parentd86aa138d09c772f9506bf3c0ca2c65a8f33bdfa (diff)
Improve performance by skipping redundant ENABLE commands
-rw-r--r--program/include/rcube_imap_cache.php13
-rw-r--r--program/include/rcube_imap_generic.php27
2 files changed, 29 insertions, 11 deletions
diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php
index eb2df165f..fec651030 100644
--- a/program/include/rcube_imap_cache.php
+++ b/program/include/rcube_imap_cache.php
@@ -917,18 +917,17 @@ class rcube_imap_cache
return;
}
- // NOTE: make sure the mailbox isn't selected, before
- // enabling QRESYNC and invoking SELECT
- if ($this->imap->conn->selected !== null) {
- $this->imap->conn->close();
- }
-
// Enable QRESYNC
$res = $this->imap->conn->enable($qresync ? 'QRESYNC' : 'CONDSTORE');
- if (!is_array($res)) {
+ if ($res === false) {
return;
}
+ // Close mailbox if already selected to get most recent data
+ if ($this->imap->conn->selected == $mailbox) {
+ $this->imap->conn->close();
+ }
+
// Get mailbox data (UIDVALIDITY, HIGHESTMODSEQ, counters, etc.)
$mbox_data = $this->imap->folder_data($mailbox);
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index 959dd9fd0..197164dfe 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -1472,14 +1472,31 @@ class rcube_imap_generic
*/
function enable($extension)
{
- if (empty($extension))
+ if (empty($extension)) {
return false;
+ }
- if (!$this->hasCapability('ENABLE'))
+ if (!$this->hasCapability('ENABLE')) {
return false;
+ }
- if (!is_array($extension))
+ if (!is_array($extension)) {
$extension = array($extension);
+ }
+
+ if (!empty($this->extensions_enabled)) {
+ // check if all extensions are already enabled
+ $diff = array_diff($extension, $this->extensions_enabled);
+
+ if (empty($diff)) {
+ return $extension;
+ }
+
+ // Make sure the mailbox isn't selected, before enabling extension(s)
+ if ($this->selected !== null) {
+ $this->close();
+ }
+ }
list($code, $response) = $this->execute('ENABLE', $extension);
@@ -1487,7 +1504,9 @@ class rcube_imap_generic
$response = substr($response, 10); // remove prefix "* ENABLED "
$result = (array) $this->tokenizeResponse($response);
- return $result;
+ $this->extensions_enabled = array_unique(array_merge((array)$this->extensions_enabled, $result));
+
+ return $this->extensions_enabled;
}
return false;