Refactored IMAP cache expunge: delegate to storage object; don't rely on deprecated 'enable_caching' config option

pull/1/head
thomascube 13 years ago
parent 965e6276b3
commit fec2d8e130

@ -158,33 +158,6 @@ function rcmail_temp_gc()
}
/**
* Garbage collector for cache entries.
* Remove all expired message cache records
* @return void
*/
function rcmail_cache_gc()
{
$rcmail = rcmail::get_instance();
$db = $rcmail->get_dbh();
// get target timestamp
$ts = get_offset_time($rcmail->config->get('message_cache_lifetime', '30d'), -1);
$db->query("DELETE FROM ".get_table_name('cache_messages')
." WHERE changed < " . $db->fromunixtime($ts));
$db->query("DELETE FROM ".get_table_name('cache_index')
." WHERE changed < " . $db->fromunixtime($ts));
$db->query("DELETE FROM ".get_table_name('cache_thread')
." WHERE changed < " . $db->fromunixtime($ts));
$db->query("DELETE FROM ".get_table_name('cache')
." WHERE created < " . $db->fromunixtime($ts));
}
// Deprecated
function rcube_charset_convert($str, $from, $to=NULL)
{

@ -129,6 +129,7 @@ class rcmail
private $caches = array();
private $action_map = array();
private $shutdown_functions = array();
private $expunge_cache = false;
/**
@ -767,8 +768,7 @@ class rcmail
$this->session = new rcube_session($this->get_dbh(), $this->config);
$this->session->register_gc_handler('rcmail_temp_gc');
if ($this->config->get('enable_caching'))
$this->session->register_gc_handler('rcmail_cache_gc');
$this->session->register_gc_handler(array($this, 'cache_gc'));
// start PHP session (if not in CLI mode)
if ($_SERVER['REMOTE_ADDR'])
@ -1278,8 +1278,11 @@ class rcmail
$cache->close();
}
if (is_object($this->storage))
if (is_object($this->storage)) {
if ($this->expunge_cache)
$this->storage->expunge_cache();
$this->storage->close();
}
// before closing the database connection, write session data
if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) {
@ -1315,6 +1318,18 @@ class rcmail
}
/**
* Garbage collector for cache entries.
* Set flag to expunge caches on shutdown
*/
function cache_gc()
{
// because this gc function is called before storage is initialized,
// we just set a flag to expunge storage cache on shutdown.
$this->expunge_cache = true;
}
/**
* Generate a unique token to be used in a form request
*

@ -3527,7 +3527,8 @@ class rcube_imap extends rcube_storage
{
if ($this->caching && !$this->cache) {
$rcmail = rcmail::get_instance();
$this->cache = $rcmail->get_cache('IMAP', $this->caching);
$ttl = $rcmail->config->get('message_cache_lifetime', '10d') - mktime();
$this->cache = $rcmail->get_cache('IMAP', $this->caching, $ttl);
}
return $this->cache;
@ -3574,6 +3575,20 @@ class rcube_imap extends rcube_storage
}
}
/**
* Delete outdated cache entries
*/
public function expunge_cache()
{
if ($this->mcache) {
$ttl = rcmail::get_instance()->config->get('message_cache_lifetime', '10d');
$this->mcache->expunge($ttl);
}
if ($this->cache)
$this->cache->expunge();
}
/* --------------------------------
* message caching methods

@ -598,6 +598,27 @@ class rcube_imap_cache
}
/**
* Delete cache entries older than TTL
*
* @param string $ttl Lifetime of message cache entries
*/
function expunge($ttl)
{
// get expiration timestamp
$ts = get_offset_time($ttl, -1);
$this->db->query("DELETE FROM ".get_table_name('cache_messages')
." WHERE changed < " . $this->db->fromunixtime($ts));
$this->db->query("DELETE FROM ".get_table_name('cache_index')
." WHERE changed < " . $this->db->fromunixtime($ts));
$this->db->query("DELETE FROM ".get_table_name('cache_thread')
." WHERE changed < " . $this->db->fromunixtime($ts));
}
/**
* Fetches index data from database
*/

@ -332,10 +332,15 @@ class rcube_session
*
* @param mixed Callback function
*/
public function register_gc_handler($func_name)
public function register_gc_handler($func)
{
if ($func_name && !in_array($func_name, $this->gc_handlers))
$this->gc_handlers[] = $func_name;
foreach ($this->gc_handlers as $handler) {
if ($handler == $func) {
return;
}
}
$this->gc_handlers[] = $func;
}

@ -971,6 +971,11 @@ abstract class rcube_storage
*/
abstract function get_cache($key);
/**
* Delete outdated cache entries
*/
abstract function expunge_cache();
} // end class rcube_storage

Loading…
Cancel
Save