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