mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-06 19:34:27 +02:00
- added cache resource MYSQL plugin
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
11/27/2009
|
||||
- added cache resource MYSQL plugin
|
||||
|
||||
11/26/2009
|
||||
- bugfix on nested doublequoted strings
|
||||
- correct line number on unknown tag error message
|
||||
|
@@ -62,7 +62,7 @@ if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
|
||||
if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
|
||||
define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* define variable scopes
|
||||
*/
|
||||
@@ -167,7 +167,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
||||
// config var settings
|
||||
public $config_overwrite = true; //Controls whether variables with the same name overwrite each other.
|
||||
public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean
|
||||
public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.
|
||||
public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.
|
||||
// config vars
|
||||
public $config_vars = array();
|
||||
// assigned tpl vars
|
||||
@@ -181,9 +181,9 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
||||
// resource type used if none given
|
||||
public $default_resource_type = 'file';
|
||||
// caching type
|
||||
public $default_caching_type = 'file';
|
||||
public $caching_type = 'file';
|
||||
// internal cache resource types
|
||||
public $cache_resorce_types = array('file');
|
||||
public $cache_resource_types = array('file');
|
||||
// config type
|
||||
public $default_config_type = 'file';
|
||||
// class used for cacher
|
||||
@@ -331,7 +331,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
||||
* @param object $parent next higher level of Smarty variables
|
||||
*/
|
||||
public function display($template, $cache_id = null, $compile_id = null, $parent = null)
|
||||
{
|
||||
{
|
||||
// display template
|
||||
echo $this->fetch ($template, $cache_id, $compile_id, $parent);
|
||||
// debug output
|
||||
@@ -493,6 +493,34 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
||||
return set_exception_handler($handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads cache resource.
|
||||
*
|
||||
* @return object of cache resource
|
||||
*/
|
||||
public function loadCacheResource($type = null)
|
||||
{
|
||||
if (!isset($type)) {
|
||||
$type = $this->caching_type;
|
||||
}
|
||||
// already loaded?
|
||||
if (isset($this->cache_resource_objects[$type])) {
|
||||
return $this->cache_resource_objects[$type];
|
||||
}
|
||||
if (in_array($type, $this->cache_resource_types)) {
|
||||
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
|
||||
return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
|
||||
} else {
|
||||
// try plugins dir
|
||||
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
|
||||
if ($this->loadPlugin($cache_resource_class)) {
|
||||
return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
|
||||
} else {
|
||||
throw new Exception("Unable to load cache resource '{$type}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* trigger Smarty error
|
||||
*
|
||||
|
191
libs/plugins/cacheresource.mysql.php
Normal file
191
libs/plugins/cacheresource.mysql.php
Normal file
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Smarty Plugin CacheResource Mysql
|
||||
*
|
||||
* Implements MYSQL as resource for the HTML cache
|
||||
*
|
||||
* @package Smarty
|
||||
* @subpackage Plugins
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class does contain all necessary methods for the HTML cache on MYSQL system
|
||||
*/
|
||||
class Smarty_CacheResource_Mysql {
|
||||
// set db host, user and pass here
|
||||
public $db_host = 'localhost';
|
||||
public $db_user = 'root';
|
||||
public $db_pass = '';
|
||||
public $db_name = 'SMARTY';
|
||||
|
||||
function __construct($smarty)
|
||||
{
|
||||
$this->smarty = $smarty;
|
||||
if (!$this->link = mysql_pconnect($this->db_host, $this->db_user, $this->db_pass)) {
|
||||
throw new Exception("Cache resource unable to connect to MYSQL");
|
||||
}
|
||||
mysql_select_db($this->db_name, $this->link);
|
||||
}
|
||||
/**
|
||||
* Returns the filepath of the cached template output
|
||||
*
|
||||
* @param object $template current template
|
||||
* @return string the cache filepath
|
||||
*/
|
||||
public function getCachedFilepath($template)
|
||||
{
|
||||
return $this->buildCachedFilepath ($template->resource_name, $template->cache_id, $template->compile_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the timpestamp of the cached template output
|
||||
*
|
||||
* @param object $template current template
|
||||
* @return integer |booelan the template timestamp or false if the file does not exist
|
||||
*/
|
||||
public function getCachedTimestamp($template)
|
||||
{
|
||||
$Id = $template->getCachedFilepath();
|
||||
// read cache from database
|
||||
$results = mysql_query("select UNIX_TIMESTAMP(Timestamp) from SMARTY_CACHE where Id='$Id'", $this->link);
|
||||
if (!$results) {
|
||||
$this->mysqlError();
|
||||
}
|
||||
$row = mysql_fetch_row($results);
|
||||
return (int)$row[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the cached template output
|
||||
*
|
||||
* @param object $template current template
|
||||
* @return string |booelan the template content or false if the file does not exist
|
||||
*/
|
||||
public function getCachedContents($template)
|
||||
{
|
||||
$Id = $template->getCachedFilepath();
|
||||
// read cache from database
|
||||
$results = mysql_query("select CacheContents from SMARTY_CACHE where Id='$Id'", $this->link);
|
||||
if (!$results) {
|
||||
$this->mysqlError();
|
||||
}
|
||||
$row = mysql_fetch_row($results);
|
||||
|
||||
$cache_content = $row[0];
|
||||
|
||||
$_smarty_tpl = $template;
|
||||
ob_start();
|
||||
eval("?>" . $cache_content);
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the rendered template output to cache file
|
||||
*
|
||||
* @param object $template current template
|
||||
* @return boolean status
|
||||
*/
|
||||
public function writeCachedContent($template, $content)
|
||||
{
|
||||
if (!$template->isEvaluated()) {
|
||||
$_cache_id = isset($template->cache_id) ? preg_replace('![^\w\|]+!', '_', $template->cache_id) : null;
|
||||
$_compile_id = isset($template->compile_id) ? preg_replace('![^\w\|]+!', '_', $template->compile_id) : null;
|
||||
// save cache to database
|
||||
$Id = $template->getCachedFilepath();
|
||||
$results = mysql_query("replace into SMARTY_CACHE set Id = $Id, CacheContents = '" . addslashes($content) . "',
|
||||
CacheId = '$_cache_id',
|
||||
CompileId = '$_compile_id',
|
||||
ResourceName = '$template->resource_name'", $this->link);
|
||||
if (!$results) {
|
||||
$this->mysqlError();
|
||||
}
|
||||
return $results;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty cache folder
|
||||
*
|
||||
* @param integer $exp_time expiration time
|
||||
* @return integer number of cache files deleted
|
||||
*/
|
||||
public function clearAll($exp_time = null)
|
||||
{
|
||||
if ($exp_time === null) {
|
||||
$results = mysql_query("truncate table SMARTY_CACHE", $this->link);
|
||||
} else {
|
||||
$results = mysql_query("delete ignore from SMARTY_CACHE where UNIX_TIMESTAMP(Timestamp) <= '$exp_time'", $this->link);
|
||||
}
|
||||
if (!$results) {
|
||||
$this->mysqlError();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Empty cache for a specific template
|
||||
*
|
||||
* @param string $resource_name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
* @param integer $exp_time expiration time
|
||||
* @return integer number of cache files deleted
|
||||
*/
|
||||
public function clear($resource_name, $cache_id, $compile_id, $exp_time)
|
||||
{
|
||||
$_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
||||
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||
|
||||
$where = '';
|
||||
$and = '';
|
||||
if (isset($resource_name)) {
|
||||
$where = "ResourceName = '$resource_name' ";
|
||||
$and = 'and ';
|
||||
}
|
||||
if (isset($_cache_id)) {
|
||||
$length = strlen($_cache_id);
|
||||
$where .= $and . "SUBSTRING(CacheId,1,$length) = '$_cache_id' ";
|
||||
$and = 'and ';
|
||||
}
|
||||
if (isset($_compile_id)) {
|
||||
$where .= $and . "CompileId = '$_compile_id' ";
|
||||
$and = 'and ';
|
||||
}
|
||||
if (isset($exp_time)) {
|
||||
$where .= $and . "UNIX_TIMESTAMP(Timestamp) <= '$exp_time' ";
|
||||
}
|
||||
$results = mysql_query("delete ignore from SMARTY_CACHE where $where", $this->link);
|
||||
if (!$results) {
|
||||
$this->mysqlError();
|
||||
}
|
||||
return mysql_affected_rows();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get system filepath to cached file
|
||||
*
|
||||
* @param string $resource_name template name
|
||||
* @param string $cache_id cache id
|
||||
* @param string $compile_id compile id
|
||||
* @return string filepath of cache file
|
||||
*/
|
||||
private function buildCachedFilepath ($resource_name, $cache_id, $compile_id)
|
||||
{
|
||||
$_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
||||
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||
return abs(crc32($resource_name . $_cache_id . $_compile_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* MYSQL Error
|
||||
*/
|
||||
private function mysqlError ()
|
||||
{
|
||||
$error = mysql_error($this->link);
|
||||
throw new Exception("Cache resource MYSQL error '{$error}'");
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@@ -24,7 +24,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
public $cache_lifetime = null;
|
||||
public $cacher_class = null;
|
||||
public $caching_type = null;
|
||||
public $force_compile = null;
|
||||
public $force_compile = null;
|
||||
public $forceNocache = false;
|
||||
// Template resource
|
||||
public $template_resource = null;
|
||||
@@ -87,9 +87,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
$this->cache_lifetime = $_cache_lifetime === null ?$this->smarty->cache_lifetime : $_cache_lifetime;
|
||||
$this->force_cache = $this->smarty->force_cache;
|
||||
$this->cacher_class = $this->smarty->cacher_class;
|
||||
$this->caching_type = $this->smarty->default_caching_type;
|
||||
$this->security = $this->smarty->security;
|
||||
$this->cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($this->caching_type);
|
||||
$this->parent = $_parent;
|
||||
$this->properties['file_dependency'] = array();
|
||||
// dummy local smarty variable
|
||||
@@ -102,7 +100,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
}
|
||||
// load cache resource
|
||||
if (!$this->isEvaluated() && $this->caching) {
|
||||
$this->cache_resource_object = new $this->cache_resource_class($this->smarty);
|
||||
$this->cache_resource_object = $this->smarty->loadCacheResource();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,8 +205,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
{
|
||||
$this->isExisting(true);
|
||||
if ($this->mustCompile === null) {
|
||||
$this->mustCompile = ($this->usesCompiler() && ($this->force_compile || $this->isEvaluated() || $this->getCompiledTimestamp () === false ||
|
||||
// ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ())));
|
||||
$this->mustCompile = ($this->usesCompiler() && ($this->force_compile || $this->isEvaluated() || $this->getCompiledTimestamp () === false ||
|
||||
// ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ())));
|
||||
($this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTemplateTimestamp ())));
|
||||
}
|
||||
return $this->mustCompile;
|
||||
@@ -291,14 +289,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
// write compiled template
|
||||
Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->compiled_template, $this->smarty);
|
||||
// make template and compiled file timestamp match
|
||||
/**
|
||||
$this->compiled_timestamp = null;
|
||||
touch($this->getCompiledFilepath(), $this->getTemplateTimestamp());
|
||||
// daylight saving time problem on windows
|
||||
if ($this->template_timestamp != $this->getCompiledTimestamp()) {
|
||||
touch($this->getCompiledFilepath(), 2 * $this->template_timestamp - $this->compiled_timestamp);
|
||||
}
|
||||
**/
|
||||
/**
|
||||
* $this->compiled_timestamp = null;
|
||||
* touch($this->getCompiledFilepath(), $this->getTemplateTimestamp());
|
||||
* // daylight saving time problem on windows
|
||||
* if ($this->template_timestamp != $this->getCompiledTimestamp()) {
|
||||
* touch($this->getCompiledFilepath(), 2 * $this->template_timestamp - $this->compiled_timestamp);
|
||||
* }
|
||||
*/
|
||||
}
|
||||
} else {
|
||||
// error compiling template
|
||||
@@ -445,7 +443,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
$resource_handler = $this->loadTemplateResourceHandler($resource_type);
|
||||
$mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name);
|
||||
}
|
||||
// If ($mtime != $_file_to_check[1]) {
|
||||
// If ($mtime != $_file_to_check[1]) {
|
||||
If ($mtime > $_file_to_check[1]) {
|
||||
$this->properties['file_dependency'] = array();
|
||||
$this->mustCompile = true;
|
||||
@@ -577,7 +575,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
||||
return $_return;
|
||||
} elseif ($_return === true) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// throw new Exception("Unable to load template \"{$file}\"");
|
||||
|
@@ -18,18 +18,12 @@
|
||||
* @param string $type resource type
|
||||
* @return integer number of cache files deleted
|
||||
*/
|
||||
function Smarty_Method_Clear_All_Cache($smarty, $exp_time = null, $type = 'file')
|
||||
function Smarty_Method_Clear_All_Cache($smarty, $exp_time = null, $type = null)
|
||||
{
|
||||
// load cache resource
|
||||
if (!isset($smarty->cache_resource_objects[$type])) {
|
||||
$_cache_resource_class = 'Smarty_Internal_CacheResource_' . $type;
|
||||
if (!$smarty->loadPlugin($_cache_resource_class)) {
|
||||
throw new Exception("Undefined cache resource type {$type}");
|
||||
}
|
||||
$smarty->cache_resource_objects[$type] = new $_cache_resource_class($smarty);
|
||||
}
|
||||
$cacheResource = $smarty->loadCacheResource($type);
|
||||
|
||||
return $smarty->cache_resource_objects[$type]->clearAll($exp_time);
|
||||
return $cacheResource->clearAll($exp_time);
|
||||
}
|
||||
|
||||
?>
|
||||
|
@@ -21,16 +21,12 @@
|
||||
* @param string $type resource type
|
||||
* @return integer number of cache files deleted
|
||||
*/
|
||||
function Smarty_Method_Clear_Cache($smarty, $template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = 'file')
|
||||
function Smarty_Method_Clear_Cache($smarty, $template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
|
||||
{
|
||||
// load cache resource
|
||||
$_cache_resource_class = 'Smarty_Internal_CacheResource_' . $type;
|
||||
if (!$smarty->loadPlugin($_cache_resource_class)) {
|
||||
throw new Exception("Undefined cache resource type {$type}");
|
||||
}
|
||||
$cache_object = new $_cache_resource_class($smarty);
|
||||
// load cache resource
|
||||
$cacheResource = $smarty->loadCacheResource($type);
|
||||
|
||||
return $cache_object->clear($template_name, $cache_id, $compile_id, $exp_time);
|
||||
return $cacheResource->clear($template_name, $cache_id, $compile_id, $exp_time);
|
||||
}
|
||||
|
||||
?>
|
||||
|
Reference in New Issue
Block a user