From e742744a53010c1a65eb07ea47c30b6ca72cecce Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 26 Jun 2012 15:44:57 +0200 Subject: Fixed index update when there are no cached messages for specified folder Improve performance of VANISHED messages handling - use one SQL query --- program/include/rcube_imap_cache.php | 110 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 57 deletions(-) (limited to 'program/include/rcube_imap_cache.php') 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']; -- cgit v1.2.3