Source for file Pgsql.php

Documentation is available at Pgsql.php

  1. <?php
  2. /*
  3.  *  $Id: Pgsql.php 2113 2007-07-31 05:50:41Z lukenukem $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21. Doctrine::autoload("Doctrine_Connection_Common");
  22. /**
  23.  * Doctrine_Connection_Pgsql
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  28.  * @author      Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
  29.  * @version     $Revision: 2113 $
  30.  * @category    Object Relational Mapping
  31.  * @link        www.phpdoctrine.com
  32.  * @since       1.0
  33.  */
  34. {
  35.     /**
  36.      * @var string $driverName                  the name of this connection driver
  37.      */
  38.     protected $driverName = 'Pgsql';
  39.     /**
  40.      * the constructor
  41.      *
  42.      * @param Doctrine_Manager $manager 
  43.      * @param PDO $pdo                          database handle
  44.      */
  45.     public function __construct(Doctrine_Manager $manager$adapter)
  46.     {
  47.         // initialize all driver options
  48.         $this->supported = array(
  49.                           'sequences'               => true,
  50.                           'indexes'                 => true,
  51.                           'affected_rows'           => true,
  52.                           'summary_functions'       => true,
  53.                           'order_by_text'           => true,
  54.                           'transactions'            => true,
  55.                           'savepoints'              => true,
  56.                           'current_id'              => true,
  57.                           'limit_queries'           => true,
  58.                           'LOBs'                    => true,
  59.                           'replace'                 => 'emulated',
  60.                           'sub_selects'             => true,
  61.                           'auto_increment'          => 'emulated',
  62.                           'primary_key'             => true,
  63.                           'result_introspection'    => true,
  64.                           'prepared_statements'     => true,
  65.                           'identifier_quoting'      => true,
  66.                           'pattern_escaping'        => true,
  67.                           );
  68.  
  69.         $this->properties['string_quoting'array('start' => "'",
  70.                                                     'end' => "'",
  71.                                                     'escape' => "'",
  72.                                                     'escape_pattern' => '\\');
  73.  
  74.         $this->properties['identifier_quoting'array('start' => '"',
  75.                                                         'end' => '"',
  76.                                                         'escape' => '"');
  77.         parent::__construct($manager$adapter);
  78.     }
  79.     /**
  80.      * Set the charset on the current connection
  81.      *
  82.      * @param string    charset
  83.      *
  84.      * @return void 
  85.      */
  86.     public function setCharset($charset)
  87.     {
  88.         $query 'SET NAMES '.$this->dbh->quote($charset);
  89.         $this->exec($query);
  90.     }
  91.     /**
  92.      * convertBoolean
  93.      * some drivers need the boolean values to be converted into integers
  94.      * when using DQL API
  95.      *
  96.      * This method takes care of that conversion
  97.      *
  98.      * @param array $item 
  99.      * @return void 
  100.      */
  101.     public function convertBooleans($item)
  102.     {
  103.         if (is_array($item)) {
  104.             foreach ($item as $key => $value{
  105.                 if (is_bool($value)) {
  106.                     $item[$key($value'true' 'false';
  107.                 }
  108.             }
  109.         else {
  110.            if (is_bool($item)) {
  111.                $item ($item'true' 'false';
  112.            }
  113.         }
  114.         return $item;
  115.     }
  116.     /**
  117.      * Changes a query string for various DBMS specific reasons
  118.      *
  119.      * @param string $query         query to modify
  120.      * @param integer $limit        limit the number of rows
  121.      * @param integer $offset       start reading from given offset
  122.      * @param boolean $isManip      if the query is a DML query
  123.      * @return string               modified query
  124.      */
  125.     public function modifyLimitQuery($query$limit false$offset false$isManip false)
  126.     {
  127.         if ($limit 0{
  128.             $query rtrim($query);
  129.  
  130.             if (substr($query-1== ';'{
  131.                 $query substr($query0-1);
  132.             }
  133.  
  134.             if ($isManip{
  135.                 $manip preg_replace('/^(DELETE FROM|UPDATE).*$/''\\1'$query);
  136.                 $from  $match[2];
  137.                 $where $match[3];
  138.                 $query $manip ' ' $from ' WHERE ctid=(SELECT ctid FROM '
  139.                        . $from ' ' $where ' LIMIT ' $limit ')';
  140.  
  141.             else {
  142.                 if empty($limit)) {
  143.                   $query .= ' LIMIT ' $limit;
  144.                 }
  145.                 if empty($offset)) {
  146.                   $query .= ' OFFSET ' $offset;
  147.                 }
  148.             }
  149.         }
  150.         return $query;
  151.     }
  152.     /**
  153.      * return version information about the server
  154.      *
  155.      * @param string $native    determines if the raw version string should be returned
  156.      * @return array|string    an array or string with version information
  157.      */
  158.     public function getServerVersion($native false)
  159.     {
  160.         $query 'SHOW SERVER_VERSION';
  161.  
  162.         $serverInfo $this->fetchOne($query);
  163.  
  164.         if $native{
  165.             $tmp explode('.'$serverInfo3);
  166.  
  167.             if (empty($tmp[2]&& isset($tmp[1])
  168.                 && preg_match('/(\d+)(.*)/'$tmp[1]$tmp2)
  169.             {
  170.                 $serverInfo array(
  171.                     'major' => $tmp[0],
  172.                     'minor' => $tmp2[1],
  173.                     'patch' => null,
  174.                     'extra' => $tmp2[2],
  175.                     'native' => $serverInfo,
  176.                 );
  177.             else {
  178.                 $serverInfo array(
  179.                     'major' => isset($tmp[0]$tmp[0null,
  180.                     'minor' => isset($tmp[1]$tmp[1null,
  181.                     'patch' => isset($tmp[2]$tmp[2null,
  182.                     'extra' => null,
  183.                     'native' => $serverInfo,
  184.                 );
  185.             }
  186.         }
  187.         return $serverInfo;
  188.     }
  189. }