summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2012-06-26 15:44:57 +0200
committerAleksander Machniak <alec@alec.pl>2012-06-26 15:44:57 +0200
commite742744a53010c1a65eb07ea47c30b6ca72cecce (patch)
tree6db69c9af5c3648405e9d0090543c996b86eb151
parent7ab9c1775243217f3f6cb0717b1894a98303d04e (diff)
Fixed index update when there are no cached messages for specified folder
Improve performance of VANISHED messages handling - use one SQL query
-rw-r--r--program/include/rcube_imap_cache.php110
1 files changed, 53 insertions, 57 deletions
diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php
index fec651030..530284a58 100644
--- a/program/include/rcube_imap_cache.php
+++ b/program/include/rcube_imap_cache.php
@@ -516,7 +516,6 @@ class rcube_imap_cache
.($uids !== null ? " AND uid IN (".$this->db->array2list((array)$uids, 'integer').")" : ""),
$this->userid, $mailbox);
}
-
}
@@ -951,8 +950,10 @@ class rcube_imap_cache
return;
}
- // Get known uids
- $uids = array();
+ $uids = array();
+ $removed = array();
+
+ // Get known UIDs
$sql_result = $this->db->query(
"SELECT uid"
." FROM ".$this->db->table_name('cache_messages')
@@ -961,74 +962,69 @@ class rcube_imap_cache
$this->userid, $mailbox);
while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
- $uids[] = $sql_arr['uid'];
- }
-
- // No messages in database, nothing to sync
- if (empty($uids)) {
- return;
- }
-
- // Get modified flags and vanished messages
- // UID FETCH 1:* (FLAGS) (CHANGEDSINCE 0123456789 VANISHED)
- $result = $this->imap->conn->fetch($mailbox,
- !empty($uids) ? $uids : '1:*', true, array('FLAGS'),
- $index['modseq'], $qresync);
-
- $invalidated = false;
-
- if (!empty($result)) {
- foreach ($result as $id => $msg) {
- $uid = $msg->uid;
- // Remove deleted message
- if ($this->skip_deleted && !empty($msg->flags['DELETED'])) {
- $this->remove_message($mailbox, $uid);
-
- if (!$invalidated) {
- $invalidated = true;
- // Invalidate thread indexes (?)
- $this->remove_thread($mailbox);
+ $uids[] = $sql_arr['uid'];
+ }
+
+ // Synchronize messages data
+ if (!empty($uids)) {
+ // Get modified flags and vanished messages
+ // UID FETCH 1:* (FLAGS) (CHANGEDSINCE 0123456789 VANISHED)
+ $result = $this->imap->conn->fetch($mailbox,
+ $uids, true, array('FLAGS'), $index['modseq'], $qresync);
+
+ if (!empty($result)) {
+ foreach ($result as $id => $msg) {
+ $uid = $msg->uid;
+ // Remove deleted message
+ if ($this->skip_deleted && !empty($msg->flags['DELETED'])) {
+ $removed[] = $uid;
// Invalidate index
$index['valid'] = false;
+ continue;
}
- continue;
- }
- $flags = 0;
- if (!empty($msg->flags)) {
- foreach ($this->flags as $idx => $flag)
- if (!empty($msg->flags[$flag]))
- $flags += $idx;
- }
+ $flags = 0;
+ if (!empty($msg->flags)) {
+ foreach ($this->flags as $idx => $flag) {
+ if (!empty($msg->flags[$flag])) {
+ $flags += $idx;
+ }
+ }
+ }
- $this->db->query(
- "UPDATE ".$this->db->table_name('cache_messages')
- ." SET flags = ?, changed = ".$this->db->now()
- ." WHERE user_id = ?"
- ." AND mailbox = ?"
- ." AND uid = ?"
- ." AND flags <> ?",
- $flags, $this->userid, $mailbox, $uid, $flags);
+ $this->db->query(
+ "UPDATE ".$this->db->table_name('cache_messages')
+ ." SET flags = ?, changed = ".$this->db->now()
+ ." WHERE user_id = ?"
+ ." AND mailbox = ?"
+ ." AND uid = ?"
+ ." AND flags <> ?",
+ $flags, $this->userid, $mailbox, $uid, $flags);
+ }
}
- }
- // Get VANISHED
- if ($qresync) {
- $mbox_data = $this->imap->folder_data($mailbox);
+ // VANISHED found?
+ if ($qresync) {
+ $mbox_data = $this->imap->folder_data($mailbox);
- // Removed messages
- if (!empty($mbox_data['VANISHED'])) {
+ // Removed messages found
$uids = rcube_imap_generic::uncompressMessageSet($mbox_data['VANISHED']);
if (!empty($uids)) {
- // remove messages from database
- $this->remove_message($mailbox, $uids);
-
- // Invalidate thread indexes (?)
- $this->remove_thread($mailbox);
+ $removed = array_merge($removed, $uids);
// Invalidate index
$index['valid'] = false;
}
}
+
+ // remove messages from database
+ if (!empty($removed)) {
+ $this->remove_message($mailbox, $removed);
+ }
+ }
+
+ // Invalidate thread index (?)
+ if (!$index['valid']) {
+ $this->remove_thread($mailbox);
}
$sort_field = $index['sort_field'];