Source for file MDB2.php

Documentation is available at MDB2.php

  1. <?php
  2. /**
  3.  * This file contains the class XML_Query2XML_Driver_MDB2.
  4.  *
  5.  * PHP version 5
  6.  *
  7.  * @category  XML
  8.  * @package   XML_Query2XML
  9.  * @author    Lukas Feiler <lukas.feiler@lukasfeiler.com>
  10.  * @copyright 2006 Lukas Feiler
  11.  * @license   http://www.gnu.org/copyleft/lesser.html  LGPL Version 2.1
  12.  * @version   CVS: $Id: MDB2.php 259451 2008-05-09 20:54:26Z lukasfeiler $
  13.  * @link      http://pear.php.net/package/XML_Query2XML
  14.  */
  15.  
  16. /**
  17.  * XML_Query2XML_Driver_MDB2 extends XML_Query2XML_Driver.
  18.  */
  19. require_once 'XML/Query2XML.php';
  20.  
  21. /**
  22.  * As the method PEAR::isError() is used within XML_Query2XML_Driver_MDB2
  23.  * we require PEAR.php.
  24.  */
  25. require_once 'PEAR.php';
  26.  
  27. /**
  28.  * Driver for the database abstraction layer PEAR MDB2.
  29.  *
  30.  * usage:
  31.  * <code>
  32.  * $driver = XML_Query2XML_Driver::factory(MDB2::factory(...));
  33.  * </code>
  34.  *
  35.  * @category  XML
  36.  * @package   XML_Query2XML
  37.  * @author    Lukas Feiler <lukas.feiler@lukasfeiler.com>
  38.  * @copyright 2006 Lukas Feiler
  39.  * @license   http://www.gnu.org/copyleft/lesser.html  LGPL Version 2.1
  40.  * @version   Release: 1.7.2
  41.  * @link      http://pear.php.net/package/XML_Query2XML
  42.  * @since     Release 1.5.0RC1
  43.  */
  44. {
  45.     /**
  46.      * In instance of a class that extends MDB2_Driver_Common.
  47.      * @var MDB2_Driver_Common 
  48.      */
  49.     private $_db null;
  50.     
  51.     /**
  52.      * Constructor
  53.      *
  54.      * @param MDB2_Driver_Common $db An instance of MDB2_Driver_Common.
  55.      *
  56.      * @throws XML_Query2XML_DBException If the fetch mode cannot be set to
  57.      *                                MDB2_FETCHMODE_ASSOC.
  58.      */
  59.     public function __construct(MDB2_Driver_Common $db)
  60.     {
  61.         $fetchModeError $db->setFetchMode(MDB2_FETCHMODE_ASSOC);
  62.         if (PEAR::isError($fetchModeError)) {
  63.             throw new XML_Query2XML_DBException(
  64.                 'Could not set fetch mode to DB_FETCHMODE_ASSOC: '
  65.                 . $fetchModeError->toString()
  66.             );
  67.         }
  68.         $this->_db $db;
  69.     }
  70.     
  71.     /**
  72.      * Pre-processes a query specification and returns a string representation
  73.      * of the query.
  74.      * This method will call parent::preprocessQuery(). Additionally it will
  75.      * verify $query['limit'] and $query['offset'].
  76.      *
  77.      * @param mixed  &$query     A string or an array containing the element 'query'.
  78.      * @param string $configPath The config path; used for exception messages.
  79.      *
  80.      * @return string The query statement as a string.
  81.      * @throws XML_Query2XML_ConfigException If $query['limit'] or $query['offset']
  82.      *                                        is set but not numeric. This exception
  83.      *                                        might also bubble up from
  84.      *                                        parent::preprocessQuery().
  85.      */
  86.     public function preprocessQuery(&$query$configPath)
  87.     {
  88.         // will make $query an array if it is not already
  89.         $queryString parent::preprocessQuery($query$configPath);
  90.         
  91.         foreach (array('limit''offset'as $sqlOption{
  92.             if (isset($query[$sqlOption])) {
  93.                 if (!is_numeric($query[$sqlOption])) {
  94.                     /*
  95.                      * unit test: getXML/
  96.                      *  offsetlimit_throwConfigException_limit_not_numeric.phpt
  97.                      *  offsetlimit_throwConfigException_offset_not_numeric.phpt
  98.                      */
  99.                     throw new XML_Query2XML_ConfigException(
  100.                         $configPath '[' $sqlOption
  101.                         . ']: integer expected, '
  102.                         . gettype($query[$sqlOption]' given.'
  103.                     );
  104.                 }
  105.             }
  106.         }
  107.         if (isset($query['limit'])) {
  108.             if ($query['limit'== 0{
  109.                 // setting limit to 0 is like not setting it at all
  110.                 unset($query['limit']);
  111.             else {
  112.                 if (!isset($query['offset'])) {
  113.                     // offset defaults to 0
  114.                     $query['offset'0;
  115.                 }
  116.                 $queryString .= '; LIMIT:' $query['limit'];
  117.                 $queryString .= '; OFFSET:' $query['offset'];
  118.             }
  119.         }
  120.         return $queryString;
  121.     }
  122.     
  123.     /**
  124.      * Execute a SQL SELECT stement and fetch all records from the result set.
  125.      *
  126.      * @param mixed  $sql        The SQL query as a string or an array.
  127.      * @param string $configPath The config path; used for exception messages.
  128.      *
  129.      * @return array An array of records.
  130.      * @throws XML_Query2XML_DBException If a database related error occures.
  131.      * @see XML_Query2XML_Driver::getAllRecords()
  132.      */
  133.     public function getAllRecords($sql$configPath)
  134.     {
  135.         if (isset($sql['limit']&& $sql['limit'0{
  136.             return array();
  137.         }
  138.         $result  =$this->_prepareAndExecute($sql$configPath);
  139.         $records array();
  140.         while ($record $result->fetchRow()) {
  141.             if (PEAR::isError($record)) {
  142.                 // no unit test for this exception as it cannot be produced easily
  143.                 throw new XML_Query2XML_DBException(
  144.                     $configPath ': Could not fetch rows for the following '
  145.                     . 'SQL query: ' $sql['query''; '
  146.                     . $record->toString()
  147.                 );
  148.             }
  149.             $records[$record;
  150.         }
  151.         $result->free();
  152.         return $records;
  153.     }
  154.     
  155.     /**
  156.      * Private method that will use MDB2_Driver_Common::query() for simple and
  157.      * MDB2_Driver_Common::prepare() & MDB2_Statement_Common::execute() for complex
  158.      * query specifications.
  159.      *
  160.      * @param mixed  $sql        A string or an array.
  161.      * @param string $configPath The config path used for exception messages.
  162.      *
  163.      * @return MDB2_Result 
  164.      * @throws XML_Query2XML_DBException If a database related error occures.
  165.      */
  166.     private function _prepareAndExecute($sql$configPath)
  167.     {
  168.         $preparedQuery $sql['query'];
  169.         if (isset($sql['limit'])) {
  170.             $preparedQuery .= '; LIMIT:' $sql['limit'];
  171.             $preparedQuery .= '; OFFSET:' $sql['offset'];
  172.             $this->_db->setLimit($sql['limit']$sql['offset']);
  173.         }
  174.         
  175.         if (isset($this->_preparedQueries[$preparedQuery])) {
  176.             $queryHandle $this->_preparedQueries[$preparedQuery];
  177.         else {
  178.             // PREPARE
  179.             $queryHandle $this->_db->prepare($sql['query']);
  180.             
  181.             if (PEAR::isError($queryHandle)) {
  182.                 /*
  183.                  * unit tests: (only if mysql or pgsql is used)
  184.                  *  MDB2/_prepareAndExecute/throwDBException_complexQuery.phpt
  185.                  */
  186.                 throw new XML_Query2XML_DBException(
  187.                     $configPath ': Could not prepare the following SQL query: '
  188.                     . $sql['query''; ' $queryHandle->toString()
  189.                 );
  190.             }
  191.             $this->_preparedQueries[$preparedQuery=$queryHandle;
  192.         }
  193.         
  194.         // EXECUTE
  195.         if (isset($sql['data'])) {
  196.             $result $queryHandle->execute($sql['data']);
  197.         else {
  198.             $result $queryHandle->execute();
  199.         }
  200.         
  201.         if (PEAR::isError($result)) {
  202.             /*
  203.              * unit tests:
  204.              *  if sqlite is used: MDB2/_prepareAndExecute/
  205.              *   throwDBException_complexQuery.phpt
  206.              *  if sqlite or mysql is sued: MDB2/getXML/
  207.              *   throwDBException_nullResultSet_complexQuery_multipleRecords.phpt
  208.              *   throwDBException_nullResultSet_complexQuery_singleRecord.phpt
  209.              */
  210.             throw new XML_Query2XML_DBException(
  211.                 $configPath ': Could not execute the following SQL query: '
  212.                 . $sql['query''; ' $result->toString()
  213.             );
  214.         }
  215.         return $result;
  216.     }
  217. }
  218. ?>

Documentation generated on Sun, 03 Apr 2011 13:13:09 +0200 by phpDocumentor 1.4.1