Source for file jDb.class.php

Documentation is available at jDb.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  db
  5. @author     Laurent Jouanneau
  6. @contributor Yannick Le Guédart, Laurent Raufaste
  7. @copyright  2005-2011 Laurent Jouanneau
  8. *
  9. *  API ideas of this class were get originally from the Copix project (CopixDbFactory, Copix 2.3dev20050901, http://www.copix.org)
  10. *  No lines of code are copyrighted by CopixTeam
  11. *
  12. @link      http://www.jelix.org
  13. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  14. */
  15.  
  16. /**
  17.  *
  18.  */
  19. require(JELIX_LIB_PATH.'db/jDbConnection.class.php');
  20. require(JELIX_LIB_PATH.'db/jDbResultSet.class.php');
  21.  
  22. /**
  23.  * factory for database connector and other db utilities
  24.  * @package  jelix
  25.  * @subpackage db
  26.  */
  27. class jDb {
  28.  
  29.     static private $_profiles =  null;
  30.     static private $_cnxPool array();
  31.  
  32.     /**
  33.     * return a database connector
  34.     * Use a local pool.
  35.     * @param string  $name  profile name to use. if empty, use the default one
  36.     * @return jDbConnection  connector
  37.     */
  38.     public static function getConnection ($name null){
  39.         $profile self::getProfile ($name);
  40.  
  41.         if (!$name{
  42.             // we set the name to avoid two connection for a same profile, when it is the default profile
  43.             // and when we call getConnection two times, one with no name and on with the name
  44.             $name $profile['name'];
  45.         }
  46.  
  47.         if (!isset(self::$_cnxPool[$name])) {
  48.             self::$_cnxPool[$nameself::_createConnector($profile);
  49.         }
  50.         return self::$_cnxPool[$name];
  51.     }
  52.  
  53.     /**
  54.      * create a new jDbWidget
  55.      * @param string  $name  profile name to use. if empty, use the default one
  56.      * @return jDbWidget 
  57.      */
  58.     public static function getDbWidget($name=null){
  59.         $dbw new jDbWidget(self::getConnection($name));
  60.         return $dbw;
  61.     }
  62.  
  63.     /**
  64.     * instancy a jDbTools object
  65.     * @param string $name profile name to use. if empty, use the default one
  66.     * @return jDbTools 
  67.     */
  68.     public static function getTools ($name=null){
  69.         $profile self::getProfile ($name);
  70.  
  71.         $driver $profile['driver'];
  72.  
  73.         if($driver == 'pdo'){
  74.             preg_match('/^(\w+)\:.*$/',$profile['dsn']$m);
  75.             $driver $m[1];
  76.         }
  77.  
  78.         global $gJConfig;
  79.         if(!isset($gJConfig->_pluginsPathList_db[$driver])
  80.             || !file_exists($gJConfig->_pluginsPathList_db[$driver]) ){
  81.             throw new jException('jelix~db.error.driver.notfound'$driver);
  82.         }
  83.         require_once($gJConfig->_pluginsPathList_db[$driver].$driver.'.dbtools.php');
  84.         $class $driver.'DbTools';
  85.  
  86.         //Création de l'objet
  87.         $cnx self::getConnection ($name);
  88.         $tools new $class ($cnx);
  89.         return $tools;
  90.     }
  91.  
  92.     /**
  93.     * load properties of a connector profile
  94.     *
  95.     * a profile is a section in the dbprofils.ini.php file
  96.     *
  97.     * with getProfile('myprofile') (or getProfile('myprofile', false)), you get the profile which
  98.     * has the name "myprofile". this name should correspond to a section name in the ini file
  99.     *
  100.     * with getProfile('myprofiletype',true), it will search a parameter named 'myprofiletype' in the ini file.
  101.     * This parameter should contains a profile name, and the corresponding profile will be loaded.
  102.     *
  103.     * with getProfile(), it will load the default profile, (so the profile of "default" type)
  104.     *
  105.     * @param string   $name  profile name or profile type to load. if empty, use the default one
  106.     * @param boolean  $nameIsProfileType  says if the name is a profile name or a profile type. this parameter exists since 1.0b2
  107.     * @return array  properties
  108.     */
  109.     public static function getProfile ($name=''$nameIsProfileType=false){
  110.         global $gJConfig;
  111.         if(self::$_profiles === null){
  112.             self::$_profiles parse_ini_file(JELIX_APP_CONFIG_PATH.$gJConfig->dbProfils true);
  113.         }
  114.  
  115.         if($name == ''){
  116.             if(isset(self::$_profiles['default']))
  117.                 $name=self::$_profiles['default'];
  118.             else
  119.                 throw new jException('jelix~db.error.default.profile.unknow');
  120.         }elseif($nameIsProfileType){
  121.             if(isset(self::$_profiles[$name]&& is_string(self::$_profiles[$name])){
  122.                 $name self::$_profiles[$name];
  123.             }else{
  124.                 throw new jException('jelix~db.error.profile.type.unknow',$name);
  125.             }
  126.         }
  127.  
  128.         if(isset(self::$_profiles[$name]&& is_array(self::$_profiles[$name])){
  129.             self::$_profiles[$name]['name'$name;
  130.             return self::$_profiles[$name];
  131.         }else{
  132.             throw new jException('jelix~db.error.profile.unknow',$name);
  133.         }
  134.     }
  135.     
  136.     /**
  137.      * DEPRECATED. same as getProfile
  138.      * @deprecated
  139.      */
  140.     public static function getProfil ($name=''$nameIsProfileType=false){
  141.         trigger_error("jDb::getProfil() is deprecated, you should use jDb::getProfile()"E_USER_NOTICE);
  142.         return self::getProfile($name$nameIsProfileType);
  143.     }
  144.     
  145.     /**
  146.      * call it to test a profile (during an install for example)
  147.      * @param array  $profile  profile properties
  148.      * @return boolean  true if properties are ok
  149.      */
  150.     public function testProfile($profile){
  151.         try{
  152.             self::_createConnector ($profile);
  153.             $ok true;
  154.         }catch(Exception $e){
  155.             $ok false;
  156.         }
  157.         return $ok;
  158.     }
  159.  
  160.     /**
  161.     * create a connector
  162.     * @param array  $profile  profile properties
  163.     * @return jDbConnection|jDbPDOConnection database connector
  164.     */
  165.     private static function _createConnector ($profile){
  166.         if($profile['driver'== 'pdo'){
  167.             $dbh new jDbPDOConnection($profile);
  168.             return $dbh;
  169.         }else{
  170.             global $gJConfig;
  171.             if(!isset($gJConfig->_pluginsPathList_db[$profile['driver']])
  172.                 || !file_exists($gJConfig->_pluginsPathList_db[$profile['driver']]) ){
  173.                 throw new jException('jelix~db.error.driver.notfound'$profile['driver']);
  174.             }
  175.             $p $gJConfig->_pluginsPathList_db[$profile['driver']].$profile['driver'];
  176.             require_once($p.'.dbconnection.php');
  177.             require_once($p.'.dbresultset.php');
  178.  
  179.             //creating of the connection
  180.             $class $profile['driver'].'DbConnection';
  181.             $dbh new $class ($profile);
  182.             return $dbh;
  183.         }
  184.     }
  185.  
  186.     public static function createVirtualProfile ($name$params{
  187.         global $gJConfig;
  188.         if ($name == ''{
  189.            throw new jException('jelix~db.error.virtual.profile.no.name');
  190.         }
  191.  
  192.         if (is_array ($params)) {
  193.            throw new jException('jelix~db.error.virtual.profile.invalid.params'$name);
  194.         }
  195.  
  196.         if (self::$_profiles === null{
  197.             self::$_profiles parse_ini_file (JELIX_APP_CONFIG_PATH $gJConfig->dbProfilstrue);
  198.         }
  199.         self::$_profiles[$name$params;
  200.         unset (self::$_cnxPool[$name]);
  201.     }
  202.  
  203.     /**
  204.      * perform a convertion float to str. It takes care about the decimal separator
  205.      * which should be a '.' for SQL. Because when doing a native convertion float->str,
  206.      * PHP uses the local decimal separator, and so, we don't want that.
  207.      * @since 1.1.11
  208.      */
  209.     public static function floatToStr($value{
  210.         if (is_float($value)) // this is a float
  211.             return rtrim(sprintf('%.20F'$value)'0')// %F to not format with the local decimal separator
  212.         else if (is_integer($value))
  213.             return sprintf('%d'$value);
  214.         // this is probably a string, so we expect that it contains a numerical value
  215.         // is_numeric is true if the separator is ok for SQL
  216.         // (is_numeric doesn't accept thousand separators nor other character than '.' as decimal separator)
  217.         else if (is_numeric($value))
  218.             return $value;
  219.  
  220.         // we probably have a malformed float number here
  221.         // if so, floatval will ignore all character after an invalid character (a ',' for example)
  222.         // no warning, no exception here, to keep the same behavior of previous Jelix version
  223.         // in order to no break stable applications.
  224.         // FIXME: do a warning in next versions (> 1.2)
  225.         return (string)(floatval($value));
  226.     }
  227. }

Documentation generated on Thu, 22 Mar 2012 22:15:15 +0100 by phpDocumentor 1.4.3