blob: 110d6ab0f1eea7599f799165c9b92f9fb4e00e36 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreevb76029d2012-01-26 15:13:19 +02008 *
Andrey Andreev125ef472016-01-11 12:33:00 +02009 * Copyright (c) 2014 - 2016, British Columbia Institute of Technology
Andrey Andreevb76029d2012-01-26 15:13:19 +020010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Derek Jonesf4a4bd82011-10-20 12:18:42 -050017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
Andrey Andreev1924e872016-01-11 12:55:34 +020031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
Andrey Andreev125ef472016-01-11 12:33:00 +020032 * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
Andrey Andreevbd202c92016-01-11 12:50:18 +020034 * @link https://codeigniter.com
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020035 * @since Version 1.3.0
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000039
Derek Allard2067d1a2008-11-13 22:59:24 +000040/**
41 * ODBC Result Class
42 *
43 * This class extends the parent result class: CI_DB_result
44 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020045 * @package CodeIgniter
46 * @subpackage Drivers
Derek Allard2067d1a2008-11-13 22:59:24 +000047 * @category Database
Derek Jonesf4a4bd82011-10-20 12:18:42 -050048 * @author EllisLab Dev Team
Andrey Andreevbd202c92016-01-11 12:50:18 +020049 * @link https://codeigniter.com/user_guide/database/
Derek Allard2067d1a2008-11-13 22:59:24 +000050 */
51class CI_DB_odbc_result extends CI_DB_result {
Barry Mienydd671972010-10-04 16:33:58 +020052
Derek Allard2067d1a2008-11-13 22:59:24 +000053 /**
54 * Number of rows in the result set
55 *
Andrey Andreevb76029d2012-01-26 15:13:19 +020056 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +000057 */
Andrey Andreevb76029d2012-01-26 15:13:19 +020058 public function num_rows()
Derek Allard2067d1a2008-11-13 22:59:24 +000059 {
Andrey Andreevef795ac2012-03-01 15:15:31 +020060 if (is_int($this->num_rows))
Andrey Andreev78b24bf2012-02-29 16:43:57 +020061 {
62 return $this->num_rows;
63 }
Andrey Andreev2bbbd1a2014-05-09 10:24:14 +030064 elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1)
Andrey Andreev78b24bf2012-02-29 16:43:57 +020065 {
Andrey Andreevc7db6bb2012-07-05 15:11:20 +030066 return $this->num_rows;
Andrey Andreev78b24bf2012-02-29 16:43:57 +020067 }
68
Andrey Andreevc7db6bb2012-07-05 15:11:20 +030069 // Work-around for ODBC subdrivers that don't support num_rows()
70 if (count($this->result_array) > 0)
71 {
72 return $this->num_rows = count($this->result_array);
73 }
74 elseif (count($this->result_object) > 0)
75 {
76 return $this->num_rows = count($this->result_object);
77 }
78
79 return $this->num_rows = count($this->result_array());
Derek Allard2067d1a2008-11-13 22:59:24 +000080 }
Barry Mienydd671972010-10-04 16:33:58 +020081
Andrey Andreev5ca05132012-07-05 12:06:34 +030082 // --------------------------------------------------------------------
83
Derek Allard2067d1a2008-11-13 22:59:24 +000084 /**
85 * Number of fields in the result set
86 *
Andrey Andreevb76029d2012-01-26 15:13:19 +020087 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +000088 */
Andrey Andreevb76029d2012-01-26 15:13:19 +020089 public function num_fields()
Derek Allard2067d1a2008-11-13 22:59:24 +000090 {
Andrey Andreev2bbbd1a2014-05-09 10:24:14 +030091 return odbc_num_fields($this->result_id);
Derek Allard2067d1a2008-11-13 22:59:24 +000092 }
93
94 // --------------------------------------------------------------------
95
96 /**
97 * Fetch Field Names
98 *
99 * Generates an array of column names
100 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000101 * @return array
102 */
Andrey Andreevb76029d2012-01-26 15:13:19 +0200103 public function list_fields()
Derek Allard2067d1a2008-11-13 22:59:24 +0000104 {
105 $field_names = array();
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200106 $num_fields = $this->num_fields();
Andrey Andreev41e46a92012-03-01 14:58:17 +0200107
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200108 if ($num_fields > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000109 {
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200110 for ($i = 1; $i <= $num_fields; $i++)
111 {
Andrey Andreev41e46a92012-03-01 14:58:17 +0200112 $field_names[] = odbc_field_name($this->result_id, $i);
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200113 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000114 }
Barry Mienydd671972010-10-04 16:33:58 +0200115
Derek Allard2067d1a2008-11-13 22:59:24 +0000116 return $field_names;
117 }
118
119 // --------------------------------------------------------------------
120
121 /**
122 * Field data
123 *
124 * Generates an array of objects containing field meta-data
125 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000126 * @return array
127 */
Andrey Andreevb76029d2012-01-26 15:13:19 +0200128 public function field_data()
Derek Allard2067d1a2008-11-13 22:59:24 +0000129 {
130 $retval = array();
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200131 for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++)
Derek Allard2067d1a2008-11-13 22:59:24 +0000132 {
Andrey Andreevb76029d2012-01-26 15:13:19 +0200133 $retval[$i] = new stdClass();
Andrey Andreevbb8a6832012-02-14 12:17:13 +0200134 $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index);
135 $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index);
136 $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index);
Andrey Andreevb76029d2012-01-26 15:13:19 +0200137 $retval[$i]->primary_key = 0;
138 $retval[$i]->default = '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000139 }
Barry Mienydd671972010-10-04 16:33:58 +0200140
Derek Allard2067d1a2008-11-13 22:59:24 +0000141 return $retval;
142 }
143
144 // --------------------------------------------------------------------
145
146 /**
147 * Free the result
148 *
Andrey Andreevb76029d2012-01-26 15:13:19 +0200149 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200150 */
Andrey Andreevb76029d2012-01-26 15:13:19 +0200151 public function free_result()
Derek Allard2067d1a2008-11-13 22:59:24 +0000152 {
153 if (is_resource($this->result_id))
154 {
155 odbc_free_result($this->result_id);
156 $this->result_id = FALSE;
157 }
158 }
159
160 // --------------------------------------------------------------------
161
162 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000163 * Result - associative array
164 *
165 * Returns the result set as an array
166 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000167 * @return array
168 */
Andrey Andreevb76029d2012-01-26 15:13:19 +0200169 protected function _fetch_assoc()
Derek Allard2067d1a2008-11-13 22:59:24 +0000170 {
Andrey Andreev08364ea2012-07-04 23:10:46 +0300171 return odbc_fetch_array($this->result_id);
Derek Allard2067d1a2008-11-13 22:59:24 +0000172 }
173
174 // --------------------------------------------------------------------
175
176 /**
177 * Result - object
178 *
179 * Returns the result set as an object
180 *
Andrey Andreev8463b912012-11-02 02:16:28 +0200181 * @param string $class_name
Derek Allard2067d1a2008-11-13 22:59:24 +0000182 * @return object
183 */
Andrey Andreev9a4f3562012-07-06 11:57:37 +0300184 protected function _fetch_object($class_name = 'stdClass')
Derek Allard2067d1a2008-11-13 22:59:24 +0000185 {
Andrey Andreev9a4f3562012-07-06 11:57:37 +0300186 $row = odbc_fetch_object($this->result_id);
187
188 if ($class_name === 'stdClass' OR ! $row)
189 {
190 return $row;
191 }
192
193 $class_name = new $class_name();
194 foreach ($row as $key => $value)
195 {
196 $class_name->$key = $value;
197 }
198
199 return $class_name;
Derek Allard2067d1a2008-11-13 22:59:24 +0000200 }
201
202}
203
Andrey Andreev08364ea2012-07-04 23:10:46 +0300204// --------------------------------------------------------------------
205
206if ( ! function_exists('odbc_fetch_array'))
207{
208 /**
209 * ODBC Fetch array
210 *
211 * Emulates the native odbc_fetch_array() function when
212 * it is not available (odbc_fetch_array() requires unixODBC)
213 *
Andrey Andreev8463b912012-11-02 02:16:28 +0200214 * @param resource &$result
215 * @param int $rownumber
Andrey Andreev08364ea2012-07-04 23:10:46 +0300216 * @return array
217 */
Andrey Andreev8463b912012-11-02 02:16:28 +0200218 function odbc_fetch_array(&$result, $rownumber = 1)
Andrey Andreev08364ea2012-07-04 23:10:46 +0300219 {
220 $rs = array();
221 if ( ! odbc_fetch_into($result, $rs, $rownumber))
222 {
223 return FALSE;
224 }
225
226 $rs_assoc = array();
227 foreach ($rs as $k => $v)
228 {
229 $field_name = odbc_field_name($result, $k+1);
230 $rs_assoc[$field_name] = $v;
231 }
232
233 return $rs_assoc;
234 }
235}
236
237// --------------------------------------------------------------------
238
239if ( ! function_exists('odbc_fetch_object'))
240{
241 /**
242 * ODBC Fetch object
243 *
244 * Emulates the native odbc_fetch_object() function when
245 * it is not available.
246 *
Andrey Andreev8463b912012-11-02 02:16:28 +0200247 * @param resource &$result
248 * @param int $rownumber
Andrey Andreev08364ea2012-07-04 23:10:46 +0300249 * @return object
250 */
Andrey Andreev8463b912012-11-02 02:16:28 +0200251 function odbc_fetch_object(&$result, $rownumber = 1)
Andrey Andreev08364ea2012-07-04 23:10:46 +0300252 {
253 $rs = array();
254 if ( ! odbc_fetch_into($result, $rs, $rownumber))
255 {
256 return FALSE;
257 }
258
259 $rs_object = new stdClass();
260 foreach ($rs as $k => $v)
261 {
262 $field_name = odbc_field_name($result, $k+1);
263 $rs_object->$field_name = $v;
264 }
265
266 return $rs_object;
267 }
268}