annotate includes/database/prefetch.inc @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
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