Source for file Pgsql.php

Documentation is available at Pgsql.php

  1. <?php
  2. /*
  3.  *  $Id: Pgsql.php 2276 2007-08-25 08:06:17Z 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_Expression_Driver');
  22. /**
  23.  * Doctrine_Expression_Pgsql
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @category    Object Relational Mapping
  28.  * @link        www.phpdoctrine.com
  29.  * @since       1.0
  30.  * @version     $Revision: 2276 $
  31.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  32.  */
  33. {
  34.     /**
  35.      * Returns the md5 sum of a field.
  36.      *
  37.      * Note: Not SQL92, but common functionality
  38.      *
  39.      * md5() works with the default PostgreSQL 8 versions.
  40.      *
  41.      * If you are using PostgreSQL 7.x or older you need
  42.      * to make sure that the digest procedure is installed.
  43.      * If you use RPMS (Redhat and Mandrake) install the postgresql-contrib
  44.      * package. You must then install the procedure by running this shell command:
  45.      * <code>
  46.      * psql [dbname] < /usr/share/pgsql/contrib/pgcrypto.sql
  47.      * </code>
  48.      * You should make sure you run this as the postgres user.
  49.      *
  50.      * @return string 
  51.      */
  52.     public function md5($column)
  53.     {
  54.         $column $this->getIdentifier($column);
  55.  
  56.         if ($this->version 7{
  57.             return 'MD5(' $column ')';
  58.         else {
  59.             return 'encode(digest(' $column .', md5), hex)';
  60.         }
  61.     }
  62.  
  63.     /**
  64.      * Returns part of a string.
  65.      *
  66.      * Note: Not SQL92, but common functionality.
  67.      *
  68.      * @param string $value the target $value the string or the string column.
  69.      * @param int $from extract from this characeter.
  70.      * @param int $len extract this amount of characters.
  71.      * @return string sql that extracts part of a string.
  72.      */
  73.     public function substring($value$from$len null)
  74.     {
  75.         $value $this->getIdentifier($value);
  76.  
  77.         if ($len === null{
  78.             $len $this->getIdentifier($len);
  79.             return 'SUBSTR(' $value ', ' $from ')';
  80.         else {
  81.             return 'SUBSTR(' $value ', ' $from ', ' $len ')';
  82.         }
  83.     }
  84.  
  85.     /**
  86.      * Returns a series of strings concatinated
  87.      *
  88.      * concat() accepts an arbitrary number of parameters. Each parameter
  89.      * must contain an expression or an array with expressions.
  90.      *
  91.      * @param string|array(string)strings that will be concatinated.
  92.      * @return string 
  93.      */
  94.  
  95.  
  96.     /**
  97.      * PostgreSQLs AGE(<timestamp1> [, <timestamp2>]) function.
  98.      *
  99.      * @param string $timestamp1 timestamp to subtract from NOW()
  100.      * @param string $timestamp2 optional; if given: subtract arguments
  101.      * @return string 
  102.      */
  103.     public function age($timestamp1$timestamp2 null{
  104.        if$timestamp2 == null {
  105.            return 'AGE(' $timestamp1 ')';
  106.        }
  107.        return 'AGE(' $timestamp1 ', ' $timestamp2 ')';
  108.     }
  109.  
  110.     /**
  111.      * PostgreSQLs DATE_PART( <text>, <time> ) function.
  112.      *
  113.      * @param string $text what to extract
  114.      * @param string $time timestamp or interval to extract from
  115.      * @return string 
  116.      */
  117.     public function date_part($text$time{
  118.        return 'DATE_PART(' $text ', ' $time ')';
  119.     }
  120.  
  121.  
  122.     public function concat()
  123.     {
  124.         $args func_get_args();
  125.  
  126.         return join(' || ' $args);
  127.     }
  128.     /**
  129.      * Returns the SQL string to return the current system date and time.
  130.      *
  131.      * @return string 
  132.      */
  133.     public function now()
  134.     {
  135.         return 'LOCALTIMESTAMP(0)';
  136.     }
  137.     /**
  138.      * regexp
  139.      *
  140.      * @return string           the regular expression operator
  141.      */
  142.     public function regexp()
  143.     {
  144.         return 'SIMILAR TO';
  145.     }
  146.     /**
  147.      * return string to call a function to get random value inside an SQL statement
  148.      *
  149.      * @return return string to generate float between 0 and 1
  150.      * @access public
  151.      */
  152.     public function random()
  153.     {
  154.         return 'RANDOM()';
  155.     }
  156.     /**
  157.      * build a pattern matching string
  158.      *
  159.      * EXPERIMENTAL
  160.      *
  161.      * WARNING: this function is experimental and may change signature at
  162.      * any time until labelled as non-experimental
  163.      *
  164.      * @access public
  165.      *
  166.      * @param array $pattern even keys are strings, odd are patterns (% and _)
  167.      * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
  168.      * @param string $field optional field name that is being matched against
  169.      *                   (might be required when emulating ILIKE)
  170.      *
  171.      * @return string SQL pattern
  172.      */
  173.     public function matchPattern($pattern$operator null$field null)
  174.     {
  175.         $match '';
  176.         if (!is_null($operator)) {
  177.             $field is_null($field'' $field.' ';
  178.             $operator strtoupper($operator);
  179.             switch ($operator{
  180.                 // case insensitive
  181.                 case 'ILIKE':
  182.                     $match $field.'ILIKE ';
  183.                     break;
  184.                 // case sensitive
  185.                 case 'LIKE':
  186.                     $match $field.'LIKE ';
  187.                     break;
  188.                 default:
  189.                     throw new Doctrine_Expression_Pgsql_Exception('not a supported operator type:'$operator);
  190.             }
  191.         }
  192.         $match.= "'";
  193.         foreach ($pattern as $key => $value{
  194.             if ($key 2{
  195.                 $match.= $value;
  196.             else {
  197.                 $match.= $this->conn->escapePattern($this->conn->escape($value));
  198.             }
  199.         }
  200.         $match.= "'";
  201.         $match.= $this->patternEscapeString();
  202.         return $match;
  203.     }
  204. }