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

Documentation generated on Mon, 26 Oct 2015 21:53:12 +0100 by phpDocumentor 1.4.3