From 18ea316c553f7ccfc18b73f0c987de007f11b275 Mon Sep 17 00:00:00 2001 From: wei <> Date: Mon, 4 Dec 2006 00:02:23 +0000 Subject: Fixed #469 --- .../Data/SqlMap/Statements/TCachingStatement.php | 99 ++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 framework/Data/SqlMap/Statements/TCachingStatement.php (limited to 'framework/Data/SqlMap/Statements/TCachingStatement.php') diff --git a/framework/Data/SqlMap/Statements/TCachingStatement.php b/framework/Data/SqlMap/Statements/TCachingStatement.php new file mode 100644 index 00000000..0bcc5291 --- /dev/null +++ b/framework/Data/SqlMap/Statements/TCachingStatement.php @@ -0,0 +1,99 @@ + + * @version $Id$ + * @package System.Data.SqlMap.Statements + * @since 3.1 + */ +class TCachingStatement implements IMappedStatement +{ + private $_mappedStatement; + + public function __construct(TMappedStatement $statement) + { + $this->_mappedStatement = $statement; + } + + public function getID() + { + return $this->_mappedStatement->getID(); + } + + public function getStatement() + { + return $this->_mappedStatement->getStatement(); + } + + public function getManager() + { + return $this->_mappedStatement->getManager(); + } + + public function executeQueryForMap($connection, $parameter,$keyProperty, $valueProperty=null, $delegate=null) + { + $sql = $this->createCommand($connection, $parameter); + $key = $this->getCacheKey(array($sql, $keyProperty, $valueProperty)); + $map = $this->getStatement()->getCache()->get($key); + if(is_null($map)) + { + $map = $this->_mappedStatement->runQueryForMap( + $connection, $parameter, $sql, $keyProperty, $valueProperty, $delegate); + $this->getStatement()->getCache()->set($key, $map); + } + return $map; + } + + public function executeUpdate($connection, $parameter) + { + return $this->_mappedStatement->executeUpdate($connection, $parameter); + } + + public function executeInsert($connection, $parameter) + { + return $this->executeInsert($connection, $parameter); + } + + public function executeQueryForList($connection, $parameter, $result=null, $skip=-1, $max=-1, $delegate=null) + { + $sql = $this->createCommand($connection, $parameter); + $key = $this->getCacheKey(array($sql, $skip, $max)); + $list = $this->getStatement()->getCache()->get($key); + if(is_null($list)) + { + $list = $this->_mappedStatement->runQueryForList( + $connection, $parameter, $sql, $result, $skip, $max, $delegate); + $this->getStatement()->getCache()->set($key, $list); + } + return $list; + } + + public function executeQueryForObject($connection, $parameter, $result=null) + { + $sql = $this->createCommand($connection, $parameter); + $key = $this->getCacheKey($sql); + $object = $this->getStatement()->getCache()->get($key); + if(is_null($object)) + { + $object = $this->_mappedStatement->runQueryForObject($connection, $sql, $result); + $this->getStatement()->getCache()->set($key, $object); + } + return $object; + } + + protected function getCacheKey($object) + { + $cacheKey = new TSqlMapCacheKey($object); + return $cacheKey->getHash(); + } + + protected function createCommand($connection, $parameter) + { + return $this->_mappedStatement->getCommand()->create($this->getManager(), + $connection, $this->getStatement(), $parameter); + } +} + +?> \ No newline at end of file -- cgit v1.2.3