Aleksander Machniak
2012-08-09 23557f06d13f121a8483376dad1604eb30711a88
program/include/rcube_cache.php
@@ -19,9 +19,6 @@
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 | Author: Aleksander Machniak <alec@alec.pl>                            |
 +-----------------------------------------------------------------------+
 $Id$
*/
@@ -36,9 +33,9 @@
class rcube_cache
{
    /**
     * Instance of rcube_mdb2 or Memcache class
     * Instance of database handler
     *
     * @var rcube_mdb2/Memcache
     * @var rcube_db|Memcache|bool
     */
    private $db;
    private $type;
@@ -48,7 +45,6 @@
    private $packed;
    private $index;
    private $cache         = array();
    private $cache_keys    = array();
    private $cache_changes = array();
    private $cache_sums    = array();
@@ -59,19 +55,19 @@
     * @param string $type   Engine type ('db' or 'memcache' or 'apc')
     * @param int    $userid User identifier
     * @param string $prefix Key name prefix
     * @param int    $ttl    Expiration time of memcache/apc items in seconds (max.2592000)
     * @param string $ttl    Expiration time of memcache/apc items
     * @param bool   $packed Enables/disabled data serialization.
     *                       It's possible to disable data serialization if you're sure
     *                       stored data will be always a safe string
     */
    function __construct($type, $userid, $prefix='', $ttl=0, $packed=true)
    {
        $rcmail = rcube::get_instance();
        $type   = strtolower($type);
        $rcube = rcube::get_instance();
        $type  = strtolower($type);
        if ($type == 'memcache') {
            $this->type = 'memcache';
            $this->db   = $rcmail->get_memcache();
            $this->db   = $rcube->get_memcache();
        }
        else if ($type == 'apc') {
            $this->type = 'apc';
@@ -79,11 +75,15 @@
        }
        else {
            $this->type = 'db';
            $this->db   = $rcmail->get_dbh();
            $this->db   = $rcube->get_dbh();
        }
        // convert ttl string to seconds
        $ttl = get_offset_sec($ttl);
        if ($ttl > 2592000) $ttl = 2592000;
        $this->userid    = (int) $userid;
        $this->ttl       = (int) $ttl;
        $this->ttl       = $ttl;
        $this->packed    = $packed;
        $this->prefix    = $prefix;
    }
@@ -166,7 +166,7 @@
            $this->cache         = array();
            $this->cache_changed = false;
            $this->cache_changes = array();
            $this->cache_keys    = array();
            $this->cache_sums    = array();
        }
        // Remove keys by name prefix
        else if ($prefix_mode) {
@@ -174,7 +174,7 @@
                if (strpos($k, $key) === 0) {
                    $this->cache[$k] = null;
                    $this->cache_changes[$k] = false;
                    unset($this->cache_keys[$k]);
                    unset($this->cache_sums[$k]);
                }
            }
        }
@@ -182,7 +182,7 @@
        else {
            $this->cache[$key] = null;
            $this->cache_changes[$key] = false;
            unset($this->cache_keys[$key]);
            unset($this->cache_sums[$key]);
        }
        // Remove record(s) from the backend
@@ -273,7 +273,7 @@
        }
        else {
            $sql_result = $this->db->limitquery(
                "SELECT cache_id, data, cache_key".
                "SELECT data, cache_key".
                " FROM ".$this->db->table_name('cache').
                " WHERE user_id = ?".
                " AND cache_key = ?".
@@ -295,7 +295,6 @@
                $this->cache[$key]      = $data;
               $this->cache_sums[$key] = $md5sum;
                $this->cache_keys[$key] = $sql_arr['cache_id'];
            }
            else {
                $this->cache[$key] = null;
@@ -324,7 +323,7 @@
            return $this->add_record($this->ckey($key), $data);
        }
        $key_exists = $this->cache_keys[$key];
        $key_exists = array_key_exists($key, $this->cache_sums);
        $key        = $this->prefix . '.' . $key;
        // Remove NULL rows (here we don't need to check if the record exist)
@@ -464,10 +463,13 @@
     */
    private function delete_record($key, $index=true)
    {
        if ($this->type == 'memcache')
            $this->db->delete($this->ckey($key));
        else
        if ($this->type == 'memcache') {
            // #1488592: use 2nd argument
            $this->db->delete($this->ckey($key), 0);
        }
        else {
            apc_delete($this->ckey($key));
        }
        if ($index) {
            if (($idx = array_search($key, $this->index)) !== false) {