Source for file jDbConnection.class.php

Documentation is available at jDbConnection.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  db
  5. @author      Laurent Jouanneau
  6. @contributor Julien Issler
  7. @copyright   2005-2011 Laurent Jouanneau
  8. @copyright   2007-2009 Julien Issler
  9. *
  10. *  This class was get originally from the Copix project (CopixDbConnection, Copix 2.3dev20050901, http://www.copix.org)
  11. *  However only few lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  12. *  Initial authors of this Copix classes are Gerald Croes and Laurent Jouanneau,
  13. *  and this class was adapted/improved for Jelix by Laurent Jouanneau
  14. *
  15. @link        http://www.jelix.org
  16. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  17. */
  18.  
  19. /**
  20.  * @package  jelix
  21.  * @subpackage db
  22.  */
  23. abstract class jDbConnection {
  24.  
  25.     const FETCH_OBJ 5;
  26.     const FETCH_CLASS 8;
  27.     const FETCH_INTO 9;
  28.     const ATTR_AUTOCOMMIT 0;
  29.     const ATTR_PREFETCH 1;
  30.     const ATTR_TIMEOUT 2;
  31.     const ATTR_ERRMODE 3;
  32.     const ATTR_SERVER_VERSION 4;
  33.     const ATTR_SERVER_INFO 6;
  34.     const ATTR_CLIENT_VERSION 5;
  35.     const ATTR_CONNECTION_STATUS 7;
  36.     const ATTR_CASE 8;
  37.     const ATTR_CURSOR 10;
  38.     const ATTR_ORACLE_NULLS 11;
  39.     const ATTR_PERSISTENT 12;
  40.     const ATTR_DRIVER_NAME 16;
  41.     const CURSOR_FWDONLY 0;
  42.     const CURSOR_SCROLL 1;
  43.  
  44.     /**
  45.     * profile properties used by the connector
  46.     * @var array 
  47.     */
  48.     public $profile;
  49.  
  50.     /**
  51.      * The database type name (mysql, pgsql ...)
  52.      * @var string 
  53.      */
  54.     public $dbms;
  55.  
  56.     /**
  57.     * The last error message if any
  58.     * @var string 
  59.     */
  60.     public $msgError = '';
  61.  
  62.     /**
  63.      * last executed query
  64.      */
  65.     public $lastQuery;
  66.  
  67.     /**
  68.     * Are we using an automatic commit ?
  69.     * @var boolean 
  70.     */
  71.     private $_autocommit true;
  72.  
  73.     /**
  74.     * the internal connection.
  75.     */
  76.     protected $_connection = null;
  77.  
  78.     /**
  79.     * do a connection to the database, using properties of the given profile
  80.     * @param array $profile  profile properties
  81.     */
  82.     function __construct($profile{
  83.         $this->profile = $profile;
  84.         $this->dbms = $profile['driver'];
  85.         $this->_connection = $this->_connect();
  86.     }
  87.  
  88.     function __destruct({
  89.         if ($this->_connection !== null{
  90.             $this->_disconnect ();
  91.         }
  92.     }
  93.  
  94.     /**
  95.     * Launch a SQL Query which returns rows (typically, a SELECT statement)
  96.     * @param string   $queryString   the SQL query
  97.     * @param integer  $fetchmode   FETCH_OBJ, FETCH_CLASS or FETCH_INTO
  98.     * @param string|object    $param   class name if FETCH_CLASS, an object if FETCH_INTO. else null.
  99.     * @param array  $ctoargs  arguments for the constructor if FETCH_CLASS
  100.     * @return  jDbResultSet|boolean False if the query has failed.
  101.     */
  102.     public function query ($queryString$fetchmode self::FETCH_OBJ$arg1 null$ctoargs null{
  103.         $this->lastQuery = $queryString;
  104.         $log new jSQLLogMessage($queryString);
  105.         $result $this->_doQuery ($queryString);
  106.         $log->endQuery();
  107.         jLog::log($log,'sql');
  108.         if ($fetchmode != self::FETCH_OBJ{
  109.             $result->setFetchMode($fetchmode$arg1$ctoargs);
  110.         }
  111.         return $result;
  112.     }
  113.  
  114.     /**
  115.     * Launch a SQL Query with limit parameter, so it returns only a subset of a result
  116.     * @param   string   $queryString   the SQL query
  117.     * @param   integer  $limitOffset   the offset of the first row to return
  118.     * @param   integer  $limitCount    the maximum of number of rows to return
  119.     * @return  jDbResultSet|boolean SQL Select. False if the query has failed.
  120.     */
  121.     public function limitQuery ($queryString$limitOffset$limitCount){
  122.         $this->lastQuery = $queryString;
  123.         $log new jSQLLogMessage($queryString);
  124.         $result $this->_doLimitQuery ($queryStringintval($limitOffset)intval($limitCount));
  125.         $log->endQuery();
  126.         jLog::log($log,'sql');
  127.         return $result;
  128.     }
  129.  
  130.     /**
  131.     * Launch a SQL Query (update, delete..) which doesn't return rows
  132.     * @param   string   $query   the SQL query
  133.     * @return  integer  the number of affected rows. False if the query has failed.
  134.     */
  135.     public function exec ($query{
  136.         $this->lastQuery = $query;
  137.         $log new jSQLLogMessage($query);
  138.         $result $this->_doExec ($query);
  139.         $log->endQuery();
  140.         jLog::log($log,'sql');
  141.         return $result;
  142.     }
  143.  
  144.     /**
  145.     * Escape and quotes strings.
  146.     * @param string $text   string to quote
  147.     * @param int $parameter_type unused, just for compatibility with PDO
  148.     * @return string escaped string
  149.     */
  150.     public function quote ($text$parameter_type 0{
  151.         // for compatibility with older jelix version
  152.         if ($parameter_type === false || $parameter_type === true)
  153.             trigger_error("signature of jDbConnection::quote has changed, you should use quote2()"E_USER_WARNING);
  154.         return "'".$this->_quote($textfalse)."'";
  155.     }
  156.  
  157.     /**
  158.     * Escape and quotes strings. if null, will only return the text "NULL"
  159.     * @param string $text   string to quote
  160.     * @param boolean $checknull if true, check if $text is a null value, and then return NULL
  161.     * @param boolean $binary  set to true if $text contains a binary string
  162.     * @return string escaped string
  163.     * @since 1.2
  164.     */
  165.     public function quote2 ($text$checknull=true$binary=false{
  166.         if ($checknull)
  167.             return (is_null ($text'NULL' "'".$this->_quote($text$binary)."'");
  168.         else
  169.             return "'".$this->_quote($text$binary)."'";
  170.     }
  171.  
  172.     /**
  173.      * enclose the field name
  174.      * @param string $fieldName the field name
  175.      * @return string the enclosed field name
  176.      * @since 1.1.1
  177.      */
  178.     public function encloseName ($fieldName{
  179.         return $fieldName;
  180.     }
  181.     
  182.     /**
  183.      * @deprecated since 1.1.2
  184.      * @see encloseName
  185.      */
  186.     public function encloseFieldName ($fieldName{
  187.         return $this->encloseName($fieldName);
  188.     }
  189.  
  190.     /**
  191.       * Prefix the given table with the prefix specified in the connection's profile
  192.       * If there's no prefix for the connection's profile, return the table's name unchanged.
  193.       *
  194.       * @param string $table the table's name
  195.       * @return string the prefixed table's name
  196.       * @author Julien Issler
  197.       * @since 1.0
  198.       */
  199.     public function prefixTable($table_name){
  200.         if(!isset($this->profile['table_prefix']))
  201.             return $table_name;
  202.         return $this->profile['table_prefix'].$table_name;
  203.     }
  204.  
  205.     /**
  206.       * Check if the current connection has a table prefix set
  207.       *
  208.       * @return boolean 
  209.       * @author Julien Issler
  210.       * @since 1.0
  211.       */
  212.     public function hasTablePrefix(){
  213.         return (isset($this->profile['table_prefix']&& $this->profile['table_prefix'!= '');
  214.     }
  215.  
  216.     /**
  217.     * sets the autocommit state
  218.     * @param boolean $state the status of autocommit
  219.     */
  220.     public function setAutoCommit($state=true){
  221.         $this->_autocommit $state;
  222.         $this->_autoCommitNotify ($this->_autocommit);
  223.     }
  224.  
  225.     /**
  226.      * begin a transaction. Call it before query, limitQuery, exec
  227.      * And then commit() or rollback()
  228.      */
  229.     abstract public function beginTransaction ();
  230.  
  231.     /**
  232.      * validate all queries and close a transaction
  233.      */
  234.     abstract public function commit ();
  235.  
  236.     /**
  237.      * cancel all queries of a transaction and close the transaction
  238.      */
  239.     abstract public function rollback ();
  240.  
  241.     /**
  242.      * prepare a query
  243.      * @param string $query a sql query with parameters
  244.      * @return statement a statement
  245.      */
  246.     abstract public function prepare ($query);
  247.  
  248.     /**
  249.      * @return string the last error description
  250.      */
  251.     abstract public function errorInfo();
  252.  
  253.     /**
  254.      * @return integer the last error code
  255.      */
  256.     abstract public function errorCode();
  257.  
  258.     /**
  259.      * return the id value of the last inserted row.
  260.      * Some driver need a sequence name, so give it at first parameter
  261.      * @param string $fromSequence the sequence name
  262.      * @return integer the id value
  263.      */
  264.     abstract public function lastInsertId($fromSequence='');
  265.  
  266.     /**
  267.      *
  268.      * @param integer $id the attribut id
  269.      * @return string the attribute value
  270.      * @see PDO::getAttribute()
  271.      */
  272.     abstract public function getAttribute($id);
  273.  
  274.     /**
  275.      * 
  276.      * @param integer $id the attribut id
  277.      * @param string $value the attribute value
  278.      * @see PDO::setAttribute()
  279.      */
  280.     abstract public function setAttribute($id$value);
  281.  
  282.     /**
  283.      * return the maximum value of the given primary key in a table
  284.      * @param string $fieldName the name of the primary key
  285.      * @param string $tableName the name of the table
  286.      * @return integer the maximum value
  287.      */
  288.     public function lastIdInTable($fieldName$tableName){
  289.         $rs $this->query ('SELECT MAX('.$fieldName.') as ID FROM '.$tableName);
  290.         if (($rs !== null&& $r $rs->fetch ()){
  291.             return $r->ID;
  292.         }
  293.         return 0;
  294.     }
  295.  
  296.     /**
  297.     * Notify the changes on autocommit
  298.     * Drivers may overload this
  299.     * @param boolean $state the new state of autocommit
  300.     */
  301.     abstract protected function _autoCommitNotify ($state);
  302.  
  303.     /**
  304.     * return a connection identifier or false/null if there is an error
  305.     * @return integer connection identifier
  306.     */
  307.     abstract protected function _connect ();
  308.  
  309.     /**
  310.     * do a disconnection
  311.     * (no need to do a test on the connection id)
  312.     */
  313.     abstract protected function _disconnect ();
  314.  
  315.     /**
  316.     * do a query which return results
  317.     * @return jDbResultSet/boolean 
  318.     */
  319.     abstract protected function _doQuery ($queryString);
  320.     /**
  321.     * do a query which return nothing
  322.     * @return jDbResultSet/boolean 
  323.     */
  324.     abstract protected function _doExec ($queryString);
  325.  
  326.     /**
  327.     * do a query which return a limited number of results
  328.     * @return jDbResultSet/boolean 
  329.     */
  330.     abstract protected function _doLimitQuery ($queryString$offset$number);
  331.  
  332.     /**
  333.     * do the escaping of a string.
  334.     * you should override it into the driver
  335.     * @param string $text the text to escape
  336.     * @param boolean $binary true if the content of the string is a binary content
  337.     */
  338.     protected function _quote($text$binary){
  339.         return addslashes($text);
  340.     }
  341.     
  342.     /**
  343.      * @var jDbTools 
  344.      * @since 1.2
  345.      */
  346.     protected $_tools = null;
  347.     
  348.     /**
  349.      * @return jDbTools 
  350.      * @since 1.2
  351.      */
  352.     public function tools ({
  353.         if (!$this->_tools{
  354.             global $gJConfig;
  355.             require_once($gJConfig->_pluginsPathList_db[$this->dbms].$this->dbms.'.dbtools.php');
  356.             $class $this->dbms.'DbTools';
  357.             $this->_tools = new $class($this);
  358.         }
  359.  
  360.         return $this->_tools;
  361.     }
  362.  
  363.  
  364.     /**
  365.      * @var jDbSchema 
  366.      * @since 1.2
  367.      */
  368.     protected $_schema = null;
  369.     
  370.     /**
  371.      * @return jDbSchema 
  372.      * @since 1.2
  373.      */
  374.     public function schema ({
  375.         if (!$this->_schema{
  376.             global $gJConfig;
  377.             require_once($gJConfig->_pluginsPathList_db[$this->dbms].$this->dbms.'.dbschema.php');
  378.             $class $this->dbms.'DbSchema';
  379.             $this->_schema = new $class($this);
  380.         }
  381.  
  382.         return $this->_schema;
  383.     }
  384.     
  385. }

Documentation generated on Mon, 19 Sep 2011 14:12:27 +0200 by phpDocumentor 1.4.3