* @link http://www.pradosoft.com/
* @copyright Copyright © 2005 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.DataAccess.SQLMap
*/
interface ISqLMapCache
{
public function remove($key);
public function flush();
public function get($key);
public function set($key, $value);
public function configure($model, $properties);
}
/**
* Allow different implementation of caching strategy. See TSqlMapFifoCache
* for a first-in-first-out implementation. See TSqlMapLruCache for
* a least-recently-used cache implementation.
*
* @author Wei Zhuo
* @version $Id$
* @package System.DataAccess.SQLMap
* @since 3.0
*/
abstract class TSqlMapCache implements ISqlMapCache
{
protected $_keyList;
protected $_cache;
protected $_cacheSize = 100;
/**
* Create a new cache with limited cache size.
* @param integer maxium number of items to cache.
*/
public function __construct($cacheSize=100)
{
$this->_cache = new TMap;
$this->_cacheSize = intval($cacheSize);
$this->_keyList = new TList;
}
/**
* Configures the Cache Size.
* @param array list of properties
*/
public function configure($model, $properties)
{
if(isset($properties['size']))
$this->_cacheSize = intval($properties['size']);
}
/**
* @return object the object removed if exists, null otherwise.
*/
public function remove($key)
{
$object = $this->get($key);
$this->_cache->remove($key);
$this->_keyList->remove($key);
return $object;
}
/**
* Clears the cache.
*/
public function flush()
{
$this->_keyList->clear();
$this->_cache->clear();
}
}
/**
* First-in-First-out cache implementation, removes
* object that was first added when the cache is full.
*
* @author Wei Zhuo
* @version $Id$
* @package System.DataAccess.SQLMap
* @since 3.0
*/
class TSqlMapFifoCache extends TSqlMapCache
{
/**
* @return mixed Gets a cached object with the specified key.
*/
public function get($key)
{
return $this->_cache->itemAt($key);
}
/**
* Adds an item with the specified key and value into cached data.
* @param string cache key
* @param mixed value to cache.
*/
public function set($key, $value)
{
$this->_cache->add($key, $value);
$this->_keyList->add($key);
if($this->_keyList->getCount() > $this->_cacheSize)
{
$oldestKey = $this->_keyList->removeAt(0);
$this->_cache->remove($oldestKey);
}
}
}
/**
* Least recently used cache implementation, removes
* object that was accessed last when the cache is full.
*
* @author Wei Zhuo
* @version $Id$
* @package System.DataAccess.SQLMap
* @since 3.0
*/
class TSqlMapLruCache extends TSqlMapCache
{
/**
* @return mixed Gets a cached object with the specified key.
*/
public function get($key)
{
if($this->_keyList->contains($key))
{
$this->_keyList->remove($key);
$this->_keyList->add($key);
return $this->_cache->itemAt($key);
}
else
return null;
}
/**
* Adds an item with the specified key and value into cached data.
* @param string cache key
* @param mixed value to cache.
*/
public function set($key, $value)
{
$this->_cache->add($key, $value);
$this->_keyList->add($key);
if($this->_keyList->getCount() > $this->_cacheSize)
{
$oldestKey = $this->_keyList->removeAt(0);
$this->_cache->remove($oldestKey);
}
}
}
class TSqlMapApplicationCache implements ISqlMapCache
{
private $_cache;
private $_expiry=0;
private $_property=array();
private $_cacheModelID;
public function __sleep()
{
$this->_cache = null;
return array_keys(get_object_vars($this));
}
public function remove($key)
{
$this->getCache()->delete($key);
}
public function flush()
{
$this->getCache()->flush();
}
public function get($key)
{
$result = $this->getCache()->get($key);
return $result === false ? null : $result;
}
public function set($key, $value)
{
$this->getCache()->set($key, $value, $this->_expiry);
}
public function configure($model, $properties)
{
$this->_property = $properties;
$this->_cacheModelID = $model->getID();
}
protected function getCache()
{
if(is_null($this->_cache))
$this->initialize();
return $this->_cache;
}
protected function initialize()
{
if(isset($this->_property['expiry']))
$this->_expiry = intval($this->_property['expiry']);
if(isset($this->_property['cacheModule']))
{
$id = $this->_property['cacheModule'];
$this->_cache = Prado::getApplication()->getModule($id);
}
else
{
$this->_cache = Prado::getApplication()->getCache();
}
if(!($this->_cache instanceof ICache))
throw new TSqlMapConfigurationException(
'sqlmap_invalid_prado_cache', $this->_cacheModelID);
}
}
?>