- more preformance improvements of messages caching + some code refactoring

release-0.6
alecpl 16 years ago
parent ad84f9c06c
commit b32cb21a7d

@ -1545,9 +1545,9 @@ class rcube_imap
$result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag);
// reload message headers if cached
$cache_key = $mailbox.'.msg';
if ($this->caching_enabled)
{
$cache_key = $mailbox.'.msg';
$this->remove_message_cache($cache_key, $uids);
// close and re-open connection
@ -1647,18 +1647,9 @@ class rcube_imap
}
// update cached message headers
$cache_key = $from_mbox.'.msg';
if ($moved && ($a_cache_index = $this->get_message_cache_index($cache_key)))
{
$start_index = 100000;
foreach ($a_uids as $uid)
{
if (($index = array_search($uid, $a_cache_index)) !== FALSE)
$start_index = min($index, $start_index);
}
if ($moved && $start_index = $this->get_message_cache_index_min($cache_key, $a_uids)) {
// clear cache from the lowest index on
if ($start_index < 100000)
$this->clear_message_cache($cache_key, $start_index);
$this->clear_message_cache($cache_key, $start_index);
}
return $moved;
@ -1703,18 +1694,9 @@ class rcube_imap
// remove deleted messages from cache
$cache_key = $mailbox.'.msg';
if ($deleted && ($a_cache_index = $this->get_message_cache_index($cache_key)))
{
$start_index = 100000;
foreach ($a_uids as $uid)
{
if (($index = array_search($uid, $a_cache_index)) !== FALSE)
$start_index = min($index, $start_index);
}
if ($deleted && $start_index = $this->get_message_cache_index_min($cache_key, $a_uids)) {
// clear cache from the lowest index on
if ($start_index < 100000)
$this->clear_message_cache($cache_key, $start_index);
$this->clear_message_cache($cache_key, $start_index);
}
return $deleted;
@ -2059,8 +2041,7 @@ class rcube_imap
// read cache
if (!isset($this->cache[$key]) && $this->caching_enabled)
{
$cache_data = $this->_read_cache_record('IMAP.'.$key);
$this->cache[$key] = strlen($cache_data) ? unserialize($cache_data) : FALSE;
return $this->_read_cache_record($key);
}
return $this->cache[$key];
@ -2086,7 +2067,7 @@ class rcube_imap
foreach ($this->cache as $key => $data)
{
if ($this->cache_changes[$key])
$this->_write_cache_record('IMAP.'.$key, serialize($data));
$this->_write_cache_record($key, serialize($data));
}
}
}
@ -2102,7 +2083,7 @@ class rcube_imap
if ($key===NULL)
{
foreach ($this->cache as $key => $data)
$this->_clear_cache_record('IMAP.'.$key);
$this->_clear_cache_record($key);
$this->cache = array();
$this->cache_changed = FALSE;
@ -2110,7 +2091,7 @@ class rcube_imap
}
else
{
$this->_clear_cache_record('IMAP.'.$key);
$this->_clear_cache_record($key);
$this->cache_changes[$key] = FALSE;
unset($this->cache[$key]);
}
@ -2121,27 +2102,25 @@ class rcube_imap
*/
function _read_cache_record($key)
{
$cache_data = FALSE;
if ($this->db)
{
// get cached data from DB
$sql_result = $this->db->query(
"SELECT cache_id, data
"SELECT cache_id, data, cache_key
FROM ".get_table_name('cache')."
WHERE user_id=?
AND cache_key=?",
$_SESSION['user_id'],
$key);
AND cache_key LIKE 'IMAP.%'",
$_SESSION['user_id']);
if ($sql_arr = $this->db->fetch_assoc($sql_result))
while ($sql_arr = $this->db->fetch_assoc($sql_result))
{
$cache_data = $sql_arr['data'];
$this->cache_keys[$key] = $sql_arr['cache_id'];
$sql_key = preg_replace('/^IMAP\./', '', $sql_arr['cache_key']);
$this->cache_keys[$sql_key] = $sql_arr['cache_id'];
$this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE;
}
}
return $cache_data;
return $this->cache[$key];
}
/**
@ -2161,7 +2140,7 @@ class rcube_imap
WHERE user_id=?
AND cache_key=?",
$_SESSION['user_id'],
$key);
'IMAP.'.$key);
if ($sql_arr = $this->db->fetch_assoc($sql_result))
$this->cache_keys[$key] = $sql_arr['cache_id'];
@ -2179,7 +2158,7 @@ class rcube_imap
AND cache_key=?",
$data,
$_SESSION['user_id'],
$key);
'IMAP.'.$key);
}
// add new cache record
else
@ -2189,7 +2168,7 @@ class rcube_imap
(created, user_id, cache_key, data)
VALUES (".$this->db->now().", ?, ?, ?)",
$_SESSION['user_id'],
$key,
'IMAP.'.$key,
$data);
}
}
@ -2204,7 +2183,7 @@ class rcube_imap
WHERE user_id=?
AND cache_key=?",
$_SESSION['user_id'],
$key);
'IMAP.'.$key);
}
@ -2462,7 +2441,28 @@ class rcube_imap
$start_index);
}
/**
* @access private
*/
function get_message_cache_index_min($key, $uids=NULL)
{
if (!$this->caching_enabled)
return;
$sql_result = $this->db->query(
"SELECT MIN(idx) AS minidx
FROM ".get_table_name('messages')."
WHERE user_id=?
AND cache_key=?"
.(!empty($uids) ? " AND uid IN (".$this->db->array2list($uids, 'integer').")" : ''),
$_SESSION['user_id'],
$key);
if ($sql_arr = $this->db->fetch_assoc($sql_result))
return $sql_arr['minidx'];
else
return 0;
}
/* --------------------------------

Loading…
Cancel
Save