summaryrefslogtreecommitdiff
path: root/framework/Data/SqlMap/DataMapper/TSqlMapCache.php
diff options
context:
space:
mode:
authorChristophe.Boulain <>2010-01-15 14:47:40 +0000
committerChristophe.Boulain <>2010-01-15 14:47:40 +0000
commit3da874c2f6667ca00808e5215d622b627b96ef62 (patch)
treef4fbd5d9d0f86bef5999ebabc8ae3b88253e0f9c /framework/Data/SqlMap/DataMapper/TSqlMapCache.php
parentb067d9a3a809fab01ea9ad8127b667f17a551353 (diff)
Fixed #169
Diffstat (limited to 'framework/Data/SqlMap/DataMapper/TSqlMapCache.php')
-rw-r--r--framework/Data/SqlMap/DataMapper/TSqlMapCache.php80
1 files changed, 74 insertions, 6 deletions
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 <weizhuo[at]gmail[dot]com>
* @link http://www.pradosoft.com/
- * @copyright Copyright &copy; 2005-2008 PradoSoft
+ * @copyright Copyright &copy; 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);
+ }
}
/**