From 3da874c2f6667ca00808e5215d622b627b96ef62 Mon Sep 17 00:00:00 2001 From: "Christophe.Boulain" <> Date: Fri, 15 Jan 2010 14:47:40 +0000 Subject: Fixed #169 --- .../SqlMap/Configuration/TSqlMapCacheModel.php | 2 +- .../Configuration/TSqlMapXmlConfiguration.php | 2 +- framework/Data/SqlMap/DataMapper/TSqlMapCache.php | 80 ++++++++++++++++++++-- 3 files changed, 76 insertions(+), 8 deletions(-) (limited to 'framework/Data/SqlMap') diff --git a/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php b/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php index d85148eb..540a3acd 100644 --- a/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php +++ b/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php @@ -97,7 +97,7 @@ class TSqlMapCacheModel extends TComponent public function initialize($cache=null) { if($cache===null) - $this->_cache= Prado::createComponent($this->getImplementationClass()); + $this->_cache= Prado::createComponent($this->getImplementationClass(), $this); else $this->_cache=$cache; } diff --git a/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php b/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php index f6e0acd5..c49a4219 100644 --- a/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php +++ b/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php @@ -710,7 +710,7 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder if(in_array(strtolower($name), $properties)) $cacheModel->{'set'.$name}((string)$value); } - $cache = Prado::createComponent($cacheModel->getImplementationClass()); + $cache = Prado::createComponent($cacheModel->getImplementationClass(), $cacheModel); $this->setObjectPropFromNode($cache,$node,$properties); foreach($node->xpath('property') as $propertyNode) diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapCache.php b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php index 05b72e08..5262bdf8 100644 --- a/framework/Data/SqlMap/DataMapper/TSqlMapCache.php +++ b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Data.SqlMap @@ -25,16 +25,17 @@ abstract class TSqlMapCache implements ICache protected $_keyList; protected $_cache; protected $_cacheSize = 100; + protected $_cacheModel = null; /** * Create a new cache with limited cache size. - * @param integer maxium number of items to cache. + * @param TSqlMapCacheModel $cacheModel. */ - public function __construct($cacheSize=100) + public function __construct($cacheModel=null) { $this->_cache = new TMap; - $this->_cacheSize = intval($cacheSize); $this->_keyList = new TList; + $this->_cacheModel=$cacheModel; } /** @@ -173,20 +174,71 @@ class TSqlMapLruCache extends TSqlMapCache */ class TSqlMapApplicationCache implements ICache { + protected $_cacheModel=null; + + /** + * Create a new cache with limited cache size. + * @param TSqlMapCacheModel $cacheModel. + */ + public function __construct($cacheModel=null) + { + $this->_cacheModel=$cacheModel; + } + + /** + * + * @return string a KeyListID for the cache model. + */ + protected function getKeyListId() + { + $id='keyList'; + if ($this->_cacheModel instanceof TSqlMapCacheModel) + $id.='_'.$this->_cacheModel->getId(); + return $id; + } + /** + * Retreive keylist from cache or create it if it doesn't exists + * @return TList + */ + protected function getKeyList() + { + if (($keyList=$this->getCache()->get($this->getKeyListId()))===false) + { + $keyList=new TList(); + $this->getCache()->set($this->getKeyListId(), $keyList); + } + return $keyList; + } + + protected function setKeyList($keyList) + { + $this->getCache()->set($this->getKeyListId(), $keyList); + } + /** * @param string item to be deleted. */ public function delete($key) { + $keyList=$this->getKeyList(); + $keyList->remove($key); $this->getCache()->delete($key); + $this->setKeyList($keyList); } /** - * Deletes all items in the cache. + * Deletes all items in the cache, only for data cached by sqlmap cachemodel */ public function flush() { - $this->getCache()->flush(); + $keyList=$this->getKeyList(); + $cache=$this->getCache(); + foreach ($keyList as $key) + { + $cache->delete($key); + } + // Remove the old keylist + $cache->delete($this->getKeyListId()); } /** @@ -195,6 +247,16 @@ class TSqlMapApplicationCache implements ICache public function get($key) { $result = $this->getCache()->get($key); + if ($result === false) + { + // if the key has not been found in cache (e.g expired), remove from keylist + $keyList=$this->getKeyList(); + if ($keyList->contains($key)) + { + $keyList->remove($key); + $this->setKeyList($keyList); + } + } return $result === false ? null : $result; } @@ -206,6 +268,12 @@ class TSqlMapApplicationCache implements ICache public function set($key, $value,$expire=0,$dependency=null) { $this->getCache()->set($key, $value, $expire,$dependency); + $keyList=$this->getKeyList(); + if (!$keyList->contains($key)) + { + $keyList->add($key); + $this->setKeyList($keyList); + } } /** -- cgit v1.2.3