Source for file DB.php

Documentation is available at DB.php

  1. <?php
  2. /**
  3.  * This file contains the class XML_Query2XML_Driver_DB.
  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: DB.php 276639 2009-03-01 13:17:08Z lukasfeiler $
  13.  * @link      http://pear.php.net/package/XML_Query2XML
  14.  */
  15.  
  16. /**
  17.  * XML_Query2XML_Driver_DB 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_DB
  23.  * we require PEAR.php.
  24.  */
  25. require_once 'PEAR.php';
  26.  
  27. /**
  28.  * Driver for the database abstraction layer PEAR DB.
  29.  *
  30.  * usage:
  31.  * <code>
  32.  * $driver = XML_Query2XML_Driver::factory(DB::connect(...));
  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 DB_common.
  47.      * @var DB_common 
  48.      */
  49.     private $_db null;
  50.     
  51.     /**
  52.      * Constructor
  53.      *
  54.      * @param DB_Common $db An instance of a class that extends DB_Common.
  55.      *
  56.      * @throws XML_Query2XML_DBException If the fetch mode cannot be set to
  57.      *                                DB_FETCHMODE_ASSOC.
  58.      */
  59.     public function __construct(DB_common $db)
  60.     {
  61.         $fetchModeError $db->setFetchMode(DB_FETCHMODE_ASSOC);
  62.         if (PEAR::isError($fetchModeError)) {
  63.             // no unit tests for this one
  64.             throw new XML_Query2XML_DBException(
  65.                 'Could not set fetch mode to DB_FETCHMODE_ASSOC: '
  66.                 . $fetchModeError->toString()
  67.             );
  68.         }
  69.         $this->_db $db;
  70.     }
  71.     
  72.     /**
  73.      * Pre-processes a query specification and returns a string representation
  74.      * of the query.
  75.      * This method will call parent::preprocessQuery(). Additionally it will
  76.      * verify $query['limit'] and $query['offset'].
  77.      *
  78.      * @param mixed  &$query     A string or an array containing the element 'query'.
  79.      * @param string $configPath The config path; used for exception messages.
  80.      *
  81.      * @return string The query statement as a string.
  82.      * @throws XML_Query2XML_ConfigException If $query['limit'] or $query['offset']
  83.      *                                        is set but not numeric. This exception
  84.      *                                        might also bubble up from
  85.      *                                        parent::preprocessQuery().
  86.      */
  87.     public function preprocessQuery(&$query$configPath)
  88.     {
  89.         /*
  90.          * This will make $query an array if it is not already.
  91.          * We'll ignore preprocessQuery()'s return value here.
  92.          */
  93.         parent::preprocessQuery($query$configPath);        
  94.         
  95.         foreach (array('limit''offset'as $sqlOption{
  96.             if (isset($query[$sqlOption])) {
  97.                 if (!is_numeric($query[$sqlOption])) {
  98.                     /*
  99.                      * unit test: getXML/
  100.                      *  offsetlimit_throwConfigException_limit_not_numeric.phpt
  101.                      *  offsetlimit_throwConfigException_offset_not_numeric.phpt
  102.                      */
  103.                     throw new XML_Query2XML_ConfigException(
  104.                         $configPath '[' $sqlOption
  105.                         . ']: integer expected, '
  106.                         . gettype($query[$sqlOption]' given.'
  107.                     );
  108.                 }
  109.             }
  110.         }
  111.         $queryString $query['query'];
  112.         if (isset($query['limit'])) {
  113.             if ($query['limit'== 0{
  114.                 // setting limit to 0 is like not setting it at all
  115.                 unset($query['limit']);
  116.             else {
  117.                 if (!isset($query['offset'])) {
  118.                     // offset defaults to 0
  119.                     $query['offset'0;
  120.                 }
  121.                 $queryString .= '; LIMIT:' $query['limit'];
  122.                 $queryString .= '; OFFSET:' $query['offset'];
  123.                 
  124.                 $query['query'$this->_db->modifyLimitQuery(
  125.                     $query['query'],
  126.                     $query['offset'],
  127.                     $query['limit']
  128.                 );
  129.             }
  130.         }
  131.         return $queryString;
  132.     }
  133.     
  134.     /**
  135.      * Execute a SQL SELECT stement and fetch all records from the result set.
  136.      *
  137.      * @param mixed  $sql        The SQL query as an array containing the
  138.      *                            element 'query'.
  139.      * @param string $configPath The config path; used for exception messages.
  140.      *
  141.      * @return array An array of records.
  142.      * @throws XML_Query2XML_DBException If a database related error occures.
  143.      * @see XML_Query2XML_Driver::getAllRecords()
  144.      */
  145.     public function getAllRecords($sql$configPath)
  146.     {
  147.         if (isset($sql['limit']&& $sql['limit'0{
  148.             return array();
  149.         }
  150.         $result  =$this->_prepareAndExecute($sql$configPath);
  151.         $records array();
  152.         while ($record $result->fetchRow()) {
  153.             if (PEAR::isError($record)) {
  154.                 // no unit test for this exception as it cannot be produced easily
  155.                 throw new XML_Query2XML_DBException(
  156.                     $configPath ': Could not fetch rows for the following '
  157.                     . 'SQL query: ' $sql['query''; '
  158.                     . $record->toString()
  159.                 );
  160.             }
  161.             $records[$record;
  162.         }
  163.         $result->free();
  164.         return $records;
  165.     }
  166.     
  167.     /**
  168.      * Private method that will use DB_Common::prepare() & DB_Common::execute()
  169.      * to run an SQL query.
  170.      *
  171.      * @param mixed  $sql        An associative array with a 'query' element.
  172.      * @param string $configPath The config path used for exception messages.
  173.      *
  174.      * @return DB_result 
  175.      * @throws XML_Query2XML_DBException If a database related error occures.
  176.      */
  177.     private function _prepareAndExecute($sql$configPath)
  178.     {
  179.         $query $sql['query'];
  180.         
  181.         if (isset($this->_preparedQueries[$query])) {
  182.             $queryHandle $this->_preparedQueries[$query];
  183.         else {
  184.             // PREPARE
  185.             $queryHandle $this->_db->prepare($query);
  186.             
  187.             if (PEAR::isError($queryHandle)) {
  188.                 /*
  189.                  * No unit test for this exception as DB's mysql and pgsql
  190.                  * drivers never return a PEAR error from prepare().
  191.                  */
  192.                 throw new XML_Query2XML_DBException(
  193.                     $configPath ': Could not prepare the following SQL query: '
  194.                     . $query '; ' $queryHandle->toString()
  195.                 );
  196.             }
  197.             
  198.             $this->_preparedQueries[$query=$queryHandle;
  199.         }
  200.         
  201.         // EXECUTE
  202.         if (isset($sql['data'])) {
  203.             $result $this->_db->execute($queryHandle$sql['data']);
  204.         else {
  205.             $result $this->_db->execute($queryHandle);
  206.         }
  207.         
  208.         if (PEAR::isError($result)) {
  209.             /*
  210.              * unit test: DB/_prepareAndExecute/
  211.              *  throwDBException_complexQuery.phpt
  212.              */
  213.             throw new XML_Query2XML_DBException(
  214.                 $configPath ': Could not execute the following SQL query: '
  215.                 . $query '; ' $result->toString()
  216.             );
  217.         }
  218.         if (!($result instanceof DB_result)) {
  219.             /*
  220.              * unit tests: DB/getXML/
  221.              *  throwDBException_nullResultSet_complexQuery_multipleRecords.phpt
  222.              *  throwDBException_nullResultSet_complexQuery_singleRecord.phpt
  223.              */
  224.             throw new XML_Query2XML_DBException(
  225.                 $configPath ': the following SQL query returned no '
  226.                 . 'result set: ' $query
  227.             );
  228.         }
  229.         return $result;
  230.     }
  231. }
  232. ?>

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