Source for file jDbPDOConnection.class.php

Documentation is available at jDbPDOConnection.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage db
  5. @author     Laurent Jouanneau
  6. @contributor Gwendal Jouannic, Thomas
  7. @copyright  2005-2010 Laurent Jouanneau
  8. @copyright  2008 Gwendal Jouannic, 2009 Thomas
  9. @link      http://www.jelix.org
  10. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  11. */
  12.  
  13. /**
  14.  * a resultset based on PDOStatement
  15.  * @package  jelix
  16.  * @subpackage db
  17.  */
  18. class jDbPDOResultSet extends PDOStatement {
  19.  
  20.     const FETCH_CLASS = 8;
  21.  
  22.     protected $_fetchMode = 0;
  23.  
  24.     /**
  25.      * return all results from the statement.
  26.      * Arguments are ignored. JDb don't care about it (fetch always as classes or objects)
  27.      * But there are here because of the compatibility of internal methods of PDOStatement
  28.      * @param integer $fetch_style ignored
  29.      * @param integer $column_index 
  30.      * @param array $ctor_arg  (ignored)
  31.      * @return array list of object which contain all rows
  32.      */
  33.     public function fetchAll $fetch_style jDbPDOConnection::JPDO_FETCH_OBJ$column_index=0$ctor_arg=null ){
  34.         if($this->_fetchMode){
  35.             if$this->_fetchMode != jDbPDOConnection::JPDO_FETCH_COLUMN)
  36.                 return parent::fetchAll($this->_fetchMode);
  37.             else
  38.                 return parent::fetchAll($this->_fetchMode$column_index);
  39.         }else{
  40.             return parent::fetchAlljDbPDOConnection::JPDO_FETCH_OBJ);
  41.         }
  42.     }
  43.  
  44.     /**
  45.      * Set the fetch mode.
  46.      * @param int $mode  the mode, a PDO::FETCH_* constant
  47.      * @param mixed $arg1 a parameter for the given mode
  48.      * @param mixed $arg2 a parameter for the given mode
  49.      */
  50.     public function setFetchMode($mode$arg1=null $arg2=null){
  51.         $this->_fetchMode = $mode;
  52.         // depending the mode, original setFetchMode throw an error if wrong arguments
  53.         // are given, even if there are null
  54.         if ($arg1 === null)
  55.             return parent::setFetchMode($mode);
  56.         else if ($arg2 === null)
  57.             return parent::setFetchMode($mode$arg1);
  58.         return parent::setFetchMode($mode$arg1$arg2);
  59.     }
  60.  
  61. }
  62.  
  63.  
  64. /**
  65.  * A connection object based on PDO
  66.  * @package  jelix
  67.  * @subpackage db
  68.  */
  69. class jDbPDOConnection extends PDO {
  70.  
  71.     /**
  72.     * PDO constant name have been change between php 5.0 and 5.1. So we use our own constant.
  73.     * @link http://lxr.php.net/source/php-src/ext/pdo/php_pdo_driver.h
  74.     * @since 1.0
  75.     */
  76.     const JPDO_FETCH_OBJ = 5// PDO::FETCH_OBJ
  77.     const JPDO_FETCH_ORI_NEXT = 0// PDO::FETCH_ORI_NEXT
  78.     const JPDO_FETCH_ORI_FIRST = 2;
  79.     const JPDO_FETCH_COLUMN = 7// PDO::FETCH_COLUMN
  80.     const JPDO_FETCH_CLASS = 8// PDO::FETCH_CLASS
  81.     const JPDO_ATTR_STATEMENT_CLASS = 13//PDO::ATTR_STATEMENT_CLASS
  82.     const JPDO_ATTR_AUTOCOMMIT = 0//PDO::ATTR_AUTOCOMMIT
  83.     const JPDO_ATTR_CURSOR = 10// PDO::ATTR_CURSOR
  84.     const JPDO_CURSOR_SCROLL = 1//PDO::CURSOR_SCROLL
  85.     const JPDO_ATTR_ERRMODE = 3// PDO::ATTR_ERRMODE
  86.     const JPDO_ERRMODE_EXCEPTION = 2// PDO::ERRMODE_EXCEPTION
  87.     const JPDO_MYSQL_ATTR_USE_BUFFERED_QUERY = 1000// PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
  88.     const JPDO_ATTR_CASE = 8// PDO::ATTR_CASE
  89.     const JPDO_CASE_LOWER = 2// PDO::CASE_LOWER
  90.  
  91.     private $_mysqlCharsets =array'UTF-8'=>'utf8''ISO-8859-1'=>'latin1');
  92.     private $_pgsqlCharsets =array'UTF-8'=>'UNICODE''ISO-8859-1'=>'LATIN1');
  93.  
  94.     /**
  95.      * the profil the connection is using
  96.      * @var array 
  97.      */
  98.     public $profil;
  99.  
  100.     /**
  101.      * The database type name (mysql, pgsql ...)
  102.      */
  103.     public $dbms;
  104.  
  105.     /**
  106.      * Use a profil to do the connection
  107.      */
  108.     function __construct($profil){
  109.         $this->profil = $profil;
  110.         $this->dbms=substr($profil['dsn'],0,strpos($profil['dsn'],':'));
  111.         $prof=$profil;
  112.         $user'';
  113.         $password='';
  114.         unset($prof['dsn']);
  115.         if(isset($prof['user']))// sqlite par ex n'a pas besoin de user/password -> on test alors leur presence
  116.             $user =$prof['user'];
  117.             unset($prof['user']);
  118.         }
  119.         if(isset($prof['password'])){
  120.             $password $profil['password'];
  121.             unset($prof['password']);
  122.         }
  123.         unset($prof['driver']);
  124.         parent::__construct($profil['dsn']$user$password$prof);
  125.         $this->setAttribute(self::JPDO_ATTR_STATEMENT_CLASSarray('jDbPDOResultSet'));
  126.         $this->setAttribute(self::JPDO_ATTR_ERRMODEself::JPDO_ERRMODE_EXCEPTION);
  127.         // on ne peut pas lancer deux query en même temps avec PDO ! sauf si on utilise mysql
  128.         // et que l'on utilise cet attribut...
  129.         if($this->dbms == 'mysql')
  130.             $this->setAttribute(self::JPDO_MYSQL_ATTR_USE_BUFFERED_QUERYtrue);
  131.     
  132.         // Oracle renvoie les noms de colonnes en majuscules, il faut donc forcer la casse en minuscules
  133.         if ($this->dbms == 'oci')
  134.             $this->setAttribute(self::JPDO_ATTR_CASEself::JPDO_CASE_LOWER);            
  135.             
  136.         if(isset($prof['force_encoding']&& $prof['force_encoding']==true){
  137.             if($this->dbms == 'mysql' && isset($this->_mysqlCharsets[$GLOBALS['gJConfig']->charset])){
  138.                 $this->exec("SET NAMES '".$this->_mysqlCharsets[$GLOBALS['gJConfig']->charset]."'");
  139.             }elseif($this->dbms == 'pgsql' && isset($this->_pgsqlCharsets[$GLOBALS['gJConfig']->charset])){
  140.                 $this->exec("SET client_encoding to '".$this->_pgsqlCharsets[$GLOBALS['gJConfig']->charset]."'");
  141.             }
  142.         }
  143.     }
  144.  
  145.     /**
  146.      * @internal the implementation of Iterator on PDOStatement doesn't call fetch method of classes which inherit of PDOStatement
  147.      *  so, we cannot indicate to fetch object directly in jDbPDOResultSet::fetch(). So we overload query() to do it.
  148.      */
  149.     public function query(){
  150.         $args=func_get_args();
  151.         switch(count($args)){
  152.         case 1:
  153.             $rs parent::query($args[0]);
  154.             $rs->setFetchMode(self::JPDO_FETCH_OBJ);
  155.             return $rs;
  156.             break;
  157.         case 2:
  158.             return parent::query($args[0]$args[1]);
  159.             break;
  160.         case 3:
  161.             return parent::query($args[0]$args[1]$args[2]);
  162.             break;
  163.         default:
  164.             trigger_error('bad argument number in query',E_USER_ERROR);
  165.         }
  166.  
  167.     }
  168.  
  169.     public function limitQuery ($queryString$limitOffset null$limitCount null){
  170.         if ($limitOffset !== null && $limitCount !== null){
  171.            if($this->dbms == 'mysql' || $this->dbms == 'sqlite'){
  172.                $queryString.= ' LIMIT '.intval($limitOffset).','intval($limitCount);
  173.            }elseif($this->dbms == 'pgsql'){
  174.                $queryString.= ' LIMIT '.intval($limitCount).' OFFSET '.intval($limitOffset);
  175.            }
  176.         }
  177.         $result $this->query ($queryString);
  178.         return $result;
  179.     }
  180.  
  181.     /**
  182.      * sets the autocommit state
  183.      * @param boolean state the status of autocommit
  184.      */
  185.     public function setAutoCommit($state=true){
  186.         $this->setAttribute(self::JPDO_ATTR_AUTOCOMMIT,$state);
  187.     }
  188.  
  189.     public function lastIdInTable($fieldName$tableName){
  190.       $rs $this->query ('SELECT MAX('.$fieldName.') as ID FROM '.$tableName);
  191.       if (($rs !== null&& $r $rs->fetch ()){
  192.          return $r->ID;
  193.       }
  194.       return 0;
  195.     }
  196.  
  197.     /**
  198.      * Prefix the given table with the prefix specified in the connection's profile
  199.      * If there's no prefix for the connection's profile, return the table's name unchanged.
  200.      *
  201.      * @param string $table the table's name
  202.      * @return string the prefixed table's name
  203.      * @author Julien Issler
  204.      * @since 1.0
  205.      */
  206.     public function prefixTable($table_name){
  207.         if(!isset($this->profil['table_prefix']))
  208.             return $table_name;
  209.         return $this->profil['table_prefix'].$table_name;
  210.     }
  211.  
  212.     /**
  213.      * Check if the current connection has a table prefix set
  214.      *
  215.      * @return boolean 
  216.      * @author Julien Issler
  217.      * @since 1.0
  218.      */
  219.     public function hasTablePrefix(){
  220.         return (isset($this->profil['table_prefix']&& $this->profil['table_prefix']!='');
  221.     }
  222. }
  223. ?>

Documentation generated on Wed, 07 Sep 2011 13:47:12 +0200 by phpDocumentor 1.4.3