diff --git a/classes/Kohana/Database/DB2.php b/classes/Kohana/Database/DB2.php index c31935f..df4462a 100644 --- a/classes/Kohana/Database/DB2.php +++ b/classes/Kohana/Database/DB2.php @@ -75,6 +75,10 @@ class Kohana_Database_DB2 extends Database { $e->getCode()); } + if (! $this->_connection) { + throw new Database_Exception('Connection to DB2 failed? (:error)', array(':error'=>db2_conn_errormsg())); + } + // \xFF is a better delimiter, but the PHP driver uses underscore $this->_connection_id = sha1($hostname.'_'.$username.'_'.$password); @@ -152,6 +156,17 @@ class Kohana_Database_DB2 extends Database { } public function list_columns($table, $like = NULL, $add_prefix = FALSE) { + // If caching is on, cache the tables + if ($this->_config['caching']) { + $cache_key = __METHOD__.':'.$table.':'.$like.':'.$add_prefix; + + $columns = Kohana::cache($cache_key); + + if ($columns) { + return $columns; + } + } + // Make sure the database is connected $this->_connection or $this->connect(); @@ -166,7 +181,12 @@ class Kohana_Database_DB2 extends Database { else { // Find all column names - $result = db2_columns($this->_connection,NULL,'%',$table); + try { + $result = db2_columns($this->_connection,NULL,'%',$table); + + } catch (Exception $e) { + throw new Kohana_Exception('Unable to show DB Columns :table (:connection)',array(':table'=>$table,':connection'=>$this->_connection)); + } } $count = 0; @@ -224,6 +244,11 @@ class Kohana_Database_DB2 extends Database { $columns[$row['COLUMN_NAME']] = $column; } + // Save our cache data for next call + if ($this->_config['caching']) { + Kohana::cache($cache_key,$columns); + } + return $columns; } diff --git a/classes/Kohana/Database/DB2/Result.php b/classes/Kohana/Database/DB2/Result.php index 32c9aef..219c9bb 100644 --- a/classes/Kohana/Database/DB2/Result.php +++ b/classes/Kohana/Database/DB2/Result.php @@ -12,6 +12,9 @@ class Kohana_Database_DB2_Result extends Database_Result { protected $_internal_row = 0; + // if we cache queries, we need to preserve our data, otherwise it is lost + protected $_internal_data = array(); + public function __construct($result, $sql, $as_object = FALSE, array $params = NULL) { parent::__construct($result, $sql, $as_object, $params); @@ -39,7 +42,7 @@ class Kohana_Database_DB2_Result extends Database_Result { } else { - return FALSE; + return isset($this->_internal_data[$offset+1]); } } @@ -53,11 +56,13 @@ class Kohana_Database_DB2_Result extends Database_Result { if ($this->_as_object === TRUE) { + throw new Kohana_Exception('This configuration is not tested for caching'); // Return an stdClass return db2_fetch_object($this->_result); } elseif (is_string($this->_as_object)) { + throw new Kohana_Exception('This configuration is not tested for caching'); $o = new $this->_as_object; // Return an object of given class name @@ -67,8 +72,15 @@ class Kohana_Database_DB2_Result extends Database_Result { else { // Return an array of the row - return db2_fetch_assoc($this->_result); + return isset($this->_internal_data[$this->_internal_row]) + ? $this->_internal_data[$this->_internal_row] + : ($this->_internal_data[$this->_internal_row] = db2_fetch_assoc($this->_result)); } } -} // End Database_DB2L_Result + public function rewind() { + $this->_internal_row = 0; + + return parent::rewind(); + } +} // End Database_DB2_Result