config = $config; // Set driver name $driver = 'Cache_'.ucfirst($this->config['driver']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', $this->config['driver'], get_class($this)); // Initialize the driver $this->driver = new $driver($this->config['params']); // Validate the driver if ( ! ($this->driver instanceof Cache_Driver)) throw new Kohana_Exception('core.driver_implements', $this->config['driver'], get_class($this), 'Cache_Driver'); Kohana::log('debug', 'Cache Library initialized'); if (self::$loaded !== TRUE) { $this->config['requests'] = (int) $this->config['requests']; if ($this->config['requests'] > 0 AND mt_rand(1, $this->config['requests']) === 1) { // Do garbage collection $this->driver->delete_expired(); Kohana::log('debug', 'Cache: Expired caches deleted.'); } // Cache has been loaded once self::$loaded = TRUE; } } /** * Fetches a cache by id. Non-string cache items are automatically * unserialized before the cache is returned. NULL is returned when * a cache item is not found. * * @param string cache id * @return mixed cached data or NULL */ public function get($id) { // Change slashes to colons $id = str_replace(array('/', '\\'), '=', $id); if ($data = $this->driver->get($id)) { if (substr($data, 0, 14) === '<{serialized}>') { // Data has been serialized, unserialize now $data = unserialize(substr($data, 14)); } } return $data; } /** * Fetches all of the caches for a given tag. An empty array will be * returned when no matching caches are found. * * @param string cache tag * @return array all cache items matching the tag */ public function find($tag) { if ($ids = $this->driver->find($tag)) { $data = array(); foreach ($ids as $id) { // Load each cache item and add it to the array if (($cache = $this->get($id)) !== NULL) { $data[$id] = $cache; } } return $data; } return array(); } /** * Set a cache item by id. Tags may also be added and a custom lifetime * can be set. Non-string data is automatically serialized. * * @param string unique cache id * @param mixed data to cache * @param array tags for this item * @param integer number of seconds until the cache expires * @return boolean */ function set($id, $data, $tags = NULL, $lifetime = NULL) { if (is_resource($data)) throw new Kohana_Exception('cache.resources'); // Change slashes to colons $id = str_replace(array('/', '\\'), '=', $id); if ( ! is_string($data)) { // Serialize all non-string data, so that types can be preserved $data = '<{serialized}>'.serialize($data); } // Make sure that tags is an array $tags = empty($tags) ? array() : (array) $tags; if ($lifetime === NULL) { // Get the default lifetime $lifetime = $this->config['lifetime']; } return $this->driver->set($id, $data, $tags, $lifetime); } /** * Delete a cache item by id. * * @param string cache id * @return boolean */ public function delete($id) { // Change slashes to colons $id = str_replace(array('/', '\\'), '=', $id); return $this->driver->delete($id); } /** * Delete all cache items with a given tag. * * @param string cache tag name * @return boolean */ public function delete_tag($tag) { return $this->driver->delete(FALSE, $tag); } /** * Delete ALL cache items items. * * @return boolean */ public function delete_all() { return $this->driver->delete(TRUE); } } // End Cache