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.         $log->setRealQuery($this->lastQuery);
  127.         jLog::log($log,'sql');
  128.         return $result;
  129.     }
  130.  
  131.     /**
  132.     * Launch a SQL Query (update, delete..) which doesn't return rows
  133.     * @param   string   $query   the SQL query
  134.     * @return  integer  the number of affected rows. False if the query has failed.
  135.     */
  136.     public function exec ($query{
  137.         $this->lastQuery = $query;
  138.         $log new jSQLLogMessage($query);
  139.         $result $this->_doExec ($query);
  140.         $log->endQuery();
  141.         jLog::log($log,'sql');
  142.         return $result;
  143.     }
  144.  
  145.     /**
  146.     * Escape and quotes strings.
  147.     * @param string $text   string to quote
  148.     * @param int $parameter_type unused, just for compatibility with PDO
  149.     * @return string escaped string
  150.     */
  151.     public function quote ($text$parameter_type 0{
  152.         // for compatibility with older jelix version
  153.         if ($parameter_type === false || $parameter_type === true)
  154.             trigger_error("signature of jDbConnection::quote has changed, you should use quote2()"E_USER_WARNING);
  155.         return "'".$this->_quote($textfalse)."'";
  156.     }
  157.  
  158.     /**
  159.     * Escape and quotes strings. if null, will only return the text "NULL"
  160.     * @param string $text   string to quote
  161.     * @param boolean $checknull if true, check if $text is a null value, and then return NULL
  162.     * @param boolean $binary  set to true if $text contains a binary string
  163.     * @return string escaped string
  164.     * @since 1.2
  165.     */
  166.     public function quote2 ($text$checknull=true$binary=false{
  167.         if ($checknull)
  168.             return (is_null ($text'NULL' "'".$this->_quote($text$binary)."'");
  169.         else
  170.             return "'".$this->_quote($text$binary)."'";
  171.     }
  172.  
  173.     /**
  174.      * enclose the field name
  175.      * @param string $fieldName the field name
  176.      * @return string the enclosed field name
  177.      * @since 1.1.1
  178.      */
  179.     public function encloseName ($fieldName{
  180.         return $fieldName;
  181.     }
  182.     
  183.     /**
  184.      * @deprecated since 1.1.2
  185.      * @see encloseName
  186.      */
  187.     public function encloseFieldName ($fieldName{
  188.         return $this->encloseName($fieldName);
  189.     }
  190.  
  191.     /**
  192.       * Prefix the given table with the prefix specified in the connection's profile
  193.       * If there's no prefix for the connection's profile, return the table's name unchanged.
  194.       *
  195.       * @param string $table the table's name
  196.       * @return string the prefixed table's name
  197.       * @author Julien Issler
  198.       * @since 1.0
  199.       */
  200.     public function prefixTable($table_name){
  201.         if(!isset($this->profile['table_prefix']))
  202.             return $table_name;
  203.         return $this->profile['table_prefix'].$table_name;
  204.     }
  205.  
  206.     /**
  207.       * Check if the current connection has a table prefix set
  208.       *
  209.       * @return boolean 
  210.       * @author Julien Issler
  211.       * @since 1.0
  212.       */
  213.     public function hasTablePrefix(){
  214.         return (isset($this->profile['table_prefix']&& $this->profile['table_prefix'!= '');
  215.     }
  216.  
  217.     /**
  218.     * sets the autocommit state
  219.     * @param boolean $state the status of autocommit
  220.     */
  221.     public function setAutoCommit($state=true){
  222.         $this->_autocommit $state;
  223.         $this->_autoCommitNotify ($this->_autocommit);
  224.     }
  225.  
  226.     /**
  227.      * begin a transaction. Call it before query, limitQuery, exec
  228.      * And then commit() or rollback()
  229.      */
  230.     abstract public function beginTransaction ();
  231.  
  232.     /**
  233.      * validate all queries and close a transaction
  234.      */
  235.     abstract public function commit ();
  236.  
  237.     /**
  238.      * cancel all queries of a transaction and close the transaction
  239.      */
  240.     abstract public function rollback ();
  241.  
  242.     /**
  243.      * prepare a query
  244.      * @param string $query a sql query with parameters
  245.      * @return statement a statement
  246.      */
  247.     abstract public function prepare ($query);
  248.  
  249.     /**
  250.      * @return string the last error description
  251.      */
  252.     abstract public function errorInfo();
  253.  
  254.     /**
  255.      * @return integer the last error code
  256.      */
  257.     abstract public function errorCode();
  258.  
  259.     /**
  260.      * return the id value of the last inserted row.
  261.      * Some driver need a sequence name, so give it at first parameter
  262.      * @param string $fromSequence the sequence name
  263.      * @return integer the id value
  264.      */
  265.     abstract public function lastInsertId($fromSequence='');
  266.  
  267.     /**
  268.      *
  269.      * @param integer $id the attribut id
  270.      * @return string the attribute value
  271.      * @see PDO::getAttribute()
  272.      */
  273.     abstract public function getAttribute($id);
  274.  
  275.     /**
  276.      * 
  277.      * @param integer $id the attribut id
  278.      * @param string $value the attribute value
  279.      * @see PDO::setAttribute()
  280.      */
  281.     abstract public function setAttribute($id$value);
  282.  
  283.     /**
  284.      * return the maximum value of the given primary key in a table
  285.      * @param string $fieldName the name of the primary key
  286.      * @param string $tableName the name of the table
  287.      * @return integer the maximum value
  288.      */
  289.     public function lastIdInTable($fieldName$tableName){
  290.         $rs $this->query ('SELECT MAX('.$fieldName.') as ID FROM '.$tableName);
  291.         if (($rs !== null&& $r $rs->fetch ()){
  292.             return $r->ID;
  293.         }
  294.         return 0;
  295.     }
  296.  
  297.     /**
  298.     * Notify the changes on autocommit
  299.     * Drivers may overload this
  300.     * @param boolean $state the new state of autocommit
  301.     */
  302.     abstract protected function _autoCommitNotify ($state);
  303.  
  304.     /**
  305.     * return a connection identifier or false/null if there is an error
  306.     * @return integer connection identifier
  307.     */
  308.     abstract protected function _connect ();
  309.  
  310.     /**
  311.     * do a disconnection
  312.     * (no need to do a test on the connection id)
  313.     */
  314.     abstract protected function _disconnect ();
  315.  
  316.     /**
  317.     * do a query which return results
  318.     * @return jDbResultSet/boolean 
  319.     */
  320.     abstract protected function _doQuery ($queryString);
  321.     /**
  322.     * do a query which return nothing
  323.     * @return jDbResultSet/boolean 
  324.     */
  325.     abstract protected function _doExec ($queryString);
  326.  
  327.     /**
  328.     * do a query which return a limited number of results
  329.     * @return jDbResultSet/boolean 
  330.     */
  331.     abstract protected function _doLimitQuery ($queryString$offset$number);
  332.  
  333.     /**
  334.     * do the escaping of a string.
  335.     * you should override it into the driver
  336.     * @param string $text the text to escape
  337.     * @param boolean $binary true if the content of the string is a binary content
  338.     */
  339.     protected function _quote($text$binary){
  340.         return addslashes($text);
  341.     }
  342.     
  343.     /**
  344.      * @var jDbTools 
  345.      * @since 1.2
  346.      */
  347.     protected $_tools = null;
  348.     
  349.     /**
  350.      * @return jDbTools 
  351.      * @since 1.2
  352.      */
  353.     public function tools ({
  354.         if (!$this->_tools{
  355.             global $gJConfig;
  356.             require_once($gJConfig->_pluginsPathList_db[$this->dbms].$this->dbms.'.dbtools.php');
  357.             $class $this->dbms.'DbTools';
  358.             $this->_tools = new $class($this);
  359.         }
  360.  
  361.         return $this->_tools;
  362.     }
  363.  
  364.  
  365.     /**
  366.      * @var jDbSchema 
  367.      * @since 1.2
  368.      */
  369.     protected $_schema = null;
  370.     
  371.     /**
  372.      * @return jDbSchema 
  373.      * @since 1.2
  374.      */
  375.     public function schema ({
  376.         if (!$this->_schema{
  377.             global $gJConfig;
  378.             require_once($gJConfig->_pluginsPathList_db[$this->dbms].$this->dbms.'.dbschema.php');
  379.             $class $this->dbms.'DbSchema';
  380.             $this->_schema = new $class($this);
  381.         }
  382.  
  383.         return $this->_schema;
  384.     }
  385.     
  386. }

Documentation generated on Wed, 24 Sep 2014 21:58:28 +0200 by phpDocumentor 1.4.3