stmt_id = $driver_object->stmt_id; $this->curs_id = $driver_object->curs_id; $this->limit_used = $driver_object->limit_used; $this->commit_mode =& $driver_object->commit_mode; $driver_object->stmt_id = FALSE; } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @return int */ public function num_fields() { $count = @oci_num_fields($this->stmt_id); // if we used a limit we subtract it return ($this->limit_used) ? $count - 1 : $count; } // -------------------------------------------------------------------- /** * Fetch Field Names * * Generates an array of column names * * @return array */ public function list_fields() { $field_names = array(); for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) { $field_names[] = oci_field_name($this->stmt_id, $c); } return $field_names; } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @return array */ public function field_data() { $retval = array(); for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) { $F = new stdClass(); $F->name = oci_field_name($this->stmt_id, $c); $F->type = oci_field_type($this->stmt_id, $c); $F->max_length = oci_field_size($this->stmt_id, $c); $retval[] = $F; } return $retval; } // -------------------------------------------------------------------- /** * Free the result * * @return void */ public function free_result() { if (is_resource($this->result_id)) { oci_free_statement($this->result_id); $this->result_id = FALSE; } if (is_resource($this->stmt_id)) { oci_free_statement($this->stmt_id); } if (is_resource($this->curs_id)) { oci_cancel($this->curs_id); $this->curs_id = NULL; } } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @return array */ protected function _fetch_assoc() { $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; return @oci_fetch_assoc($id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @param string $class_name * @return object */ protected function _fetch_object($class_name = 'stdClass') { $row = ($this->curs_id) ? oci_fetch_object($this->curs_id) : oci_fetch_object($this->stmt_id); if ($class_name === 'stdClass' OR ! $row) { return $row; } $class_name = new $class_name(); foreach ($row as $key => $value) { $class_name->$key = $value; } return $class_name; } // -------------------------------------------------------------------- /** * Data Seek * * Moves the internal pointer to the desired offset. We call * this internally before fetching results to make sure the * result set starts at zero. * * Oracle's PHP extension doesn't have an easy way of doing this * and the only workaround is to (re)execute the statement or cursor * in order to go to the first (zero) index of the result set. * Then, we would need to "dummy" fetch ($n - 1) rows to get to the * right one. * * This is as ridiculous as it sounds and it's the reason why every * other method that is fetching data tries to use an already "cached" * result set. Keeping this just in case it becomes needed at * some point in the future, but it will only work for resetting the * pointer to zero. * * @param int $n (ignored) * @return bool */ public function data_seek($n = 0) { if ($n > 0) { return FALSE; } /* The PHP manual says that if OCI_NO_AUTO_COMMIT mode * is used, and oci_rollback() and/or oci_commit() are * not subsequently called - this will cause an unnecessary * rollback to be triggered at the end of the script execution. * * Therefore we'll try to avoid using that mode flag * if we're not currently in the middle of a transaction. */ if ($this->commit_mode !== OCI_COMMIT_ON_SUCCESS) { $result = @oci_execute($this->stmt_id, $this->commit_mode); } else { $result = @oci_execute($this->stmt_id); } if ($result && $this->curs_id) { if ($this->commit_mode !== OCI_COMMIT_ON_SUCCESS) { return @oci_execute($this->curs_id, $this->commit_mode); } else { return @oci_execute($this->curs_id); } } return $result; } } /* End of file oci8_result.php */ /* Location: ./system/database/drivers/oci8/oci8_result.php */