diff options
Diffstat (limited to 'system/database/drivers/oci8')
-rw-r--r-- | system/database/drivers/oci8/oci8_driver.php | 22 | ||||
-rw-r--r-- | system/database/drivers/oci8/oci8_result.php | 481 |
2 files changed, 29 insertions, 474 deletions
diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 67bb0403b..7bf18949b 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -54,10 +54,6 @@ class CI_DB_oci8_driver extends CI_DB { // The character used for excaping protected $_escape_char = '"'; - // clause and character used for LIKE escape sequences - protected $_like_escape_str = " ESCAPE '%s' "; - protected $_like_escape_chr = '!'; - /** * The syntax to count rows is slightly different across different * database engines, so this string appears in each driver and is @@ -158,6 +154,8 @@ class CI_DB_oci8_driver extends CI_DB { $this->dsn = ''; } + // -------------------------------------------------------------------- + /** * Non-persistent database connection * @@ -179,9 +177,9 @@ class CI_DB_oci8_driver extends CI_DB { */ public function db_pconnect() { - return ( ! empty($this->char_set)) - ? @oci_pconnect($this->username, $this->password, $this->dsn, $this->char_set) - : @oci_pconnect($this->username, $this->password, $this->dsn); + return empty($this->char_set) + ? @oci_pconnect($this->username, $this->password, $this->dsn) + : @oci_pconnect($this->username, $this->password, $this->dsn, $this->char_set); } // -------------------------------------------------------------------- @@ -217,6 +215,8 @@ class CI_DB_oci8_driver extends CI_DB { return @oci_execute($this->stmt_id, $this->commit_mode); } + // -------------------------------------------------------------------- + /** * Generate a statement ID * @@ -236,7 +236,7 @@ class CI_DB_oci8_driver extends CI_DB { /** * Get cursor. Returns a cursor from the database * - * @return cursor id + * @return resource */ public function get_cursor() { @@ -300,6 +300,7 @@ class CI_DB_oci8_driver extends CI_DB { /** * Bind parameters * + * @param array * @return void */ protected function _bind_params($params) @@ -328,6 +329,7 @@ class CI_DB_oci8_driver extends CI_DB { /** * Begin Transaction * + * @param bool * @return bool */ public function trans_begin($test_mode = FALSE) @@ -636,8 +638,8 @@ class CI_DB_oci8_driver extends CI_DB { protected function _limit($sql, $limit, $offset) { $this->limit_used = TRUE; - return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($offset + $limit).')' - .($offset ? ' WHERE rnum >= '.$offset : ''); + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($offset + $limit + 1).')' + .($offset ? ' WHERE rnum >= '.($offset + 1): ''); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 6fb6c81f1..a2b600e6c 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -33,6 +33,7 @@ * @category Database * @author EllisLab Dev Team * @link http://codeigniter.com/user_guide/database/ + * @since 1.4.1 */ class CI_DB_oci8_result extends CI_DB_result { @@ -41,14 +42,16 @@ class CI_DB_oci8_result extends CI_DB_result { public $limit_used; public $commit_mode; - /* Overwriting the parent here, so we have a way to know if it's - * already called or not: + /** + * Constructor + * + * @param object + * @return void */ - public $num_rows; - public function __construct(&$driver_object) { parent::__construct($driver_object); + $this->stmt_id = $driver_object->stmt_id; $this->curs_id = $driver_object->curs_id; $this->limit_used = $driver_object->limit_used; @@ -56,33 +59,6 @@ class CI_DB_oci8_result extends CI_DB_result { $driver_object->stmt_id = FALSE; } - /** - * Number of rows in the result set. - * - * Oracle doesn't have a graceful way to return the number of rows - * so we have to use what amounts to a hack. - * - * @return int - */ - public function num_rows() - { - if ( ! is_int($this->num_rows)) - { - if (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - - return $this->num_rows = count($this->result_array()); - } - - return $this->num_rows; - } - // -------------------------------------------------------------------- /** @@ -191,450 +167,27 @@ class CI_DB_oci8_result extends CI_DB_result { * * Returns the result set as an object * + * @param string * @return object */ - protected function _fetch_object() - { - $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; - return oci_fetch_object($id); - } - - // -------------------------------------------------------------------- - - /** - * Query result. Array version. - * - * @return array - */ - public function result_array() + protected function _fetch_object($class_name = 'stdClass') { - if (count($this->result_array) > 0) - { - return $this->result_array; - } - elseif (count($this->result_object) > 0) - { - for ($i = 0, $c = count($this->result_object); $i < $c; $i++) - { - $this->result_array[$i] = (array) $this->result_object[$i]; - } - - return $this->result_array; - } - elseif (is_array($this->row_data)) - { - if (count($this->row_data) === 0) - { - return $this->result_array; - } - else - { - $row_index = count($this->row_data); - } - } - else - { - $row_index = 0; - $this->row_data = array(); - } - - $row = NULL; - while ($row = $this->_fetch_assoc()) - { - $this->row_data[$row_index++] = $row; - } - - return $this->result_array = $this->row_data; - } + $row = ($this->curs_id) + ? oci_fetch_object($this->curs_id) + : oci_fetch_object($this->stmt_id); - // -------------------------------------------------------------------- - - /** - * Query result. "object" version. - * - * @return array - */ - public function result_object() - { - if (count($this->result_object) > 0) + if ($class_name === 'stdClass' OR ! $row) { - return $this->result_object; + return $row; } - elseif (count($this->result_array) > 0) - { - for ($i = 0, $c = count($this->result_array); $i < $c; $i++) - { - $this->result_object[] = (object) $this->result_array[$i]; - } - - return $this->result_object; - } - elseif (is_array($this->row_data)) - { - if (count($this->row_data) === 0) - { - return $this->result_object; - } - else - { - $row_index = count($this->row_data); - for ($i = 0; $i < $row_index; $i++) - { - $this->result_object[$i] = (object) $this->row_data[$i]; - } - } - } - else - { - $row_index = 0; - $this->row_data = array(); - } - - $row = NULL; - while ($row = $this->_fetch_object()) - { - $this->row_data[$row_index] = (array) $row; - $this->result_object[$row_index++] = $row; - } - - return $this->result_object; - } - - // -------------------------------------------------------------------- - - /** - * Query result. Custom object version. - * - * @param string class name used to instantiate rows to - * @return array - */ - public function custom_result_object($class_name) - { - if (isset($this->custom_result_object[$class_name])) - { - return $this->custom_result_object[$class_name]; - } - - if ( ! class_exists($class_name) OR $this->result_id === FALSE OR $this->num_rows() === 0) - { - return array(); - } - - /* Even if we didn't have result_array or result_object - * set prior to custom_result_object() being called, - * num_rows() has already done so. - * Pass by reference, as we don't know how - * large it might be and we don't want 1000 row - * sets being copied. - */ - if (count($this->result_array) > 0) - { - $data = &$this->result_array; - } - elseif (count($this->result_object) > 0) - { - $data = &$this->result_object; - } - - $this->custom_result_object[$class_name] = array(); - for ($i = 0, $c = count($data); $i < $c; $i++) - { - $this->custom_result_object[$class_name][$i] = new $class_name(); - foreach ($data[$i] as $key => $value) - { - $this->custom_result_object[$class_name][$i]->$key = $value; - } - } - - return $this->custom_result_object[$class_name]; - } - - // -------------------------------------------------------------------- - - /* Single row result. - * - * Acts as a wrapper for row_object(), row_array() - * and custom_row_object(). Also used by first_row(), next_row() - * and previous_row(). - * - * @param int row index - * @param string ('object', 'array' or a custom class name) - * @return mixed whatever was passed to the second parameter - */ - public function row($n = 0, $type = 'object') - { - if ($type === 'object') - { - return $this->row_object($n); - } - elseif ($type === 'array') - { - return $this->row_array($n); - } - - return $this->custom_row_object($n, $type); - } - // -------------------------------------------------------------------- - - /* Single row result. Array version. - * - * @param int row index - * @return array - */ - public function row_array($n = 0) - { - // Make sure $n is not a string - if ( ! is_int($n)) - { - $n = (int) $n; - } - - /* If row_data is initialized, it means that we've already tried - * (at least) to fetch some data, so ... check if we already have - * this row. - */ - if (is_array($this->row_data)) - { - /* If we already have row_data[$n] - return it. - * - * If we enter the elseif, there's a number of reasons to - * return an empty array: - * - * - count($this->row_data) === 0 means there are no results - * - num_rows being set, result_array and/or result_object - * having count() > 0 means that we've already fetched all - * data and $n is greater than our highest row index available - * - $n < $this->current_row means that if such row existed, - * we would've already returned it, therefore $n is an - * invalid index - */ - if (isset($this->row_data[$n])) // We already have this row - { - $this->current_row = $n; - return $this->row_data[$n]; - } - elseif (count($this->row_data) === 0 OR is_int($this->num_rows) - OR count($this->result_array) > 0 OR count($this->result_object) > 0 - OR $n < $this->current_row) - { - // No such row exists - return NULL; - } - - // Get the next row index that would actually need to be fetched - $current_row = ($this->current_row < count($this->row_data)) ? count($this->row_data) : $this->current_row + 1; - } - else - { - $current_row = $this->current_row = 0; - $this->row_data = array(); - } - - /* Fetch more data, if available - * - * NOTE: Operator precedence is important here, if you change - * 'AND' with '&&' - it WILL BREAK the results, as - * $row will be assigned the scalar value of both - * expressions! - */ - while ($row = $this->_fetch_assoc() AND $current_row <= $n) - { - $this->row_data[$current_row++] = $row; - } - - // This would mean that there's no (more) data to fetch - if ( ! is_array($this->row_data) OR ! isset($this->row_data[$n])) - { - // Cache what we already have - if (is_array($this->row_data)) - { - $this->num_rows = count($this->row_data); - /* Usually, row_data could have less elements than result_array, - * but at this point - they should be exactly the same. - */ - $this->result_array = $this->row_data; - } - else - { - $this->num_rows = 0; - } - - return NULL; - } - - $this->current_row = $n; - return $this->row_data[$n]; - } - - // -------------------------------------------------------------------- - - /* Single row result. Object version. - * - * @param int row index - * @return mixed object if row found; empty array if not - */ - public function row_object($n = 0) - { - // Make sure $n is not a string - if ( ! is_int($n)) - { - $n = (int) $n; - } - /* Logic here is exactly the same as in row_array, - * except we have to cast row_data[$n] to an object. - * - * If we already have result_object though - we can - * directly return from it. - */ - if (isset($this->result_object[$n])) - { - $this->current_row = $n; - // Set this, if not already done. - if ( ! is_int($this->num_rows)) - { - $this->num_rows = count($this->result_object); - } - - return $this->result_object[$n]; - } - - $row = $this->row_array($n); - // Cast only if the row exists - if (count($row) > 0) - { - $this->current_row = $n; - return (object) $row; - } - - return NULL; - } - - // -------------------------------------------------------------------- - - /* Single row result. Custom object version. - * - * @param int row index - * @param string custom class name - * @return mixed custom object if row found; empty array otherwise - */ - public function custom_row_object($n = 0, $class_name) - { - // Make sure $n is not a string - if ( ! is_int($n)) - { - $n = (int) $n; - } - - if (array_key_exists($class_name, $this->custom_result_object)) - { - /* We already have a the whole result set with this class_name, - * return the specified row if it exists, and an empty array if - * it doesn't. - */ - if (isset($this->custom_result_object[$class_name][$n])) - { - $this->current_row = $n; - return $this->custom_result_object[$class_name][$n]; - } - else - { - return NULL; - } - } - elseif ( ! class_exists($class_name)) // No such class exists - { - return NULL; - } - - $row = $this->row_array($n); - // A non-array would mean that the row doesn't exist - if ( ! is_array($row)) - { - return NULL; - } - - // Convert to the desired class and return - $row_object = new $class_name(); + $class_name = new $class_name(); foreach ($row as $key => $value) { - $row_object->$key = $value; + $class_name->$key = $value; } - $this->current_row = $n; - return $row_object; - } - - // -------------------------------------------------------------------- - - /* First row result. - * - * @param string ('object', 'array' or a custom class name) - * @return mixed whatever was passed to the second parameter - */ - public function first_row($type = 'object') - { - return $this->row(0, $type); - } - - // -------------------------------------------------------------------- - - /* Last row result. - * - * @param string ('object', 'array' or a custom class name) - * @return mixed whatever was passed to the second parameter - */ - public function last_row($type = 'object') - { - $result = &$this->result($type); - if ( ! isset($this->num_rows)) - { - $this->num_rows = count($result); - } - $this->current_row = $this->num_rows - 1; - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /* Next row result. - * - * @param string ('object', 'array' or a custom class name) - * @return mixed whatever was passed to the second parameter - */ - public function next_row($type = 'object') - { - if (is_array($this->row_data)) - { - $count = count($this->row_data); - if ($this->current_row > $count OR ($this->current_row === 0 && $count === 0)) - { - $n = $count; - } - else - { - $n = $this->current_row + 1; - } - } - else - { - $n = 0; - } - - return $this->row($n, $type); - } - - // -------------------------------------------------------------------- - - /* Previous row result. - * - * @param string ('object', 'array' or a custom class name) - * @return mixed whatever was passed to the second parameter - */ - public function previous_row($type = 'object') - { - $n = ($this->current_row !== 0) ? $this->current_row - 1 : 0; - return $this->row($n, $type); + return $class_name; } // -------------------------------------------------------------------- |