From 35426141e5c652dde822b6cecb6bd313c45ab95a Mon Sep 17 00:00:00 2001 From: Deon George Date: Wed, 1 Jun 2011 19:30:22 +1000 Subject: [PATCH] Added preload caching --- application/classes/ormtsm.php | 56 ++++++++++++++++++++++++++++- application/config/database.php | 7 ++++ application/views/domain/detail.php | 8 ++--- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/application/classes/ormtsm.php b/application/classes/ormtsm.php index 597c582..4927c22 100644 --- a/application/classes/ormtsm.php +++ b/application/classes/ormtsm.php @@ -25,6 +25,60 @@ class ORMTSM extends ORM { protected $_formated = FALSE; protected $_formats = array(); + public function find() { + // Check if we can preload our data and havent already done it + if ($time = $this->isCacheable() AND is_null(Cache::instance()->get($cache_key = 'PRELOAD:'.$this->_table_name))) { + + // Firstly set our cache, so that we dont get in a loop + Cache::instance()->set($cache_key,TRUE,$time-1); + + // Find all records of this type + $c = get_class($this); + $x = new $c; + + foreach ($x->find_all() as $record) { + // Simulate loading the record so that we can get the SQL to use as our cache key + $y = new $c; + $y->where($y->_primary_key,'=',(string)$record); + + // Code, as extracted from ORM to complete building the SQL + $y->_build(Database::SELECT); + $y->_db_builder->from($y->_table_name); + if (! isset($y->_db_applied['order_by']) AND ! empty($y->_sorting)) + foreach ($y->_sorting as $column => $direction) { + if (strpos($column, '.') === FALSE) + // Sorting column for use in JOINs + $column = ($y->_disable_join_table_name ? '' : $y->_table_name.'.').$column; + + $y->_db_builder->order_by($column, $direction); + } + + // Set the cache key based on the database instance name and SQL + $cache_key = 'Database::query("'.$y->_db.'", "'.(string)$y->_db_builder.'")'; + unset($y); + + // Cache the record, our subsequent find should get a cache hit now. + Kohana::cache($cache_key, array($record->as_array()), $time); + } + + unset($x); + } + + // Contiue as normal + return parent::find(); + } + + private function isCacheable() { + $preload = array('NODES','VOLUMES'); + + $config = Kohana::config('database')->{Database::$default}; + + if ($config['caching'] AND isset($config['cachepreload'][$this->_table_name]) AND count($this->_db_pending) == 1 AND $this->_db_pending[0]['name'] == 'where' AND $this->_db_pending[0]['args'][0] == $this->_primary_key AND $this->_db_pending[0]['args'][1] == '=') + return $config['cachepreload'][$this->_table_name]; + else + return FALSE; + } + protected function _load_result($multiple = FALSE) { // We'll cache our query results if ($c = $this->_db->caching($this->_table_name)) @@ -46,7 +100,7 @@ class ORMTSM extends ORM { // Set the cache key based on the database instance name and SQL $cache_key = 'Database::query(LC:'.$this->_table_name.')'; - if ($result = Cache::instance()->get($cache_key)) + if (! is_null($result = Cache::instance()->get($cache_key))) // Return a cached result return $result; } diff --git a/application/config/database.php b/application/config/database.php index fee1588..cc82154 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -56,6 +56,13 @@ return array 'VOLUMES' => 1200, 'VOLUMEUSAGE' => 1200, ), + 'cachepreload' => array( + 'DEVCLASSES' => 1200, + 'DOMAINS' => 1200, + 'NODES' => 1200, + 'STGPOOLS' => 1200, + 'VOLUMES' => 1200, + ), 'profiling' => TRUE, ), ); diff --git a/application/views/domain/detail.php b/application/views/domain/detail.php index aca8fa9..3abb276 100644 --- a/application/views/domain/detail.php +++ b/application/views/domain/detail.php @@ -107,7 +107,7 @@ - + @@ -120,7 +120,6 @@ - @@ -128,12 +127,12 @@ $ctype) { ?> - + - + getStoragePoolsType($btype,$type) as $spo) { ?> @@ -150,7 +149,6 @@ -
Sequential Volumes needed to restore Data for Nodes in this DomainSequential Volumes needed to restore Data for Nodes in this Domain
 Pct % Rec % MountedWrites R/W Err FS Nodes
 
VOLUME->display('PCT_UTILIZED'); ?> VOLUME->display('PCT_RECLAIM'); ?> VOLUME->display('TIMES_MOUNTED'); ?>VOLUME->display('WRITE_PASS'); ?> VOLUME->READ_ERRORS,$vuo->VOLUME->WRITE_ERRORS); ?> VOLUME->getFSOnVol($ctype); ?> VOLUME->getNodesOnVol($ctype); ?>