From 18ea316c553f7ccfc18b73f0c987de007f11b275 Mon Sep 17 00:00:00 2001 From: wei <> Date: Mon, 4 Dec 2006 00:02:23 +0000 Subject: Fixed #469 --- framework/Data/SqlMap/DataMapper/TSqlMapCache.php | 230 ++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 framework/Data/SqlMap/DataMapper/TSqlMapCache.php (limited to 'framework/Data/SqlMap/DataMapper/TSqlMapCache.php') diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapCache.php b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php new file mode 100644 index 00000000..5cb9cbcb --- /dev/null +++ b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php @@ -0,0 +1,230 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005-2007 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); +} + +/** + * 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; + } + + public function setCacheSize($value) + { + $this->_cacheSize=TPropertyValue::ensureInteger($value,100); + } + + public function getCacheSize() + { + return $this->_cacheSize; + } + + /** + * @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); + } +} + +?> \ No newline at end of file -- cgit v1.2.3