From 59395e7e36995ea8a39a09136ab29961e97fd2fc Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 12 Sep 2009 09:27:59 -0400
Subject: [PATCH] - Fix DB constraint violation when populating messages cache (#1486052)

---
 CHANGELOG                      |    1 +
 program/include/rcube_imap.php |   30 ++++++++++++++++--------------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 7dd9f22..45753a0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix DB constraint violation when populating messages cache (#1486052)
 - Password: added password strength options (#1486062)
 - Fix LDAP partial result warning (#1485536)
 - Fix delete in message view deletes permanently with flag_for_deletion=true (#1486101)
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 6e7703a..2d4792c 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -809,12 +809,16 @@
       // cache is incomplete
       $cache_index = $this->get_message_cache_index($cache_key);
 
-      foreach ($a_header_index as $i => $headers)
-        { 
-        // add message to cache
+      foreach ($a_header_index as $i => $headers) {
         if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid) {
+	  // prevent index duplicates
+	  if ($cache_index[$headers->id]) {
+	    $this->remove_message_cache($cache_key, $headers->id, true);
+	    unset($cache_index[$headers->id]);
+	    }
+          // add message to cache
 	  $this->add_message_cache($cache_key, $headers->id, $headers, NULL,
-		!in_array($headers->uid, $cache_index));
+	    !in_array($headers->uid, $cache_index));
 	  }
 
         $a_msg_headers[$headers->uid] = $headers;
@@ -2430,16 +2434,16 @@
   /**
    * @access private
    */
-  private function remove_message_cache($key, $uids)
+  private function remove_message_cache($key, $ids, $idx=false)
     {
     if (!$this->caching_enabled)
       return;
     
     $this->db->query(
       "DELETE FROM ".get_table_name('messages')."
-      WHERE  user_id=?
-      AND    cache_key=?
-      AND    uid IN (".$this->db->array2list($uids, 'integer').")",
+      WHERE user_id=?
+      AND cache_key=?
+      AND ".($idx ? "idx" : "uid")." IN (".$this->db->array2list($ids, 'integer').")",
       $_SESSION['user_id'],
       $key);
     }
@@ -2454,12 +2458,10 @@
     
     $this->db->query(
       "DELETE FROM ".get_table_name('messages')."
-       WHERE  user_id=?
-       AND    cache_key=?
-       AND    idx>=?",
-      $_SESSION['user_id'],
-      $key,
-      $start_index);
+       WHERE user_id=?
+       AND cache_key=?
+       AND idx>=?",
+      $_SESSION['user_id'], $key, $start_index);
     }
 
   /**

--
Gitblit v1.9.1