summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2009-09-12 13:27:59 +0000
committeralecpl <alec@alec.pl>2009-09-12 13:27:59 +0000
commit59395e7e36995ea8a39a09136ab29961e97fd2fc (patch)
treea109b92944b8783b83a0a8f68399993508c655a6
parentfafe5dce9e98c657cba6b9cb1c9068fcbaaf35cb (diff)
- Fix DB constraint violation when populating messages cache (#1486052)
-rw-r--r--CHANGELOG1
-rw-r--r--program/include/rcube_imap.php30
2 files changed, 17 insertions, 14 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 7dd9f224b..45753a024 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 6e7703a9d..2d4792c8d 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -809,12 +809,16 @@ class rcube_imap
// 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 @@ class rcube_imap
/**
* @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 @@ class rcube_imap
$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);
}
/**