[ Index ]
 

Code source de PHP PEAR 1.4.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/MDB/ -> querysim.php (source)

   1  <?php
   2  // +----------------------------------------------------------------------+
   3  // | PHP Version 4                                                        |
   4  // +----------------------------------------------------------------------+
   5  // | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox,                 |
   6  // | Stig. S. Bakken, Lukas Smith                                         |
   7  // | All rights reserved.                                                 |
   8  // +----------------------------------------------------------------------+
   9  // | MDB is a merge of PEAR DB and Metabases that provides a unified DB   |
  10  // | API as well as database abstraction for PHP applications.            |
  11  // | This LICENSE is in the BSD license style.                            |
  12  // |                                                                      |
  13  // | Redistribution and use in source and binary forms, with or without   |
  14  // | modification, are permitted provided that the following conditions   |
  15  // | are met:                                                             |
  16  // |                                                                      |
  17  // | Redistributions of source code must retain the above copyright       |
  18  // | notice, this list of conditions and the following disclaimer.        |
  19  // |                                                                      |
  20  // | Redistributions in binary form must reproduce the above copyright    |
  21  // | notice, this list of conditions and the following disclaimer in the  |
  22  // | documentation and/or other materials provided with the distribution. |
  23  // |                                                                      |
  24  // | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
  25  // | Lukas Smith nor the names of his contributors may be used to endorse |
  26  // | or promote products derived from this software without specific prior|
  27  // | written permission.                                                  |
  28  // |                                                                      |
  29  // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
  30  // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
  31  // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
  32  // | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
  33  // | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
  34  // | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
  35  // | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
  36  // |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
  37  // | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
  38  // | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
  39  // | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
  40  // | POSSIBILITY OF SUCH DAMAGE.                                          |
  41  // +----------------------------------------------------------------------+
  42  // | Original QuerySim Concept & ColdFusion Author: Hal Helms             |
  43  // | <hal.helms@teamallaire.com>                                          |
  44  // | Bert Dawson <bdawson@redbanner.com>                                  |
  45  // +----------------------------------------------------------------------+
  46  // | Original PHP Author: Alan Richmond <arichmond@bigfoot.com>           |
  47  // | David Huyck <b@bombusbee.com>                                        |
  48  // +----------------------------------------------------------------------+
  49  // | Special note concerning code documentation:                          |
  50  // | QuerySim was originally created for use during development of        |
  51  // | applications built using the Fusebox framework. (www.fusebox.org)    |
  52  // | Fusebox uses an XML style of documentation called Fusedoc. (Which    |
  53  // | is admittedly not well suited to documenting classes and functions.  |
  54  // | This short-coming is being addressed by the Fusebox community.) PEAR |
  55  // | uses a Javadoc style of documentation called PHPDoc. (www.phpdoc.de) |
  56  // | Since this class extension spans two groups of users, it is asked    |
  57  // | that the members of each respect the documentation standard of the   |
  58  // | other.  So it is a further requirement that both documentation       |
  59  // | standards be included and maintained. If assistance is required      |
  60  // | please contact Alan Richmond.                                        |
  61  // +----------------------------------------------------------------------+
  62  //
  63  // $Id: querysim.php,v 1.6.4.5 2004/02/26 11:51:15 lsmith Exp $
  64  //
  65  
  66  /*
  67  <fusedoc fuse="querysim.php" language="PHP">
  68      <responsibilities>
  69          I take information and turn it into a recordset that can be accessed
  70          through the PEAR MDB API.  Based on Hal Helms' QuerySim.cfm ColdFusion
  71          custom tag available at halhelms.com.
  72      </responsibilities>
  73      <properties>
  74          <property name="API" value="PEAR MDB" />
  75          <property name="version" value="0.2.1" />
  76          <property name="status" value="beta" />
  77          <history author="Hal Helms" email="hal.helms@teamallaire.com" type="Create" />
  78          <history author="Bert Dawson" email="bdawson@redbanner.com" type="Update">
  79              Extensive revision that is backwardly compatible but eliminates the
  80              need for a separate .sim file.
  81          </history>
  82          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Create" date="10-July-2002">
  83              Rewrote in PHP as an extention to the PEAR DB API.
  84              Functions supported:
  85                  connect, disconnect, query, fetchRow, fetchInto, freeResult,
  86                  numCols, numRows, getSpecialQuery
  87              David Huyck (bombusbee.com) added ability to escape special
  88                  characters (i.e., delimiters) using a '\'.
  89              Extended PEAR DB options[] for adding incoming parameters.  Added
  90                  options:  columnDelim, dataDelim, eolDelim
  91          </history>
  92          <history author="David Huyck" email="b@bombusbee.com" type="Update" date="19-July-2002">
  93              Added the ability to set the QuerySim options at runtime.
  94              Default options are:
  95                  'columnDelim' => ',',            // Commas split the column names
  96                  'dataDelim'   => '|',            // Pipes split the data fields
  97                  'eolDelim'    => chr(13).chr(10) // Carriage returns split the
  98                                                   // lines of data
  99              Affected functions are:
 100                  DB_querysim():          set the default options when the
 101                                          constructor method is called
 102                  _parseQuerySim($query): altered the parsing of lines, column
 103                                          names, and data fields
 104                  _empty2null:            altered the way this function is called
 105                                          to simplify calling it
 106          </history>
 107          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="24-July-2002">
 108              Added error catching for malformed QuerySim text.
 109              Bug fix _empty2null():  altered version was returning unmodified
 110                                      lineData.
 111              Cleanup:
 112                  PEAR compliant formatting, finished PHPDocs and added 'out' to
 113                  Fusedoc 'io'.
 114                  Broke up _parseQuerySim() into _buildResult() and _parseOnDelim()
 115                  to containerize duplicate parse code.
 116          </history>
 117          <history author="David Huyck" email="b@bombusbee.com" type="Update" date="25-July-2002">
 118              Edited the _buildResult() and _parseOnDelim() functions to improve
 119              reliability of special character escaping.
 120              Re-introduced a custom setOption() method to throw an error when a
 121              person tries to set one of the delimiters to '\'.
 122          </history>
 123          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="27-July-2002">
 124              Added '/' delimiter param to preg_quote() in _empty2null() and
 125              _parseOnDelim() so '/' can be used as a delimiter.
 126              Added error check for columnDelim == eolDelim or dataDelim == eolDelim.
 127              Renamed some variables for consistancy.
 128          </history>
 129          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="30-July-2002">
 130              Removed private function _empty2null().  Turns out preg_split()
 131              deals with empty elemants by making them zero length strings, just
 132              what they ended up being anyway.  This should speed things up a little.
 133              Affected functions:
 134                  _parseOnDelim()     perform trim on line here, instead of in
 135                                      _empty2null().
 136                  _buildResult()      remove call to _empty2null().
 137                  _empty2null()       removed function.
 138          </history>
 139          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="1-Jan-2003">
 140              Ported to PEAR MDB.
 141              Methods supported:
 142                  connect, query, getColumnNames, numCols, endOfResult, fetch,
 143                  numRows, freeResult, fetchInto, nextResult, setSelectedRowRange
 144                  (inherited).
 145          </history>
 146          <history
 147              Removed array_change_key_case() work around for <4.2.0 in
 148              getColumnNames(), found it already done in MDB/Common.php.
 149          </history>
 150          <history author="Alan Richmond" email="arichmond@bigfoot.com" type="Update" date="3-Feb-2003">
 151              Changed default eolDelim to a *nix file eol, since we're trimming
 152              the result anyway, it makes no difference for Windows.  Now only
 153              Mac file eols should need to be set (and other kinds of chars).
 154          </history>
 155          <note author="Alan Richmond">
 156              Got WAY too long.  See querysim_readme.txt for instructions and some
 157              examples.
 158              io section only documents elements of DB_result that DB_querysim uses,
 159              adds or changes; see MDB and MDB_Common for more info.
 160              io section uses some elements that are not Fusedoc 2.0 compliant:
 161              object and resource.
 162          </note>
 163      </properties>
 164      <io>
 165          <in>
 166              <file path="MDB/Common.php" action="require_once" />
 167          </in>
 168          <out>
 169              <object name="MDB_querysim" extends="MDB_Common" instantiatedby="MDB::connect()">
 170                  <resource type="file" name="connection" oncondition="source is external file" scope="class" />
 171                  <string name="phptype" default="querysim" />
 172                  <string name="dbsyntax" default="querysim" />
 173                  <array name="supported" comments="most of these don't actually do anything, they are enabled to simulate the option being available if checked">
 174                      <boolean name="Sequences" default="true" />
 175                      <boolean name="Indexes" default="true" />
 176                      <boolean name="AffectedRows" default="true" />
 177                      <boolean name="Summaryfunctions" default="true" />
 178                      <boolean name="OrderByText" default="true" />
 179                      <boolean name="CurrId" default="true" />
 180                      <boolean name="SelectRowRanges" default="true" comments="this one is functional" />
 181                      <boolean name="LOBs" default="true" />
 182                      <boolean name="Replace" default="true" />
 183                      <boolean name="SubSelects" default="true" />
 184                      <boolean name="Transactions" default="true" />
 185                  </array>
 186                  <string name="last_query" comments="last value passed in with query()" />
 187                  <array name="options" comments="these can be changed at run time">
 188                      <string name="columnDelim" default="," />
 189                      <string name="dataDelim" default="|" />
 190                      <string name="eolDelim" default="chr(13).chr(10)" />
 191                  </array>
 192              </object>
 193              <array name="result" comments="the simulated record set returned by ::query()">
 194                  <array comments="columns">
 195                      <string comments="column name" />
 196                  </array>
 197                  <array comments="data">
 198                      <array comments="row">
 199                          <string comments="data element" />
 200                      </array>
 201                  </array>
 202              </array>
 203          </out>
 204      </io>
 205  </fusedoc>
 206  */
 207  
 208  require_once  'MDB/Common.php';
 209  
 210  /**
 211   * MDB QuerySim driver
 212   *
 213   * @package MDB
 214   * @category Database
 215   * @author  Alan Richmond <arichmond@bigfoot.com>
 216   */
 217  class MDB_querysim extends MDB_Common
 218  {
 219  // Most of the class variables are taken from the corresponding Metabase driver.
 220  // Few are taken from the corresponding PEAR DB driver.
 221  // Some are MDB specific.
 222      var $connection = 0;
 223      var $connected_host;
 224      var $connected_user;
 225      var $connected_password;
 226      var $connected_port;
 227      var $opened_persistent = '';
 228  
 229      var $escape_quotes = "\\";
 230      var $decimal_factor = 1.0;
 231  
 232      var $highest_fetched_row = array();
 233      var $columns = array();
 234      // }}}
 235  
 236      // {{{ constructor
 237  
 238      /**
 239      * Constructor
 240      */
 241      function MDB_querysim()
 242      {
 243          $this->MDB_Common();
 244          $this->phptype  = 'querysim';
 245          $this->dbsyntax = 'querysim';
 246          
 247          // Most of these are dummies to simulate availability if checked
 248          $this->supported['Sequences'] = 1;
 249          $this->supported['Indexes'] = 1;
 250          $this->supported['AffectedRows'] = 1;
 251          $this->supported['Summaryfunctions'] = 1;
 252          $this->supported['OrderByText'] = 1;
 253          $this->supported['CurrId'] = 1;
 254          $this->supported['SelectRowRanges'] = 1;// this one is real
 255          $this->supported['LOBs'] = 1;
 256          $this->supported['Replace'] = 1;
 257          $this->supported['SubSelects'] = 1;
 258          $this->supported['Transactions'] = 1;
 259          
 260          // init QuerySim options
 261          $querySimOptions = array(
 262              'columnDelim' => ',',
 263              'dataDelim'   => '|',
 264              'eolDelim'    => "\n"
 265          );
 266          // let runtime options overwrite defaults
 267          $this->options = array_merge($querySimOptions, $this->options);
 268      }
 269      // }}}
 270  
 271      // {{{ connect()
 272  
 273      /**
 274       * Open a file or simulate a successful database connect
 275       *
 276       * @param string $dsn the data source name (see MDB::parseDSN for syntax)
 277       * @param mixed $persistent (optional) boolean whether the connection should
 278       *        be persistent (default FALSE) or assoc array of config options
 279       *
 280       * @access public
 281       *
 282       * @return mixed MDB_OK string on success, a MDB error object on failure
 283       */
 284      function connect()
 285      {
 286          if($this->connection != 0) {
 287              if (!strcmp($this->selected_database, $this->database_name)
 288                  && ($this->opened_persistent == $this->options['persistent']))
 289              {
 290                  return MDB_OK;
 291              }
 292              if ($this->selected_database) {
 293                  $this->_close($this->connection);
 294              }
 295              $this->connection = 0;
 296          }
 297          if(is_array($this->options)) {
 298              foreach($this->options as $option => $value) {
 299                  if((in_array($option, array('columnDelim','dataDelim','eolDelim')))
 300                      && ($value == '\\')) {
 301                          return $this->raiseError(MDB_ERROR, null, null,
 302                              "MDB Error: option $option cannot be set to '\\'");
 303                  }
 304              }
 305          }
 306          $connection = 1;// sim connect
 307          // if external, check file...
 308          if ($this->database_name) {
 309              $file = $this->database_name;
 310              if (!file_exists($file)) {
 311                  return $this->raiseError(MDB_ERROR_NOT_FOUND, null, null, 'file not found');
 312              }
 313              if (!is_file($file)) {
 314                  return $this->raiseError(MDB_ERROR_INVALID, null, null, 'not a file');
 315              }
 316              if (!is_readable($file)) {
 317                  return $this->raiseError(MDB_ERROR_ACCESS_VIOLATION, null, null,
 318                      'could not open file - check permissions');
 319              }
 320              // ...and open if persistent
 321              if ($this->options['persistent']) {
 322                  $connection = @fopen($file, 'r');
 323              }
 324          }
 325          $this->connection = $connection;
 326          $this->selected_database = $this->database_name;
 327          $this->opened_persistent = $this->options['persistent'];
 328          return MDB_OK;
 329      }
 330      // }}}
 331  
 332      // {{{ _close()
 333      
 334      /**
 335       * Close a file or simulate a successful database disconnect
 336       *
 337       * @access public
 338       *
 339       * @return bool TRUE on success, FALSE if file closed.
 340       *              Always TRUE if simulated.
 341       */
 342      function _close()
 343      {
 344          $ret = true;
 345          if ($this->connection != 0) {
 346              if (($this->opened_persistent) && (is_resource($this->connection))) {
 347                  echo 'closed file';
 348                  $ret = @fclose($this->connection);
 349              }
 350              $this->connection = 0;
 351              unset($GLOBALS['_MDB_databases'][$this->database]);
 352          }
 353          return $ret;
 354      }
 355      // }}}
 356  
 357      // {{{ setOption()
 358      
 359      /**
 360      * Set the option for the MDB class
 361      *
 362      * @param string $option option name
 363      * @param mixed  $value value for the option
 364      *
 365      * @return mixed MDB_OK or MDB_Error
 366      */
 367      function setOption($option, $value)
 368      {
 369          if ((in_array($option, array('columnDelim','dataDelim','eolDelim')))
 370              && ($value == '\\')
 371          ) {
 372              return $this->raiseError("option $option cannot be set to '\\'");
 373          }
 374          if (isset($this->options[$option])) {
 375              $this->options[$option] = $value;
 376              return MDB_OK;
 377          }
 378          return $this->raiseError("unknown option $option");
 379      }
 380      // }}}
 381  
 382      // {{{ query()
 383      
 384      /**
 385       * Get QuerySim text from appropriate source and return
 386       * the parsed text.
 387       *
 388       * @param string The QuerySim text
 389       * @param mixed   $types  array that contains the types of the columns in
 390       *                        the result set
 391       *
 392       * @access public
 393       *
 394       * @return mixed Simulated result set as a multidimentional
 395       * array if valid QuerySim text was passed in.  A MDB error
 396       * is returned on failure.
 397       */
 398      function query($query, $types = null)
 399      {
 400          if ($this->database_name) {
 401              $query = $this->_readFile();
 402          }
 403          
 404          $this->debug("Query: $query");
 405          $ismanip = false;
 406          
 407          $first = $this->first_selected_row;
 408          $limit = $this->selected_row_limit;
 409          $this->last_query = $query;
 410          
 411          if ($result = $this->_buildResult($query)) {
 412              if ($types != null) {
 413                  if (!is_array($types)) {
 414                      $types = array($types);
 415                  }
 416                  if (MDB::isError($err = $this->setResultTypes($result, $types))) {
 417                      $this->freeResult($result);
 418                      return $err;
 419                  }
 420              }
 421              if ($limit > 0) {
 422                  $result[1] = array_slice($result[1], $first-1, $limit);
 423              }
 424              $this->highest_fetched_row[$this->_querySimSignature($result)] = -1;
 425              
 426              return $result;
 427          }
 428          return $this->raiseError();
 429      }
 430  
 431      // }}}
 432      
 433      // {{{ _readFile()
 434      
 435      /**
 436       * Read an external file
 437       *
 438       * @param string filepath/filename
 439       *
 440       * @access private
 441       *
 442       * @return string the contents of a file
 443       */
 444      function _readFile()
 445      {
 446          $buffer = '';
 447          if ($this->opened_persistent) {
 448              while (!feof($this->connection)) {
 449                  $buffer .= fgets($this->connection, 1024);
 450              }
 451          } else {
 452              $this->connection = @fopen($this->selected_database, 'r');
 453              while (!feof($this->connection)) {
 454                  $buffer .= fgets($this->connection, 1024);
 455              }
 456              $this->connection = @fclose($this->connection);
 457          }
 458          return $buffer;
 459      }
 460      // }}}
 461  
 462      // {{{ _buildResult()
 463      
 464      /**
 465       * Convert QuerySim text into an array
 466       *
 467       * @param string Text of simulated query
 468       *
 469       * @access private
 470       *
 471       * @return multi-dimensional array containing the column names and data
 472       *                                 from the QuerySim
 473       */
 474      function _buildResult($query)
 475      {
 476          $eolDelim    = $this->options['eolDelim'];
 477          $columnDelim = $this->options['columnDelim'];
 478          $dataDelim   = $this->options['dataDelim'];
 479          
 480          $columnNames = array();
 481          $data        = array();
 482          
 483          if ($columnDelim == $eolDelim) {
 484              return $this->raiseError(MDB_ERROR_INVALID, null, null,
 485                  'columnDelim and eolDelim must be different');
 486          } elseif ($dataDelim == $eolDelim){
 487              return $this->raiseError(MDB_ERROR_INVALID, null, null,
 488                  'dataDelim and eolDelim must be different');
 489          }
 490          
 491          $query = trim($query);
 492          //tokenize escaped slashes
 493          $query = str_replace('\\\\', '[$double-slash$]', $query);
 494          
 495          if (!strlen($query)) {
 496              return $this->raiseError(MDB_ERROR_SYNTAX, null, null,
 497                  'empty querysim text');
 498          }
 499          $lineData = $this->_parseOnDelim($query, $eolDelim);
 500          //kill the empty last row created by final eol char if it exists
 501          if (!strlen(trim($lineData[count($lineData) - 1]))) {
 502              unset($lineData[count($lineData) - 1]);
 503          }
 504          //populate columnNames array
 505          $thisLine = each($lineData);
 506          $columnNames = $this->_parseOnDelim($thisLine[1], $columnDelim);
 507          if ((in_array('', $columnNames)) || (in_array('null', $columnNames))) {
 508              return $this->raiseError(MDB_ERROR_SYNTAX, null, null,
 509                  'all column names must be defined');
 510          }
 511          //replace double-slash tokens with single-slash
 512          $columnNames = str_replace('[$double-slash$]', '\\', $columnNames);
 513          $columnCount = count($columnNames);
 514          $rowNum = 0;
 515          //loop through data lines
 516          if (count($lineData) > 1) {
 517              while ($thisLine = each($lineData)) {
 518                  $thisData = $this->_parseOnDelim($thisLine[1], $dataDelim);
 519                  $thisDataCount = count($thisData);
 520                  if ($thisDataCount != $columnCount) {
 521                      $fileLineNo = $rowNum + 2;
 522                      return $this->raiseError(MDB_ERROR_SYNTAX, null, null,
 523                          "number of data elements ($thisDataCount) in line $fileLineNo not equal to number of defined columns ($columnCount)");
 524                  }
 525                  //loop through data elements in data line
 526                  foreach ($thisData as $thisElement) {
 527                      if (strtolower($thisElement) == 'null'){
 528                          $thisElement = '';
 529                      }
 530                      //replace double-slash tokens with single-slash
 531                      $data[$rowNum][] = str_replace('[$double-slash$]', '\\', $thisElement);
 532                  }//end foreach
 533                  ++$rowNum;
 534              }//end while
 535          }//end if
 536          return array($columnNames, $data);
 537      }//end function _buildResult()
 538      // }}}
 539  
 540      // {{{ _parseOnDelim()
 541      
 542      /**
 543       * Split QuerySim string into an array on a delimiter
 544       *
 545       * @param string $thisLine Text of simulated query
 546       * @param string $delim    The delimiter to split on
 547       *
 548       * @access private
 549       *
 550       * @return array containing parsed string
 551       */
 552      function _parseOnDelim($thisLine, $delim)
 553      {
 554          $delimQuoted = preg_quote($delim, '/');
 555          $thisLine = trim($thisLine);
 556          
 557          $parsed = preg_split('/(?<!\\\\)' .$delimQuoted. '/', $thisLine);
 558          //replaces escaped delimiters
 559          $parsed = preg_replace('/\\\\' .$delimQuoted. '/', $delim, $parsed);
 560          if ($delim != $this->options['eolDelim']) {
 561              //replaces escape chars
 562              $parsed = preg_replace('/\\\\/', '', $parsed);
 563          }
 564          return $parsed;
 565      }
 566      // }}}
 567  
 568      // {{{ _querySimSignature()
 569      
 570      /**
 571       * Creates a signature for the QuerySim.
 572       * This is a work-around for not having a resultset resource handle to ref.
 573       *
 574       * @access private
 575       *
 576       * @param array $result the array of QuerySim results
 577       *
 578       * @return string the signature
 579       */
 580      function _querySimSignature($result)
 581      {
 582          // convert array to string and get hash.
 583          // hash is used to keep length down.
 584          $sig = md5(serialize($result));
 585          return $sig;
 586      }
 587      // }}}
 588  
 589      // {{{ getColumnNames()
 590  
 591      /**
 592       * Retrieve the names of columns returned by the DBMS in a query result.
 593       *
 594       * @param resource   $result    result identifier
 595       * @return mixed                an associative array variable
 596       *                              that will hold the names of columns. The
 597       *                              indexes of the array are the column names
 598       *                              mapped to lower case and the values are the
 599       *                              respective numbers of the columns starting
 600       *                              from 0. Some DBMS may not return any
 601       *                              columns when the result set does not
 602       *                              contain any rows.
 603       *
 604       *                              a MDB error on failure
 605       * @access public
 606       */
 607      function getColumnNames($result)
 608      {
 609          $result_value = $this->_querySimSignature($result);
 610          if (!isset($this->highest_fetched_row[$result_value])) {
 611              return($this->raiseError(MDB_ERROR, NULL, NULL,
 612                  'Get column names: it was specified an inexisting result set'));
 613          }
 614          if (!isset($this->columns[$result_value])) {
 615              $this->columns[$result_value] = array();
 616              $columns = array_flip($result[0]);
 617              if ($this->options['optimize'] == 'portability') {
 618                  $columns = array_change_key_case($columns, CASE_LOWER);
 619              }
 620              $this->columns[$result_value] = $columns;
 621          }
 622          return($this->columns[$result_value]);
 623      }
 624      // }}}
 625  
 626      // {{{ numCols()
 627  
 628      /**
 629       * Count the number of columns returned by the DBMS in a query result.
 630       *
 631       * @param resource    $result        result identifier
 632       * @access public
 633       * @return mixed integer value with the number of columns, a MDB error
 634       *                       on failure
 635       */
 636      function numCols($result)
 637      {
 638          $result_value = $this->_querySimSignature($result);
 639          if (!isset($this->highest_fetched_row[$result_value])) {
 640              return $this->raiseError(MDB_ERROR_INVALID, null, null,
 641                  'numCols: a non-existant result set was specified');
 642          }
 643          $cols = count($result[0]);
 644          return $cols;
 645      }
 646      // }}}
 647  
 648      // {{{ endOfResult()
 649  
 650      /**
 651      * check if the end of the result set has been reached
 652      *
 653      * @param resource    $result result identifier
 654      * @return mixed TRUE or FALSE on sucess, a MDB error on failure
 655      * @access public
 656      */
 657      function endOfResult($result)
 658      {
 659          $result_value = $this->_querySimSignature($result);
 660          if (!isset($this->highest_fetched_row[$result_value])) {
 661              return $this->raiseError(MDB_ERROR, null, null,
 662                  'endOfResult(): attempted to check the end of an unknown result');
 663          }
 664          return ($this->highest_fetched_row[$result_value] >= $this->numRows($result)-1);
 665      }
 666      // }}}
 667  
 668      // {{{ fetch()
 669  
 670      /**
 671      * fetch value from a simulated result set
 672      *
 673      * @param array  $result simulated result
 674      * @param int    $row    number of the row where the data can be found
 675      * @param int    $field    field number where the data can be found
 676      * @return mixed string on success, a MDB error on failure
 677      * @access public
 678      */
 679      function fetch($result, $row, $field)
 680      {
 681          $result_value = $this->_querySimSignature($result);
 682          $this->highest_fetched_row[$result_value] = max($this->highest_fetched_row[$result_value], $row);
 683          if (isset($result[1][$row][$field])) {
 684              $res = $result[1][$row][$field];
 685          } else {
 686              return $this->raiseError(MDB_ERROR, null, null,
 687                  "fetch():  row $row, field $field is undefined in result set");
 688          }
 689          return $res;
 690      }
 691      // }}}
 692  
 693      // {{{ numRows()
 694  
 695      /**
 696      * returns the number of rows in a result object
 697      *
 698       * @param ressource $result a valid result ressouce pointer
 699      * @return mixed MDB_Error or the number of rows
 700      * @access public
 701      */
 702      function numRows($result)
 703      {
 704          $result_value = $this->_querySimSignature($result);
 705          if (!isset($this->highest_fetched_row[$result_value])) {
 706              return $this->raiseError(MDB_ERROR_INVALID, null, null,
 707                  'numRows(): a non-existant result set was specified');
 708          }
 709          $rows = @count($result[1]);
 710          return $rows;
 711      }
 712      // }}}
 713  
 714      // {{{ freeResult()
 715  
 716      /**
 717       * Free the internal resources associated with $result.
 718       *
 719       * @param $result result identifier
 720       * @return bool TRUE on success, FALSE if $result is invalid
 721       * @access public
 722       */
 723      function freeResult(&$result)
 724      {
 725          $result_value = $this->_querySimSignature($result);
 726          
 727          if(isset($this->highest_fetched_row[$result_value])) {
 728              unset($this->highest_fetched_row[$result_value]);
 729          }
 730          if(isset($this->columns[$result_value])) {
 731              unset($this->columns[$result_value]);
 732          }
 733          if(isset($this->result_types[$result_value])) {
 734              unset($this->result_types[$result_value]);
 735          }
 736          if (isset($result)) {
 737              // can't unset() in caller, so this is the best we can do...
 738              $result = null;
 739          } else {
 740              return false;
 741          }
 742          return true;
 743      }
 744      // }}}
 745  
 746      // {{{ fetchInto()
 747  
 748      /**
 749       * Fetch a row and return data in an array.
 750       *
 751       * @param resource $result result identifier
 752       * @param int $fetchmode ignored
 753       * @param int $rownum the row number to fetch
 754       * @return mixed data array or NULL on success, a MDB error on failure
 755       * @access public
 756       */
 757      function fetchInto(&$result, $fetchmode = MDB_FETCHMODE_DEFAULT, $rownum = null)
 758      {
 759          $result_value = $this->_querySimSignature($result);
 760          //if specific rownum request
 761          if ($rownum == null) {
 762              ++$this->highest_fetched_row[$result_value];
 763              $rownum = $this->highest_fetched_row[$result_value];
 764          } else {
 765              if (!isset($result[1][$rownum])) {
 766                  return null;
 767              }
 768              $this->highest_fetched_row[$result_value] =
 769                  max($this->highest_fetched_row[$result_value], $rownum);
 770          }
 771          if ($fetchmode == MDB_FETCHMODE_DEFAULT) {
 772              $fetchmode = $this->fetchmode;
 773          }
 774          // get row
 775          if(!$row = @$result[1][$rownum]) {
 776              return null;
 777          }
 778          // make row associative
 779          if (is_array($row) && $fetchmode & MDB_FETCHMODE_ASSOC) {
 780              foreach ($row as $key => $value) {
 781                  $arraytemp[$result[0][$key]] = $value;
 782              }
 783              $row = $arraytemp;
 784              if ($this->options['optimize'] == 'portability') {
 785                  $row = array_change_key_case($row, CASE_LOWER);
 786              }
 787          }
 788          return $row;
 789      }
 790      // }}}
 791  
 792      // {{{ nextResult()
 793  
 794      /**
 795       * Move the array result pointer to the next available row
 796       *
 797       * @param array a valid QuerySim result array
 798       * @return true if a result is available otherwise return false
 799       * @access public
 800       */
 801      function nextResult(&$result)
 802      {
 803          $result_value = $this->_querySimSignature($result);
 804          if (!isset($this->highest_fetched_row[$result_value])) {
 805              return $this->raiseError(MDB_ERROR_INVALID, null, null,
 806                  'nextResult(): a non-existant result set was specified');
 807          }
 808          $result_value = $this->_querySimSignature($result);
 809          $setrow = ++$this->highest_fetched_row[$result_value];
 810          return isset($result[1][$setrow]) ? true : false;
 811      }
 812      // }}}
 813  
 814      // {{{ tableInfo()
 815  
 816      /**
 817      * returns meta data about the result set
 818      *
 819      * @param resource    $result    result identifier
 820      * @param mixed $mode depends on implementation
 821      * @return array an nested array, or a MDB error
 822      * @access public
 823      */
 824      //function tableInfo($result, $mode = null)
 825      //{
 826          
 827      //}
 828  }
 829  
 830  ?>


Généré le : Sun Feb 25 14:08:00 2007 par Balluche grâce à PHPXref 0.7