Source for file pgsql.dbconnection.php

Documentation is available at pgsql.dbconnection.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage db_driver
  5. @author     Gérald Croes, Laurent Jouanneau
  6. @contributor Laurent Jouanneau
  7. @contributor Yannick Le Guédart
  8. @contributor Laurent Raufaste
  9. @contributor Julien Issler
  10. @copyright  2001-2005 CopixTeam, 2005-2012 Laurent Jouanneau, 2007-2008 Laurent Raufaste
  11. @copyright  2009 Julien Issler
  12. *  This class was get originally from the Copix project (CopixDBConnectionPostgreSQL, Copix 2.3dev20050901, http://www.copix.org)
  13. *  Few lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  14. *  Initial authors of this Copix class are Gerald Croes and Laurent Jouanneau,
  15. *  and this class was adapted/improved for Jelix by Laurent Jouanneau
  16. *
  17. @link        http://www.jelix.org
  18. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  19. */
  20. require_once(__DIR__.'/pgsql.dbresultset.php');
  21.  
  22. /**
  23.  *
  24.  * @package    jelix
  25.  * @subpackage db_driver
  26.  */
  27. class pgsqlDbConnection extends jDbConnection {
  28.     protected $_charsets =array'UTF-8'=>'UNICODE''ISO-8859-1'=>'LATIN1');
  29.  
  30.     function __construct($profile){
  31.         if(!function_exists('pg_connect')){
  32.             throw new jException('jelix~db.error.nofunction','posgresql');
  33.         }
  34.         parent::__construct($profile);
  35.         if(isset($this->profile['single_transaction']&& ($this->profile['single_transaction'])){
  36.             $this->beginTransaction();
  37.             $this->setAutoCommit(false);
  38.         }
  39.         else
  40.         {
  41.             $this->setAutoCommit(true);
  42.         }
  43.     }
  44.  
  45.     /**
  46.      * enclose the field name
  47.      * @param string $fieldName the field name
  48.      * @return string the enclosed field name
  49.      * @since 1.1.1
  50.      */
  51.     public function encloseName($fieldName){
  52.         return '"'.$fieldName.'"';
  53.     }
  54.  
  55.     function __destruct(){
  56.         if(isset($this->profile['single_transaction']&& ($this->profile['single_transaction'])){
  57.             $this->commit();
  58.         }
  59.         parent::__destruct();
  60.     }
  61.  
  62.     public function beginTransaction (){
  63.         return $this->_doExec('BEGIN');
  64.     }
  65.  
  66.     public function commit (){
  67.         return $this->_doExec('COMMIT');
  68.     }
  69.  
  70.     public function rollback (){
  71.         return $this->_doExec('ROLLBACK');
  72.     }
  73.  
  74.     public function prepare ($query){
  75.         $id=(string)mktime();
  76.         $res pg_prepare($this->_connection$id$query);
  77.         if($res){
  78.             $rsnew pgsqlDbResultSet ($res$id$this->_connection );
  79.         }else{
  80.             throw new jException('jelix~db.error.query.bad',  pg_last_error($this->_connection).'('.$query.')');
  81.         }
  82.         return $rs;
  83.     }
  84.  
  85.     public function errorInfo(){
  86.         return array'HY000' ,pg_last_error($this->_connection)pg_last_error($this->_connection));
  87.     }
  88.  
  89.     public function errorCode(){
  90.         return pg_last_error($this->_connection);
  91.     }
  92.  
  93.     protected function _connect (){
  94.         $funcconnect(isset($this->profile['persistent']&& $this->profile['persistent''pg_pconnect':'pg_connect');
  95.  
  96.         $str '';
  97.  
  98.         // we do a distinction because if the host is given == TCP/IP connection else unix socket
  99.         if($this->profile['host'!= '')
  100.             $str 'host=\''.$this->profile['host'].'\''.$str;
  101.  
  102.         if (isset($this->profile['port'])) {
  103.             $str .= ' port=\''.$this->profile['port'].'\'';
  104.         }
  105.  
  106.         if ($this->profile['database'!= ''{
  107.             $str .= ' dbname=\''.$this->profile['database'].'\'';
  108.         }
  109.  
  110.         // we do isset instead of equality test against an empty string, to allow to specify
  111.         // that we want to use configuration set in environment variables
  112.         if (isset($this->profile['user'])) {
  113.             $str .= ' user=\''.$this->profile['user'].'\'';
  114.         }
  115.  
  116.         if (isset($this->profile['password'])) {
  117.             $str .= ' password=\''.$this->profile['password'].'\'';
  118.         }
  119.  
  120.         if (isset($this->profile['timeout']&& $this->profile['timeout'!= ''{
  121.             $str .= ' connect_timeout=\''.$this->profile['timeout'].'\'';
  122.         }
  123.  
  124.         // let's do the connection
  125.         if ($cnx @$funcconnect ($str)) {
  126.             if (isset($this->profile['force_encoding']&& $this->profile['force_encoding'== true
  127.                && isset($this->_charsets[jApp::config()->charset])) {
  128.                 pg_set_client_encoding($cnx$this->_charsets[jApp::config()->charset]);
  129.             }
  130.         }
  131.         else {
  132.             throw new jException('jelix~db.error.connection',$this->profile['host']);
  133.         }
  134.  
  135.         if (isset($this->profile['search_path']&& trim($this->profile['search_path']!= ''{
  136.             $sql 'SET search_path TO '.$this->profile['search_path'];
  137.             if (@pg_query($cnx$sql)) {
  138.                 throw new jException('jelix~db.error.query.bad',  pg_last_error($cnx).'('.$sql.')');
  139.             }
  140.         }
  141.         return $cnx;
  142.     }
  143.  
  144.     protected function _disconnect ({
  145.         return pg_close ($this->_connection);
  146.     }
  147.  
  148.     protected function _doQuery ($queryString){
  149.         if ($qI @pg_query ($this->_connection$queryString)){
  150.             $rsnew pgsqlDbResultSet ($qI);
  151.             $rs->_connector $this;
  152.         }else{
  153.             $rs false;
  154.             throw new jException('jelix~db.error.query.bad',  pg_last_error($this->_connection).'('.$queryString.')');
  155.         }
  156.         return $rs;
  157.     }
  158.  
  159.     protected function _doExec($query){
  160.         if($rs $this->_doQuery($query)){
  161.             return pg_affected_rows($rs->id());
  162.         }else
  163.             return 0;
  164.     }
  165.  
  166.     protected function _doLimitQuery ($queryString$offset$number){
  167.         if($number 0)
  168.             $number='ALL';
  169.         $queryString.= ' LIMIT '.$number.' OFFSET '.$offset;
  170.         $this->lastQuery = $queryString;
  171.         $result $this->_doQuery($queryString);
  172.         return $result;
  173.     }
  174.  
  175.     public function lastInsertId($seqname=''){
  176.  
  177.         if($seqname == ''){
  178.             trigger_error(get_class($this).'::lastInstertId invalide sequence name',E_USER_WARNING);
  179.             return false;
  180.         }
  181.         $cur=$this->query("select currval('$seqname') as id");
  182.         if($cur){
  183.             $res=$cur->fetch();
  184.             if($res)
  185.                 return $res->id;
  186.             else
  187.                 return false;
  188.         }else{
  189.             trigger_error(get_class($this).'::lastInstertId invalide sequence name',E_USER_WARNING);
  190.             return false;
  191.         }
  192.     }
  193.  
  194.     protected function _autoCommitNotify ($state){
  195.  
  196.         $this->_doExec('SET AUTOCOMMIT TO '.($state 'ON' 'OFF'));
  197.     }
  198.  
  199.     protected function _quote($text$binary{
  200.         if ($binary)
  201.             return pg_escape_bytea($this->_connection$text);
  202.         else
  203.             return pg_escape_string($this->_connection$text);
  204.     }
  205.  
  206.  
  207.     /**
  208.      *
  209.      * @param integer $id the attribut id
  210.      * @return string the attribute value
  211.      * @see PDO::getAttribute()
  212.      */
  213.     public function getAttribute($id{
  214.         switch($id{
  215.             case self::ATTR_CLIENT_VERSION:
  216.                 $v pg_version($this->_connection);
  217.                 return (array_key_exists($v['client']$v['client''');
  218.             case self::ATTR_SERVER_VERSION:
  219.                 return pg_parameter_status($this->_connection"server_version");
  220.                 break;
  221.         }
  222.         return "";
  223.     }
  224.  
  225.     /**
  226.      * 
  227.      * @param integer $id the attribut id
  228.      * @param string $value the attribute value
  229.      * @see PDO::setAttribute()
  230.      */
  231.     public function setAttribute($id$value{
  232.     }
  233.  
  234. }

Documentation generated on Wed, 04 Jan 2017 22:58:36 +0100 by phpDocumentor 1.4.3