From 7ab9c1775243217f3f6cb0717b1894a98303d04e Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Tue, 26 Jun 2012 05:11:53 -0400
Subject: [PATCH] Improve performance by skipping redundant ENABLE commands

---
 program/include/rcube_imap_cache.php   |   13 ++++++-------
 program/include/rcube_imap_generic.php |   27 +++++++++++++++++++++++----
 2 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php
index eb2df16..fec6510 100644
--- a/program/include/rcube_imap_cache.php
+++ b/program/include/rcube_imap_cache.php
@@ -917,18 +917,17 @@
             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 959dd9f..197164d 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -1472,14 +1472,31 @@
      */
     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 @@
             $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;

--
Gitblit v1.9.1