| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 | <?php/** * Smarty Internal Plugin * * @package Smarty * @subpackage Cacher *//** * Cache Handler API * * @package Smarty * @subpackage Cacher * @author Rodney Rehm */abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource {    /**     * fetch cached content and its modification time from data source     *     * @param string $id         unique cache content identifier     * @param string $name       template name     * @param string $cache_id   cache id     * @param string $compile_id compile id     * @param string $content    cached content     * @param integer $mtime cache modification timestamp (epoch)     * @return void     */    protected abstract function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime);    /**     * Fetch cached content's modification timestamp from data source     *     * {@internal implementing this method is optional.     *  Only implement it if modification times can be accessed faster than loading the complete cached content.}}     *     * @param string $id         unique cache content identifier     * @param string $name       template name     * @param string $cache_id   cache id     * @param string $compile_id compile id     * @return integer|boolean timestamp (epoch) the template was modified, or false if not found     */    protected function fetchTimestamp($id, $name, $cache_id, $compile_id)    {        return null;    }    /**     * Save content to cache     *     * @param string       $id         unique cache content identifier     * @param string       $name       template name     * @param string       $cache_id   cache id     * @param string       $compile_id compile id     * @param integer|null $exp_time   seconds till expiration or null     * @param string $content content to cache     * @return boolean success     */    protected abstract function save($id, $name, $cache_id, $compile_id, $exp_time, $content);    /**     * Delete content from cache     *     * @param string       $name       template name     * @param string       $cache_id   cache id     * @param string       $compile_id compile id     * @param integer|null $exp_time   seconds till expiration time in seconds or null     * @return integer number of deleted caches     */    protected abstract function delete($name, $cache_id, $compile_id, $exp_time);    /**     * populate Cached Object with meta data from Resource     *     * @param Smarty_Template_Cached   $cached    cached object     * @param Smarty_Internal_Template $_template template object     * @return void     */    public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)    {        $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null;        $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w\|]+!', '_', $cached->compile_id) : null;        $cached->filepath = sha1($cached->source->filepath . $_cache_id . $_compile_id);        $this->populateTimestamp($cached);    }    /**     * populate Cached Object with timestamp and exists from Resource     *     * @param Smarty_Template_Cached $source cached object     * @return void     */    public function populateTimestamp(Smarty_Template_Cached $cached)    {        $mtime = $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id);        if ($mtime !== null) {            $cached->timestamp = $mtime;            $cached->exists = !!$cached->timestamp;            return;        }        $timestamp = null;        $this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content, $timestamp);        $cached->timestamp = isset($timestamp) ? $timestamp : false;        $cached->exists = !!$cached->timestamp;    }    /**     * Read the cached template and process the header     *     * @param Smarty_Internal_Template $_template template object     * @param Smarty_Template_Cached $cached cached object     * @return booelan true or false if the cached content does not exist     */    public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)    {        if (!$cached) {            $cached = $_template->cached;        }        $content = $cached->content ? $cached->content : null;        $timestamp = $cached->timestamp ? $cached->timestamp : null;        if ($content === null || !$timestamp) {            $this->fetch(                $_template->cached->filepath,                $_template->source->name,                $_template->cache_id,                $_template->compile_id,                $content,                $timestamp            );        }        if (isset($content)) {            $_smarty_tpl = $_template;            eval("?>" . $content);            return true;        }        return false;    }    /**     * Write the rendered template output to cache     *     * @param Smarty_Internal_Template $_template template object     * @param string                   $content   content to cache     * @return boolean success     */    public function writeCachedContent(Smarty_Internal_Template $_template, $content)    {        return $this->save(            $_template->cached->filepath,            $_template->source->name,            $_template->cache_id,            $_template->compile_id,            $_template->properties['cache_lifetime'],            $content        );    }    /**     * Empty cache     *     * @param Smarty  $smarty   Smarty object     * @param integer $exp_time expiration time (number of seconds, not timestamp)     * @return integer number of cache files deleted     */    public function clearAll(Smarty $smarty, $exp_time=null)    {        $this->cache = array();        return $this->delete(null, null, null, $exp_time);    }    /**     * Empty cache for a specific template     *     * @param Smarty  $smarty        Smarty object     * @param string  $resource_name template name     * @param string  $cache_id      cache id     * @param string  $compile_id    compile id     * @param integer $exp_time      expiration time (number of seconds, not timestamp)     * @return integer number of cache files deleted     */    public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)    {        $this->cache = array();        return $this->delete($resource_name, $cache_id, $compile_id, $exp_time);    }        /**     * Check is cache is locked for this template     *     * @param Smarty $smarty Smarty object     * @param Smarty_Template_Cached $cached cached object     * @return booelan true or false if cache is locked     */    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        $id = $cached->filepath;        $name = $cached->source->name . '.lock';                $mtime = $this->fetchTimestamp($id, $name, null, null);        if ($mtime === null) {            $this->fetch($id, $name, null, null, $content, $mtime);        }                return $mtime && time() - $mtime < $smarty->locking_timeout;    }    /**     * Lock cache for this template     *     * @param Smarty $smarty Smarty object     * @param Smarty_Template_Cached $cached cached object     */    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        $cached->is_locked = true;                $id = $cached->filepath;        $name = $cached->source->name . '.lock';        $this->save($id, $name, null, null, $smarty->locking_timeout, '');    }    /**     * Unlock cache for this template     *     * @param Smarty $smarty Smarty object     * @param Smarty_Template_Cached $cached cached object     */    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        $cached->is_locked = false;                $id = $cached->filepath;        $name = $cached->source->name . '.lock';        $this->delete($name, null, null, null);    }}?>
 |