From 392f09ddfc99bed44ee69715626a49b2ad5f3e47 Mon Sep 17 00:00:00 2001 From: Rick Ellis Date: Sat, 18 Oct 2008 02:03:14 +0000 Subject: Fixed an AR caching bug: 4995 --- system/database/DB_active_rec.php | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'system') diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 47933ed78..5b118ce1d 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -47,6 +47,7 @@ class CI_DB_active_record extends CI_DB_driver { // Active Record Caching variables var $ar_caching = FALSE; + var $ar_cache_exists = array(); var $ar_cache_select = array(); var $ar_cache_from = array(); var $ar_cache_join = array(); @@ -96,6 +97,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_select[] = $val; + $this->ar_cache_exists[] = 'select'; } } } @@ -211,6 +213,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_select[] = $sql; + $this->ar_cache_exists[] = 'select'; } return $this; @@ -276,6 +279,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->ar_cache_exists[] = 'from'; } } @@ -331,6 +335,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_join[] = $join; + $this->ar_cache_exists[] = 'join'; } return $this; @@ -444,6 +449,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_where[] = $prefix.$k.$v; + $this->ar_cache_exists[] = 'where'; } } @@ -564,6 +570,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_where[] = $where_in; + $this->ar_cache_exists[] = 'where'; } // reset the array for multiple calls @@ -700,6 +707,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_like[] = $like_statement; + $this->ar_cache_exists[] = 'like'; } } @@ -733,6 +741,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_groupby[] = $this->_protect_identifiers($val); + $this->ar_cache_exists[] = 'groupby'; } } } @@ -839,6 +848,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_having[] = $prefix.$k.$v; + $this->ar_cache_exists[] = 'having'; } } @@ -873,6 +883,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_orderby[] = $orderby_statement; + $this->ar_cache_exists[] = 'orderby'; } return $this; @@ -906,6 +917,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_limit[] = $value; + $this->ar_cache_exists[] = 'limit'; } if ($offset != '') @@ -914,6 +926,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_offset[] = $offset; + $this->ar_cache_exists[] = 'limit'; } } @@ -935,6 +948,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_offset[] = $offset; + $this->ar_cache_exists[] = 'offset'; } return $this; @@ -969,6 +983,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_offset[$this->_protect_identifiers($k)] = $v; + $this->ar_cache_exists[] = 'offset'; } } else @@ -978,6 +993,7 @@ class CI_DB_active_record extends CI_DB_driver { if ($this->ar_caching === TRUE) { $this->ar_cache_offset[$this->_protect_identifiers($k)] = $this->escape($v); + $this->ar_cache_exists[] = 'offset'; } } } @@ -1670,12 +1686,12 @@ class CI_DB_active_record extends CI_DB_driver { */ function _merge_cache() { - if ($this->ar_caching == FALSE) + if (count($this->ar_cache_exists) == 0) { return; } - - foreach (array('select', 'from', 'join', 'where', 'like', 'groupby', 'having', 'orderby', 'set') as $val) + + foreach ($this->ar_cache_exists as $val) { $ar_variable = 'ar_'.$val; $ar_cache_var = 'ar_cache_'.$val; @@ -1684,16 +1700,13 @@ class CI_DB_active_record extends CI_DB_driver { { continue; } - - // This doesn't seem to work right, per bug report #4995 - // $this->$ar_variable = array_unique(array_merge($this->$ar_variable, $this->$ar_cache_var)); - + $this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable)); } - + // If we are "protecting identifiers" we need to examine the "from" // portion of the query to determine if there are any aliases - if ($this->_protect_identifiers === TRUE) + if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0) { $this->_track_aliases($this->ar_from); } -- cgit v1.2.3-24-g4f1b