From 3aba794f70e9ddf5223d1c9c6f6f51856cdec13b Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Thu, 30 Apr 2015 13:44:45 -0400 Subject: [PATCH] Fix bug where messages count was not updated after message move/delete with skip_deleted=false (#1490372) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_imap_generic.php | 39 ++++++++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 67833f5..71ec2d3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,6 +8,7 @@ - Fix missing or not up-to-date CATEGORIES entry in vCard export (#1490277) - Fix duplicate entry on timezones list in rcube_config::timezone_name_from_abbr() (#1490293) - Fix handling of %-encoded entities in mailto: URLs (#1490346) +- Fix bug where messages count was not updated after message move/delete with skip_deleted=false (#1490372) RELEASE 1.0.5 ------------- diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index efdf087..67a1522 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -1146,7 +1146,7 @@ } // Clear internal status cache - unset($this->data['STATUS:'.$mailbox]); + $this->clear_status_cache($mailbox); if (!empty($messages) && $messages != '*' && $this->hasCapability('UIDPLUS')) { $messages = self::compressMessageSet($messages); @@ -1425,13 +1425,9 @@ * * @return int Number of messages, False on error */ - function countMessages($mailbox, $refresh = false) + function countMessages($mailbox) { - if ($refresh) { - $this->selected = null; - } - - if ($this->selected === $mailbox) { + if ($this->selected === $mailbox && isset($this->data['EXISTS'])) { return $this->data['EXISTS']; } @@ -1459,14 +1455,20 @@ */ function countRecent($mailbox) { - if (!strlen($mailbox)) { - $mailbox = 'INBOX'; + if ($this->selected === $mailbox && isset($this->data['RECENT'])) { + return $this->data['RECENT']; } - $this->select($mailbox); + // Check internal cache + $cache = $this->data['STATUS:'.$mailbox]; + if (!empty($cache) && isset($cache['RECENT'])) { + return (int) $cache['RECENT']; + } - if ($this->selected === $mailbox) { - return $this->data['RECENT']; + // Try STATUS (should be faster than SELECT) + $counts = $this->status($mailbox, array('RECENT')); + if (is_array($counts)) { + return (int) $counts['RECENT']; } return false; @@ -2085,7 +2087,7 @@ // Clear internal status cache unset($this->data['STATUS:'.$to]); - unset($this->data['STATUS:'.$from]); + $this->clear_status_cache($from); $result = $this->execute('UID MOVE', array( $this->compressMessageSet($messages), $this->escape($to)), @@ -3720,6 +3722,17 @@ } /** + * Clear internal status cache + */ + protected function clear_status_cache($mailbox) + { + unset($this->data['STATUS:' . $mailbox]); + unset($this->data['EXISTS']); + unset($this->data['RECENT']); + unset($this->data['UNSEEN']); + } + + /** * Converts flags array into string for inclusion in IMAP command * * @param array $flags Flags (see self::flags) -- Gitblit v1.9.1