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

Documentation generated on Thu, 19 Sep 2013 00:03:57 +0200 by phpDocumentor 1.4.3