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.     /**
  30.      * @var array list of profiles currently used
  31.      */
  32.     static private $_profiles null;
  33.     
  34.     /**
  35.      * @var array list of opened connections
  36.      */
  37.     static private $_cnxPool array();
  38.  
  39.     /**
  40.     * return a database connector. It uses a temporay pool of connection to reuse
  41.     * currently opened connections.
  42.     * 
  43.     * @param string  $name  profile name to use. if empty, use the default one
  44.     * @return jDbConnection  the connector
  45.     */
  46.     public static function getConnection ($name null{
  47.         $profile self::getProfile ($name);
  48.  
  49.         // we set the name to avoid two connections for a same profile, when the given name
  50.         // is an alias of a real profile and when we call getConnection several times,
  51.         // with no name, with the alias name or with the real name.
  52.         $name $profile['name'];
  53.  
  54.         if (!isset(self::$_cnxPool[$name])) {
  55.             self::$_cnxPool[$nameself::_createConnector($profile);
  56.         }
  57.         return self::$_cnxPool[$name];
  58.     }
  59.  
  60.     /**
  61.      * create a new jDbWidget
  62.      * @param string  $name  profile name to use. if empty, use the default one
  63.      * @return jDbWidget 
  64.      */
  65.     public static function getDbWidget ($name null{
  66.         $dbw new jDbWidget(self::getConnection($name));
  67.         return $dbw;
  68.     }
  69.  
  70.     /**
  71.     * instancy a jDbTools object. Use jDbConnection::tools() instead.
  72.     * @param string $name profile name to use. if empty, use the default one
  73.     * @return jDbTools 
  74.     * @deprecated since 1.2
  75.     */
  76.     public static function getTools ($name null{
  77.         $cnx self::getConnection ($name);
  78.         return $cnx->tools();
  79.     }
  80.  
  81.     /**
  82.     * load properties of a connector profile
  83.     *
  84.     * a profile is a section in the dbprofils.ini.php file
  85.     *
  86.     * the given name can be a profile name (it should correspond to a section name
  87.     * in the ini file), or an alias of a profile. An alias is a parameter name
  88.     * in the global section of the ini file, and the value of this parameter
  89.     * should be a profile name.
  90.     *
  91.     * @param string   $name  profile name or alias of a profile name. if empty, use the default profile
  92.     * @param boolean  $noDefault  if true and if the profile doesn't exist, throw an error instead of getting the default profile
  93.     * @return array  properties
  94.     */
  95.     public static function getProfile ($name=''$noDefault false{
  96.         global $gJConfig;
  97.         if (self::$_profiles === null{
  98.             self::$_profiles parse_ini_file(JELIX_APP_CONFIG_PATH.$gJConfig->dbProfils true);
  99.         }
  100.  
  101.         if ($name == '')
  102.             $name 'default';
  103.         $targetName $name;
  104.  
  105.         // the name attribute created in this method will be the name of the connection
  106.         // in the connections pool. So profiles of aliases and real profiles should have
  107.         // the same name attribute.
  108.  
  109.         if (isset(self::$_profiles[$name])) {
  110.             if (is_string(self::$_profiles[$name])) {
  111.                 $targetName self::$_profiles[$name];
  112.             }
  113.             else // this is an array, and so a section
  114.                 self::$_profiles[$name]['name'$name;
  115.                 return self::$_profiles[$name];
  116.             }
  117.         }
  118.         // if the profile doesn't exist, we take the default one
  119.         elseif (!$noDefault && isset(self::$_profiles['default'])) {
  120.             trigger_error(jLocale::get('jelix~db.error.profile.use.default'$name)E_USER_NOTICE);
  121.             if (is_string(self::$_profiles['default'])) {
  122.                 $targetName self::$_profiles['default'];
  123.             }
  124.             else {
  125.                 self::$_profiles['default']['name''default';
  126.                 return self::$_profiles['default'];
  127.             }
  128.         }
  129.         else {
  130.             if ($name == 'default')
  131.                 throw new jException('jelix~db.error.default.profile.unknown');
  132.             else
  133.                 throw new jException('jelix~db.error.profile.type.unknown',$name);
  134.         }
  135.  
  136.         if (isset(self::$_profiles[$targetName]&& is_array(self::$_profiles[$targetName])) {
  137.             self::$_profiles[$targetName]['name'$targetName;
  138.             return self::$_profiles[$targetName];
  139.         }
  140.         else {
  141.             throw new jException('jelix~db.error.profile.unknown'$targetName);
  142.         }
  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.         }
  155.         catch(Exception $e{
  156.             $ok false;
  157.         }
  158.         return $ok;
  159.     }
  160.  
  161.     /**
  162.     * create a connector
  163.     * @param array  $profile  profile properties
  164.     * @return jDbConnection|jDbPDOConnection database connector
  165.     */
  166.     private static function _createConnector ($profile{
  167.         if ($profile['driver'== 'pdo' || (isset($profile['usepdo']&& $profile['usepdo'])) {
  168.             $dbh new jDbPDOConnection($profile);
  169.             return $dbh;
  170.         }
  171.         else {
  172.             global $gJConfig;
  173.             if (!isset($gJConfig->_pluginsPathList_db[$profile['driver']])
  174.                 || !file_exists($gJConfig->_pluginsPathList_db[$profile['driver']])) {
  175.                 throw new jException('jelix~db.error.driver.notfound'$profile['driver']);
  176.             }
  177.             $p $gJConfig->_pluginsPathList_db[$profile['driver']].$profile['driver'];
  178.             require_once($p.'.dbconnection.php');
  179.             require_once($p.'.dbresultset.php');
  180.  
  181.             //creating of the connection
  182.             $class $profile['driver'].'DbConnection';
  183.             $dbh new $class ($profile);
  184.             return $dbh;
  185.         }
  186.     }
  187.  
  188.     /**
  189.      * create a temporary new profile
  190.      * @param string $name the name of the profile
  191.      * @param array|string$params parameters of the profile. key=parameter name, value=parameter value.
  192.      *                       same kind of parameters we found in dbprofils.ini.php
  193.      *                       we can also indicate a name of an other profile, to create an alias
  194.      */
  195.     public static function createVirtualProfile ($name$params{
  196.         global $gJConfig;
  197.         if ($name == ''{
  198.            throw new jException('jelix~db.error.virtual.profile.no.name');
  199.         }
  200.  
  201.         if (self::$_profiles === null{
  202.             self::$_profiles parse_ini_file (JELIX_APP_CONFIG_PATH $gJConfig->dbProfilstrue);
  203.         }
  204.         self::$_profiles[$name$params;
  205.         self::$_profiles[$name]['name'$name// pool name
  206.         unset (self::$_cnxPool[$name])// close existing connection with the same pool name
  207.     }
  208.     
  209.     /**
  210.      * clear the loaded profiles to force to reload the db profiles file.
  211.      * WARNING: it closes all opened connections !
  212.      * @since 1.2
  213.      */
  214.     public static function clearProfiles({
  215.         self::$_profiles null;
  216.         self::$_cnxPool  array();
  217.     }
  218.  
  219.     /**
  220.      * perform a convertion float to str. It takes care about the decimal separator
  221.      * which should be a '.' for SQL. Because when doing a native convertion float->str,
  222.      * PHP uses the local decimal separator, and so, we don't want that.
  223.      * @since 1.1.11
  224.      */
  225.     public static function floatToStr($value{
  226.         if (is_float($value)) // this is a float
  227.             return rtrim(sprintf('%.20F'$value)'0')// %F to not format with the local decimal separator
  228.         else if (is_integer($value))
  229.             return sprintf('%d'$value);
  230.         // this is probably a string, so we expect that it contains a numerical value
  231.         // is_numeric is true if the separator is ok for SQL
  232.         // (is_numeric doesn't accept thousand separators nor other character than '.' as decimal separator)
  233.         else if (is_numeric($value))
  234.             return $value;
  235.  
  236.         // we probably have a malformed float number here
  237.         // if so, floatval will ignore all character after an invalid character (a ',' for example)
  238.         // no warning, no exception here, to keep the same behavior of previous Jelix version
  239.         // in order to no break stable applications.
  240.         // FIXME: do a warning in next versions (> 1.2)
  241.         return (string)(floatval($value));
  242.     }
  243. }

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