thomascube
2012-02-21 fec2d8e1309d1f16f9cd772b82b28627d9359354
Refactored IMAP cache expunge: delegate to storage object; don't rely on deprecated 'enable_caching' config option

6 files modified
102 ■■■■■ changed files
program/include/main.inc 27 ●●●●● patch | view | raw | blame | history
program/include/rcmail.php 21 ●●●● patch | view | raw | blame | history
program/include/rcube_imap.php 17 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap_cache.php 21 ●●●●● patch | view | raw | blame | history
program/include/rcube_session.php 11 ●●●● patch | view | raw | blame | history
program/include/rcube_storage.php 5 ●●●●● patch | view | raw | blame | history
program/include/main.inc
@@ -158,33 +158,6 @@
}
/**
 * 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)
{
program/include/rcmail.php
@@ -129,6 +129,7 @@
  private $caches = array();
  private $action_map = array();
  private $shutdown_functions = array();
  private $expunge_cache = false;
  /**
@@ -767,8 +768,7 @@
    $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 @@
            $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)) {
@@ -1316,6 +1319,18 @@
  /**
   * 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
   *
   * @return string The request token
program/include/rcube_imap.php
@@ -3527,7 +3527,8 @@
    {
        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 @@
        }
    }
    /**
     * 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
program/include/rcube_imap_cache.php
@@ -599,6 +599,27 @@
    /**
     * 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
     */
    private function get_index_row($mailbox)
program/include/rcube_session.php
@@ -332,10 +332,15 @@
   *
   * @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;
  }
program/include/rcube_storage.php
@@ -971,6 +971,11 @@
     */
    abstract function get_cache($key);
    /**
     * Delete outdated cache entries
     */
    abstract function expunge_cache();
}  // end class rcube_storage