From e48f8945b32ab5b67f1cdeb53a37d3d196e31e4d Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 20 May 2016 05:19:01 -0400
Subject: [PATCH] Fix bug where message list columns could be in wrong order after column drag-n-drop and list sorting
---
program/lib/Roundcube/rcube_cache_shared.php | 56 ++++++++++++++++++++++++++++++++++----------------------
1 files changed, 34 insertions(+), 22 deletions(-)
diff --git a/program/lib/Roundcube/rcube_cache_shared.php b/program/lib/Roundcube/rcube_cache_shared.php
index 3f0f20e..32ce4e8 100644
--- a/program/lib/Roundcube/rcube_cache_shared.php
+++ b/program/lib/Roundcube/rcube_cache_shared.php
@@ -161,7 +161,7 @@
// Remove all keys
if ($key === null) {
$this->cache = array();
- $this->cache_changed = false;
+ $this->cache_changed = true;
$this->cache_changes = array();
$this->cache_sums = array();
}
@@ -237,6 +237,9 @@
}
$this->write_index();
+
+ // reset internal cache index, thanks to this we can force index reload
+ $this->index = null;
}
@@ -255,7 +258,15 @@
}
if ($this->type != 'db') {
- if ($this->type == 'memcache') {
+ $this->load_index();
+
+ // Consistency check (#1490390)
+ if (!in_array($key, $this->index)) {
+ // we always check if the key exist in the index
+ // to have data in consistent state. Keeping the index consistent
+ // is needed for keys delete operation when we delete all keys or by prefix.
+ }
+ else if ($this->type == 'memcache') {
$data = $this->db->get($this->ckey($key));
}
else if ($this->type == 'apc') {
@@ -330,7 +341,15 @@
}
if ($this->type == 'memcache' || $this->type == 'apc') {
- return $this->add_record($this->ckey($key), $data);
+ $result = $this->add_record($this->ckey($key), $data);
+
+ // make sure index will be updated
+ if ($result && !array_key_exists($key, $this->cache_sums)) {
+ $this->cache_changed = true;
+ $this->cache_sums[$key] = true;
+ }
+
+ return $result;
}
$key_exists = array_key_exists($key, $this->cache_sums);
@@ -426,13 +445,12 @@
/**
* Adds entry into memcache/apc DB.
*
- * @param string $key Cache key name
- * @param mxied $data Serialized cache data
- * @param bollean $index Enables immediate index update
+ * @param string $key Cache key name
+ * @param mixed $data Serialized cache data
*
* @param boolean True on success, False on failure
*/
- private function add_record($key, $data, $index=false)
+ private function add_record($key, $data)
{
if ($this->type == 'memcache') {
$result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED, $this->ttl);
@@ -445,17 +463,6 @@
apc_delete($key);
}
$result = apc_store($key, $data, $this->ttl);
- }
-
- // Update index
- if ($index && $result) {
- $this->load_index();
-
- if (array_search($key, $this->index) === false) {
- $this->index[] = $key;
- $data = serialize($this->index);
- $this->add_record($this->ikey(), $data);
- }
}
return $result;
@@ -500,10 +507,15 @@
// Make sure index contains new keys
foreach ($this->cache as $key => $value) {
- if ($value !== null) {
- if (array_search($key, $this->index) === false) {
- $this->index[] = $key;
- }
+ if ($value !== null && !in_array($key, $this->index)) {
+ $this->index[] = $key;
+ }
+ }
+
+ // new keys added using self::write()
+ foreach ($this->cache_sums as $key => $value) {
+ if ($value === true && !in_array($key, $this->index)) {
+ $this->index[] = $key;
}
}
--
Gitblit v1.9.1