danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Database interface code for engines that need complete control over their
|
danielebarchiesi@0
|
6 * result sets. For example, SQLite will prefix some column names by the name
|
danielebarchiesi@0
|
7 * of the table. We post-process the data, by renaming the column names
|
danielebarchiesi@0
|
8 * using the same convention as MySQL and PostgreSQL.
|
danielebarchiesi@0
|
9 */
|
danielebarchiesi@0
|
10
|
danielebarchiesi@0
|
11 /**
|
danielebarchiesi@0
|
12 * @addtogroup database
|
danielebarchiesi@0
|
13 * @{
|
danielebarchiesi@0
|
14 */
|
danielebarchiesi@0
|
15
|
danielebarchiesi@0
|
16 /**
|
danielebarchiesi@0
|
17 * An implementation of DatabaseStatementInterface that prefetches all data.
|
danielebarchiesi@0
|
18 *
|
danielebarchiesi@0
|
19 * This class behaves very similar to a PDOStatement but as it always fetches
|
danielebarchiesi@0
|
20 * every row it is possible to manipulate those results.
|
danielebarchiesi@0
|
21 */
|
danielebarchiesi@0
|
22 class DatabaseStatementPrefetch implements Iterator, DatabaseStatementInterface {
|
danielebarchiesi@0
|
23
|
danielebarchiesi@0
|
24 /**
|
danielebarchiesi@0
|
25 * The query string.
|
danielebarchiesi@0
|
26 *
|
danielebarchiesi@0
|
27 * @var string
|
danielebarchiesi@0
|
28 */
|
danielebarchiesi@0
|
29 protected $queryString;
|
danielebarchiesi@0
|
30
|
danielebarchiesi@0
|
31 /**
|
danielebarchiesi@0
|
32 * Driver-specific options. Can be used by child classes.
|
danielebarchiesi@0
|
33 *
|
danielebarchiesi@0
|
34 * @var Array
|
danielebarchiesi@0
|
35 */
|
danielebarchiesi@0
|
36 protected $driverOptions;
|
danielebarchiesi@0
|
37
|
danielebarchiesi@0
|
38 /**
|
danielebarchiesi@0
|
39 * Reference to the database connection object for this statement.
|
danielebarchiesi@0
|
40 *
|
danielebarchiesi@0
|
41 * The name $dbh is inherited from PDOStatement.
|
danielebarchiesi@0
|
42 *
|
danielebarchiesi@0
|
43 * @var DatabaseConnection
|
danielebarchiesi@0
|
44 */
|
danielebarchiesi@0
|
45 public $dbh;
|
danielebarchiesi@0
|
46
|
danielebarchiesi@0
|
47 /**
|
danielebarchiesi@0
|
48 * Main data store.
|
danielebarchiesi@0
|
49 *
|
danielebarchiesi@0
|
50 * @var Array
|
danielebarchiesi@0
|
51 */
|
danielebarchiesi@0
|
52 protected $data = array();
|
danielebarchiesi@0
|
53
|
danielebarchiesi@0
|
54 /**
|
danielebarchiesi@0
|
55 * The current row, retrieved in PDO::FETCH_ASSOC format.
|
danielebarchiesi@0
|
56 *
|
danielebarchiesi@0
|
57 * @var Array
|
danielebarchiesi@0
|
58 */
|
danielebarchiesi@0
|
59 protected $currentRow = NULL;
|
danielebarchiesi@0
|
60
|
danielebarchiesi@0
|
61 /**
|
danielebarchiesi@0
|
62 * The key of the current row.
|
danielebarchiesi@0
|
63 *
|
danielebarchiesi@0
|
64 * @var int
|
danielebarchiesi@0
|
65 */
|
danielebarchiesi@0
|
66 protected $currentKey = NULL;
|
danielebarchiesi@0
|
67
|
danielebarchiesi@0
|
68 /**
|
danielebarchiesi@0
|
69 * The list of column names in this result set.
|
danielebarchiesi@0
|
70 *
|
danielebarchiesi@0
|
71 * @var Array
|
danielebarchiesi@0
|
72 */
|
danielebarchiesi@0
|
73 protected $columnNames = NULL;
|
danielebarchiesi@0
|
74
|
danielebarchiesi@0
|
75 /**
|
danielebarchiesi@0
|
76 * The number of rows affected by the last query.
|
danielebarchiesi@0
|
77 *
|
danielebarchiesi@0
|
78 * @var int
|
danielebarchiesi@0
|
79 */
|
danielebarchiesi@0
|
80 protected $rowCount = NULL;
|
danielebarchiesi@0
|
81
|
danielebarchiesi@0
|
82 /**
|
danielebarchiesi@0
|
83 * The number of rows in this result set.
|
danielebarchiesi@0
|
84 *
|
danielebarchiesi@0
|
85 * @var int
|
danielebarchiesi@0
|
86 */
|
danielebarchiesi@0
|
87 protected $resultRowCount = 0;
|
danielebarchiesi@0
|
88
|
danielebarchiesi@0
|
89 /**
|
danielebarchiesi@0
|
90 * Holds the current fetch style (which will be used by the next fetch).
|
danielebarchiesi@0
|
91 * @see PDOStatement::fetch()
|
danielebarchiesi@0
|
92 *
|
danielebarchiesi@0
|
93 * @var int
|
danielebarchiesi@0
|
94 */
|
danielebarchiesi@0
|
95 protected $fetchStyle = PDO::FETCH_OBJ;
|
danielebarchiesi@0
|
96
|
danielebarchiesi@0
|
97 /**
|
danielebarchiesi@0
|
98 * Holds supplementary current fetch options (which will be used by the next fetch).
|
danielebarchiesi@0
|
99 *
|
danielebarchiesi@0
|
100 * @var Array
|
danielebarchiesi@0
|
101 */
|
danielebarchiesi@0
|
102 protected $fetchOptions = array(
|
danielebarchiesi@0
|
103 'class' => 'stdClass',
|
danielebarchiesi@0
|
104 'constructor_args' => array(),
|
danielebarchiesi@0
|
105 'object' => NULL,
|
danielebarchiesi@0
|
106 'column' => 0,
|
danielebarchiesi@0
|
107 );
|
danielebarchiesi@0
|
108
|
danielebarchiesi@0
|
109 /**
|
danielebarchiesi@0
|
110 * Holds the default fetch style.
|
danielebarchiesi@0
|
111 *
|
danielebarchiesi@0
|
112 * @var int
|
danielebarchiesi@0
|
113 */
|
danielebarchiesi@0
|
114 protected $defaultFetchStyle = PDO::FETCH_OBJ;
|
danielebarchiesi@0
|
115
|
danielebarchiesi@0
|
116 /**
|
danielebarchiesi@0
|
117 * Holds supplementary default fetch options.
|
danielebarchiesi@0
|
118 *
|
danielebarchiesi@0
|
119 * @var Array
|
danielebarchiesi@0
|
120 */
|
danielebarchiesi@0
|
121 protected $defaultFetchOptions = array(
|
danielebarchiesi@0
|
122 'class' => 'stdClass',
|
danielebarchiesi@0
|
123 'constructor_args' => array(),
|
danielebarchiesi@0
|
124 'object' => NULL,
|
danielebarchiesi@0
|
125 'column' => 0,
|
danielebarchiesi@0
|
126 );
|
danielebarchiesi@0
|
127
|
danielebarchiesi@0
|
128 public function __construct(DatabaseConnection $connection, $query, array $driver_options = array()) {
|
danielebarchiesi@0
|
129 $this->dbh = $connection;
|
danielebarchiesi@0
|
130 $this->queryString = $query;
|
danielebarchiesi@0
|
131 $this->driverOptions = $driver_options;
|
danielebarchiesi@0
|
132 }
|
danielebarchiesi@0
|
133
|
danielebarchiesi@0
|
134 /**
|
danielebarchiesi@0
|
135 * Executes a prepared statement.
|
danielebarchiesi@0
|
136 *
|
danielebarchiesi@0
|
137 * @param $args
|
danielebarchiesi@0
|
138 * An array of values with as many elements as there are bound parameters in the SQL statement being executed.
|
danielebarchiesi@0
|
139 * @param $options
|
danielebarchiesi@0
|
140 * An array of options for this query.
|
danielebarchiesi@0
|
141 * @return
|
danielebarchiesi@0
|
142 * TRUE on success, or FALSE on failure.
|
danielebarchiesi@0
|
143 */
|
danielebarchiesi@0
|
144 public function execute($args = array(), $options = array()) {
|
danielebarchiesi@0
|
145 if (isset($options['fetch'])) {
|
danielebarchiesi@0
|
146 if (is_string($options['fetch'])) {
|
danielebarchiesi@0
|
147 // Default to an object. Note: db fields will be added to the object
|
danielebarchiesi@0
|
148 // before the constructor is run. If you need to assign fields after
|
danielebarchiesi@0
|
149 // the constructor is run, see http://drupal.org/node/315092.
|
danielebarchiesi@0
|
150 $this->setFetchMode(PDO::FETCH_CLASS, $options['fetch']);
|
danielebarchiesi@0
|
151 }
|
danielebarchiesi@0
|
152 else {
|
danielebarchiesi@0
|
153 $this->setFetchMode($options['fetch']);
|
danielebarchiesi@0
|
154 }
|
danielebarchiesi@0
|
155 }
|
danielebarchiesi@0
|
156
|
danielebarchiesi@0
|
157 $logger = $this->dbh->getLogger();
|
danielebarchiesi@0
|
158 if (!empty($logger)) {
|
danielebarchiesi@0
|
159 $query_start = microtime(TRUE);
|
danielebarchiesi@0
|
160 }
|
danielebarchiesi@0
|
161
|
danielebarchiesi@0
|
162 // Prepare the query.
|
danielebarchiesi@0
|
163 $statement = $this->getStatement($this->queryString, $args);
|
danielebarchiesi@0
|
164 if (!$statement) {
|
danielebarchiesi@0
|
165 $this->throwPDOException();
|
danielebarchiesi@0
|
166 }
|
danielebarchiesi@0
|
167
|
danielebarchiesi@0
|
168 $return = $statement->execute($args);
|
danielebarchiesi@0
|
169 if (!$return) {
|
danielebarchiesi@0
|
170 $this->throwPDOException();
|
danielebarchiesi@0
|
171 }
|
danielebarchiesi@0
|
172
|
danielebarchiesi@0
|
173 // Fetch all the data from the reply, in order to release any lock
|
danielebarchiesi@0
|
174 // as soon as possible.
|
danielebarchiesi@0
|
175 $this->rowCount = $statement->rowCount();
|
danielebarchiesi@0
|
176 $this->data = $statement->fetchAll(PDO::FETCH_ASSOC);
|
danielebarchiesi@0
|
177 // Destroy the statement as soon as possible. See
|
danielebarchiesi@0
|
178 // DatabaseConnection_sqlite::PDOPrepare() for explanation.
|
danielebarchiesi@0
|
179 unset($statement);
|
danielebarchiesi@0
|
180
|
danielebarchiesi@0
|
181 $this->resultRowCount = count($this->data);
|
danielebarchiesi@0
|
182
|
danielebarchiesi@0
|
183 if ($this->resultRowCount) {
|
danielebarchiesi@0
|
184 $this->columnNames = array_keys($this->data[0]);
|
danielebarchiesi@0
|
185 }
|
danielebarchiesi@0
|
186 else {
|
danielebarchiesi@0
|
187 $this->columnNames = array();
|
danielebarchiesi@0
|
188 }
|
danielebarchiesi@0
|
189
|
danielebarchiesi@0
|
190 if (!empty($logger)) {
|
danielebarchiesi@0
|
191 $query_end = microtime(TRUE);
|
danielebarchiesi@0
|
192 $logger->log($this, $args, $query_end - $query_start);
|
danielebarchiesi@0
|
193 }
|
danielebarchiesi@0
|
194
|
danielebarchiesi@0
|
195 // Initialize the first row in $this->currentRow.
|
danielebarchiesi@0
|
196 $this->next();
|
danielebarchiesi@0
|
197
|
danielebarchiesi@0
|
198 return $return;
|
danielebarchiesi@0
|
199 }
|
danielebarchiesi@0
|
200
|
danielebarchiesi@0
|
201 /**
|
danielebarchiesi@0
|
202 * Throw a PDO Exception based on the last PDO error.
|
danielebarchiesi@0
|
203 */
|
danielebarchiesi@0
|
204 protected function throwPDOException() {
|
danielebarchiesi@0
|
205 $error_info = $this->dbh->errorInfo();
|
danielebarchiesi@0
|
206 // We rebuild a message formatted in the same way as PDO.
|
danielebarchiesi@0
|
207 $exception = new PDOException("SQLSTATE[" . $error_info[0] . "]: General error " . $error_info[1] . ": " . $error_info[2]);
|
danielebarchiesi@0
|
208 $exception->errorInfo = $error_info;
|
danielebarchiesi@0
|
209 throw $exception;
|
danielebarchiesi@0
|
210 }
|
danielebarchiesi@0
|
211
|
danielebarchiesi@0
|
212 /**
|
danielebarchiesi@0
|
213 * Grab a PDOStatement object from a given query and its arguments.
|
danielebarchiesi@0
|
214 *
|
danielebarchiesi@0
|
215 * Some drivers (including SQLite) will need to perform some preparation
|
danielebarchiesi@0
|
216 * themselves to get the statement right.
|
danielebarchiesi@0
|
217 *
|
danielebarchiesi@0
|
218 * @param $query
|
danielebarchiesi@0
|
219 * The query.
|
danielebarchiesi@0
|
220 * @param array $args
|
danielebarchiesi@0
|
221 * An array of arguments.
|
danielebarchiesi@0
|
222 * @return PDOStatement
|
danielebarchiesi@0
|
223 * A PDOStatement object.
|
danielebarchiesi@0
|
224 */
|
danielebarchiesi@0
|
225 protected function getStatement($query, &$args = array()) {
|
danielebarchiesi@0
|
226 return $this->dbh->prepare($query);
|
danielebarchiesi@0
|
227 }
|
danielebarchiesi@0
|
228
|
danielebarchiesi@0
|
229 /**
|
danielebarchiesi@0
|
230 * Return the object's SQL query string.
|
danielebarchiesi@0
|
231 */
|
danielebarchiesi@0
|
232 public function getQueryString() {
|
danielebarchiesi@0
|
233 return $this->queryString;
|
danielebarchiesi@0
|
234 }
|
danielebarchiesi@0
|
235
|
danielebarchiesi@0
|
236 /**
|
danielebarchiesi@0
|
237 * @see PDOStatement::setFetchMode()
|
danielebarchiesi@0
|
238 */
|
danielebarchiesi@0
|
239 public function setFetchMode($fetchStyle, $a2 = NULL, $a3 = NULL) {
|
danielebarchiesi@0
|
240 $this->defaultFetchStyle = $fetchStyle;
|
danielebarchiesi@0
|
241 switch ($fetchStyle) {
|
danielebarchiesi@0
|
242 case PDO::FETCH_CLASS:
|
danielebarchiesi@0
|
243 $this->defaultFetchOptions['class'] = $a2;
|
danielebarchiesi@0
|
244 if ($a3) {
|
danielebarchiesi@0
|
245 $this->defaultFetchOptions['constructor_args'] = $a3;
|
danielebarchiesi@0
|
246 }
|
danielebarchiesi@0
|
247 break;
|
danielebarchiesi@0
|
248 case PDO::FETCH_COLUMN:
|
danielebarchiesi@0
|
249 $this->defaultFetchOptions['column'] = $a2;
|
danielebarchiesi@0
|
250 break;
|
danielebarchiesi@0
|
251 case PDO::FETCH_INTO:
|
danielebarchiesi@0
|
252 $this->defaultFetchOptions['object'] = $a2;
|
danielebarchiesi@0
|
253 break;
|
danielebarchiesi@0
|
254 }
|
danielebarchiesi@0
|
255
|
danielebarchiesi@0
|
256 // Set the values for the next fetch.
|
danielebarchiesi@0
|
257 $this->fetchStyle = $this->defaultFetchStyle;
|
danielebarchiesi@0
|
258 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
259 }
|
danielebarchiesi@0
|
260
|
danielebarchiesi@0
|
261 /**
|
danielebarchiesi@0
|
262 * Return the current row formatted according to the current fetch style.
|
danielebarchiesi@0
|
263 *
|
danielebarchiesi@0
|
264 * This is the core method of this class. It grabs the value at the current
|
danielebarchiesi@0
|
265 * array position in $this->data and format it according to $this->fetchStyle
|
danielebarchiesi@0
|
266 * and $this->fetchMode.
|
danielebarchiesi@0
|
267 *
|
danielebarchiesi@0
|
268 * @return
|
danielebarchiesi@0
|
269 * The current row formatted as requested.
|
danielebarchiesi@0
|
270 */
|
danielebarchiesi@0
|
271 public function current() {
|
danielebarchiesi@0
|
272 if (isset($this->currentRow)) {
|
danielebarchiesi@0
|
273 switch ($this->fetchStyle) {
|
danielebarchiesi@0
|
274 case PDO::FETCH_ASSOC:
|
danielebarchiesi@0
|
275 return $this->currentRow;
|
danielebarchiesi@0
|
276 case PDO::FETCH_BOTH:
|
danielebarchiesi@0
|
277 // PDO::FETCH_BOTH returns an array indexed by both the column name
|
danielebarchiesi@0
|
278 // and the column number.
|
danielebarchiesi@0
|
279 return $this->currentRow + array_values($this->currentRow);
|
danielebarchiesi@0
|
280 case PDO::FETCH_NUM:
|
danielebarchiesi@0
|
281 return array_values($this->currentRow);
|
danielebarchiesi@0
|
282 case PDO::FETCH_LAZY:
|
danielebarchiesi@0
|
283 // We do not do lazy as everything is fetched already. Fallback to
|
danielebarchiesi@0
|
284 // PDO::FETCH_OBJ.
|
danielebarchiesi@0
|
285 case PDO::FETCH_OBJ:
|
danielebarchiesi@0
|
286 return (object) $this->currentRow;
|
danielebarchiesi@0
|
287 case PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE:
|
danielebarchiesi@0
|
288 $class_name = array_unshift($this->currentRow);
|
danielebarchiesi@0
|
289 // Deliberate no break.
|
danielebarchiesi@0
|
290 case PDO::FETCH_CLASS:
|
danielebarchiesi@0
|
291 if (!isset($class_name)) {
|
danielebarchiesi@0
|
292 $class_name = $this->fetchOptions['class'];
|
danielebarchiesi@0
|
293 }
|
danielebarchiesi@0
|
294 if (count($this->fetchOptions['constructor_args'])) {
|
danielebarchiesi@0
|
295 $reflector = new ReflectionClass($class_name);
|
danielebarchiesi@0
|
296 $result = $reflector->newInstanceArgs($this->fetchOptions['constructor_args']);
|
danielebarchiesi@0
|
297 }
|
danielebarchiesi@0
|
298 else {
|
danielebarchiesi@0
|
299 $result = new $class_name();
|
danielebarchiesi@0
|
300 }
|
danielebarchiesi@0
|
301 foreach ($this->currentRow as $k => $v) {
|
danielebarchiesi@0
|
302 $result->$k = $v;
|
danielebarchiesi@0
|
303 }
|
danielebarchiesi@0
|
304 return $result;
|
danielebarchiesi@0
|
305 case PDO::FETCH_INTO:
|
danielebarchiesi@0
|
306 foreach ($this->currentRow as $k => $v) {
|
danielebarchiesi@0
|
307 $this->fetchOptions['object']->$k = $v;
|
danielebarchiesi@0
|
308 }
|
danielebarchiesi@0
|
309 return $this->fetchOptions['object'];
|
danielebarchiesi@0
|
310 case PDO::FETCH_COLUMN:
|
danielebarchiesi@0
|
311 if (isset($this->columnNames[$this->fetchOptions['column']])) {
|
danielebarchiesi@0
|
312 return $this->currentRow[$k][$this->columnNames[$this->fetchOptions['column']]];
|
danielebarchiesi@0
|
313 }
|
danielebarchiesi@0
|
314 else {
|
danielebarchiesi@0
|
315 return;
|
danielebarchiesi@0
|
316 }
|
danielebarchiesi@0
|
317 }
|
danielebarchiesi@0
|
318 }
|
danielebarchiesi@0
|
319 }
|
danielebarchiesi@0
|
320
|
danielebarchiesi@0
|
321 /* Implementations of Iterator. */
|
danielebarchiesi@0
|
322
|
danielebarchiesi@0
|
323 public function key() {
|
danielebarchiesi@0
|
324 return $this->currentKey;
|
danielebarchiesi@0
|
325 }
|
danielebarchiesi@0
|
326
|
danielebarchiesi@0
|
327 public function rewind() {
|
danielebarchiesi@0
|
328 // Nothing to do: our DatabaseStatement can't be rewound.
|
danielebarchiesi@0
|
329 }
|
danielebarchiesi@0
|
330
|
danielebarchiesi@0
|
331 public function next() {
|
danielebarchiesi@0
|
332 if (!empty($this->data)) {
|
danielebarchiesi@0
|
333 $this->currentRow = reset($this->data);
|
danielebarchiesi@0
|
334 $this->currentKey = key($this->data);
|
danielebarchiesi@0
|
335 unset($this->data[$this->currentKey]);
|
danielebarchiesi@0
|
336 }
|
danielebarchiesi@0
|
337 else {
|
danielebarchiesi@0
|
338 $this->currentRow = NULL;
|
danielebarchiesi@0
|
339 }
|
danielebarchiesi@0
|
340 }
|
danielebarchiesi@0
|
341
|
danielebarchiesi@0
|
342 public function valid() {
|
danielebarchiesi@0
|
343 return isset($this->currentRow);
|
danielebarchiesi@0
|
344 }
|
danielebarchiesi@0
|
345
|
danielebarchiesi@0
|
346 /* Implementations of DatabaseStatementInterface. */
|
danielebarchiesi@0
|
347
|
danielebarchiesi@0
|
348 public function rowCount() {
|
danielebarchiesi@0
|
349 return $this->rowCount;
|
danielebarchiesi@0
|
350 }
|
danielebarchiesi@0
|
351
|
danielebarchiesi@0
|
352 public function fetch($fetch_style = NULL, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = NULL) {
|
danielebarchiesi@0
|
353 if (isset($this->currentRow)) {
|
danielebarchiesi@0
|
354 // Set the fetch parameter.
|
danielebarchiesi@0
|
355 $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
|
danielebarchiesi@0
|
356 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
357
|
danielebarchiesi@0
|
358 // Grab the row in the format specified above.
|
danielebarchiesi@0
|
359 $return = $this->current();
|
danielebarchiesi@0
|
360 // Advance the cursor.
|
danielebarchiesi@0
|
361 $this->next();
|
danielebarchiesi@0
|
362
|
danielebarchiesi@0
|
363 // Reset the fetch parameters to the value stored using setFetchMode().
|
danielebarchiesi@0
|
364 $this->fetchStyle = $this->defaultFetchStyle;
|
danielebarchiesi@0
|
365 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
366 return $return;
|
danielebarchiesi@0
|
367 }
|
danielebarchiesi@0
|
368 else {
|
danielebarchiesi@0
|
369 return FALSE;
|
danielebarchiesi@0
|
370 }
|
danielebarchiesi@0
|
371 }
|
danielebarchiesi@0
|
372
|
danielebarchiesi@0
|
373 public function fetchColumn($index = 0) {
|
danielebarchiesi@0
|
374 if (isset($this->currentRow) && isset($this->columnNames[$index])) {
|
danielebarchiesi@0
|
375 // We grab the value directly from $this->data, and format it.
|
danielebarchiesi@0
|
376 $return = $this->currentRow[$this->columnNames[$index]];
|
danielebarchiesi@0
|
377 $this->next();
|
danielebarchiesi@0
|
378 return $return;
|
danielebarchiesi@0
|
379 }
|
danielebarchiesi@0
|
380 else {
|
danielebarchiesi@0
|
381 return FALSE;
|
danielebarchiesi@0
|
382 }
|
danielebarchiesi@0
|
383 }
|
danielebarchiesi@0
|
384
|
danielebarchiesi@0
|
385 public function fetchField($index = 0) {
|
danielebarchiesi@0
|
386 return $this->fetchColumn($index);
|
danielebarchiesi@0
|
387 }
|
danielebarchiesi@0
|
388
|
danielebarchiesi@0
|
389 public function fetchObject($class_name = NULL, $constructor_args = array()) {
|
danielebarchiesi@0
|
390 if (isset($this->currentRow)) {
|
danielebarchiesi@0
|
391 if (!isset($class_name)) {
|
danielebarchiesi@0
|
392 // Directly cast to an object to avoid a function call.
|
danielebarchiesi@0
|
393 $result = (object) $this->currentRow;
|
danielebarchiesi@0
|
394 }
|
danielebarchiesi@0
|
395 else {
|
danielebarchiesi@0
|
396 $this->fetchStyle = PDO::FETCH_CLASS;
|
danielebarchiesi@0
|
397 $this->fetchOptions = array('constructor_args' => $constructor_args);
|
danielebarchiesi@0
|
398 // Grab the row in the format specified above.
|
danielebarchiesi@0
|
399 $result = $this->current();
|
danielebarchiesi@0
|
400 // Reset the fetch parameters to the value stored using setFetchMode().
|
danielebarchiesi@0
|
401 $this->fetchStyle = $this->defaultFetchStyle;
|
danielebarchiesi@0
|
402 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
403 }
|
danielebarchiesi@0
|
404
|
danielebarchiesi@0
|
405 $this->next();
|
danielebarchiesi@0
|
406
|
danielebarchiesi@0
|
407 return $result;
|
danielebarchiesi@0
|
408 }
|
danielebarchiesi@0
|
409 else {
|
danielebarchiesi@0
|
410 return FALSE;
|
danielebarchiesi@0
|
411 }
|
danielebarchiesi@0
|
412 }
|
danielebarchiesi@0
|
413
|
danielebarchiesi@0
|
414 public function fetchAssoc() {
|
danielebarchiesi@0
|
415 if (isset($this->currentRow)) {
|
danielebarchiesi@0
|
416 $result = $this->currentRow;
|
danielebarchiesi@0
|
417 $this->next();
|
danielebarchiesi@0
|
418 return $result;
|
danielebarchiesi@0
|
419 }
|
danielebarchiesi@0
|
420 else {
|
danielebarchiesi@0
|
421 return FALSE;
|
danielebarchiesi@0
|
422 }
|
danielebarchiesi@0
|
423 }
|
danielebarchiesi@0
|
424
|
danielebarchiesi@0
|
425 public function fetchAll($fetch_style = NULL, $fetch_column = NULL, $constructor_args = NULL) {
|
danielebarchiesi@0
|
426 $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
|
danielebarchiesi@0
|
427 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
428 if (isset($fetch_column)) {
|
danielebarchiesi@0
|
429 $this->fetchOptions['column'] = $fetch_column;
|
danielebarchiesi@0
|
430 }
|
danielebarchiesi@0
|
431 if (isset($constructor_args)) {
|
danielebarchiesi@0
|
432 $this->fetchOptions['constructor_args'] = $constructor_args;
|
danielebarchiesi@0
|
433 }
|
danielebarchiesi@0
|
434
|
danielebarchiesi@0
|
435 $result = array();
|
danielebarchiesi@0
|
436 // Traverse the array as PHP would have done.
|
danielebarchiesi@0
|
437 while (isset($this->currentRow)) {
|
danielebarchiesi@0
|
438 // Grab the row in the format specified above.
|
danielebarchiesi@0
|
439 $result[] = $this->current();
|
danielebarchiesi@0
|
440 $this->next();
|
danielebarchiesi@0
|
441 }
|
danielebarchiesi@0
|
442
|
danielebarchiesi@0
|
443 // Reset the fetch parameters to the value stored using setFetchMode().
|
danielebarchiesi@0
|
444 $this->fetchStyle = $this->defaultFetchStyle;
|
danielebarchiesi@0
|
445 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
446 return $result;
|
danielebarchiesi@0
|
447 }
|
danielebarchiesi@0
|
448
|
danielebarchiesi@0
|
449 public function fetchCol($index = 0) {
|
danielebarchiesi@0
|
450 if (isset($this->columnNames[$index])) {
|
danielebarchiesi@0
|
451 $column = $this->columnNames[$index];
|
danielebarchiesi@0
|
452 $result = array();
|
danielebarchiesi@0
|
453 // Traverse the array as PHP would have done.
|
danielebarchiesi@0
|
454 while (isset($this->currentRow)) {
|
danielebarchiesi@0
|
455 $result[] = $this->currentRow[$this->columnNames[$index]];
|
danielebarchiesi@0
|
456 $this->next();
|
danielebarchiesi@0
|
457 }
|
danielebarchiesi@0
|
458 return $result;
|
danielebarchiesi@0
|
459 }
|
danielebarchiesi@0
|
460 else {
|
danielebarchiesi@0
|
461 return array();
|
danielebarchiesi@0
|
462 }
|
danielebarchiesi@0
|
463 }
|
danielebarchiesi@0
|
464
|
danielebarchiesi@0
|
465 public function fetchAllKeyed($key_index = 0, $value_index = 1) {
|
danielebarchiesi@0
|
466 if (!isset($this->columnNames[$key_index]) || !isset($this->columnNames[$value_index]))
|
danielebarchiesi@0
|
467 return array();
|
danielebarchiesi@0
|
468
|
danielebarchiesi@0
|
469 $key = $this->columnNames[$key_index];
|
danielebarchiesi@0
|
470 $value = $this->columnNames[$value_index];
|
danielebarchiesi@0
|
471
|
danielebarchiesi@0
|
472 $result = array();
|
danielebarchiesi@0
|
473 // Traverse the array as PHP would have done.
|
danielebarchiesi@0
|
474 while (isset($this->currentRow)) {
|
danielebarchiesi@0
|
475 $result[$this->currentRow[$key]] = $this->currentRow[$value];
|
danielebarchiesi@0
|
476 $this->next();
|
danielebarchiesi@0
|
477 }
|
danielebarchiesi@0
|
478 return $result;
|
danielebarchiesi@0
|
479 }
|
danielebarchiesi@0
|
480
|
danielebarchiesi@0
|
481 public function fetchAllAssoc($key, $fetch_style = NULL) {
|
danielebarchiesi@0
|
482 $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
|
danielebarchiesi@0
|
483 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
484
|
danielebarchiesi@0
|
485 $result = array();
|
danielebarchiesi@0
|
486 // Traverse the array as PHP would have done.
|
danielebarchiesi@0
|
487 while (isset($this->currentRow)) {
|
danielebarchiesi@0
|
488 // Grab the row in its raw PDO::FETCH_ASSOC format.
|
danielebarchiesi@0
|
489 $row = $this->currentRow;
|
danielebarchiesi@0
|
490 // Grab the row in the format specified above.
|
danielebarchiesi@0
|
491 $result_row = $this->current();
|
danielebarchiesi@0
|
492 $result[$this->currentRow[$key]] = $result_row;
|
danielebarchiesi@0
|
493 $this->next();
|
danielebarchiesi@0
|
494 }
|
danielebarchiesi@0
|
495
|
danielebarchiesi@0
|
496 // Reset the fetch parameters to the value stored using setFetchMode().
|
danielebarchiesi@0
|
497 $this->fetchStyle = $this->defaultFetchStyle;
|
danielebarchiesi@0
|
498 $this->fetchOptions = $this->defaultFetchOptions;
|
danielebarchiesi@0
|
499 return $result;
|
danielebarchiesi@0
|
500 }
|
danielebarchiesi@0
|
501
|
danielebarchiesi@0
|
502 }
|
danielebarchiesi@0
|
503
|
danielebarchiesi@0
|
504 /**
|
danielebarchiesi@0
|
505 * @} End of "addtogroup database".
|
danielebarchiesi@0
|
506 */
|
danielebarchiesi@0
|
507
|