Source for file jDbTools.class.php

Documentation is available at jDbTools.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage db
  5. @author     Gérald Croes, Laurent Jouanneau
  6. @contributor Laurent Jouanneau, Gwendal Jouannic, Julien Issler
  7. @copyright  2001-2005 CopixTeam, 2005-2011 Laurent Jouanneau
  8. @copyright  2008 Gwendal Jouannic
  9. @copyright  2008 Julien Issler
  10. *
  11. *  This class was get originally from the Copix project (CopixDbTools, CopixDbConnection, Copix 2.3dev20050901, http://www.copix.org)
  12. *  Some lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  13. *  Initial authors of this Copix classes are Gerald Croes and Laurent Jouanneau,
  14. *  and this class was adapted for Jelix by Laurent Jouanneau
  15. *
  16. @link        http://www.jelix.org
  17. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  18. */
  19.  
  20. /**
  21.  * Description of a field of a table
  22.  * @package  jelix
  23.  * @subpackage db
  24.  * @see jDbTools::getFieldList
  25.  */
  26.  class jDbFieldProperties {
  27.  
  28.     /**
  29.      * native type of the field
  30.      * @var string 
  31.      */
  32.     public $type;
  33.  
  34.     /**
  35.      * unified type of the field
  36.      * @var string 
  37.      */
  38.     public $unifiedtype;
  39.  
  40.     /**
  41.      * field name
  42.      * @var string 
  43.      */
  44.     public $name;
  45.  
  46.     /**
  47.      * says if the field can be null or not
  48.      * @var boolean 
  49.      */
  50.     public $notNull=true;
  51.  
  52.     /**
  53.      * says if the field is the primary key
  54.      * @var boolean 
  55.      */
  56.     public $primary=false;
  57.  
  58.     /**
  59.      * says if the field is auto incremented
  60.      * @var boolean 
  61.      */
  62.     public $autoIncrement=false;
  63.  
  64.     /**
  65.      * default value
  66.      * @var string 
  67.      */
  68.     public $default='';
  69.  
  70.     /**
  71.      * says if there is a default value
  72.      * @var boolean 
  73.      */
  74.     public $hasDefault = false;
  75.  
  76.     public $length = 0;
  77.     
  78.      /**
  79.      * if there is a sequence
  80.      * @var string 
  81.      */
  82.     public $sequence = false;
  83.     
  84.     public $unsigned = false;
  85.     
  86.     public $minLength = null;
  87.     
  88.     public $maxLength = null;
  89.     
  90.     public $minValue = null;
  91.     
  92.     public $maxValue = null;
  93. }
  94.  
  95. /**
  96.  * Provides utilities methods for a database
  97.  * @package  jelix
  98.  * @subpackage db
  99.  */
  100. abstract class jDbTools {
  101.  
  102.     public $trueValue = '1';
  103.  
  104.     public $falseValue = '0';
  105.     
  106.     /**
  107.     * the database connector
  108.     * @var jDbConnection 
  109.     */
  110.     protected $_conn;
  111.  
  112.     /**
  113.     * @param jDbConnection $connector the connection to a database
  114.     */
  115.     function __construct($connector null){
  116.         $this->_conn = $connector;
  117.     }
  118.  
  119.     protected $unifiedToPhp = array(
  120.         'boolean'=>'boolean',
  121.         'integer'=>'integer',
  122.         'float'=>'float',
  123.         'double'=>'float',
  124.         'numeric'=>'numeric',
  125.         'decimal'=>'decimal',
  126.         'date'=>'string',
  127.         'time'=>'string',
  128.         'datetime'=>'string',
  129.         'year'=>'string',
  130.         'char'=>'string',
  131.         'varchar'=>'string',
  132.         'text'=>'string',
  133.         'blob'=>'string',
  134.         'binary'=>'string',
  135.         'varbinary'=>'string',
  136.     );
  137.     
  138.     protected $typesInfo = array();
  139.  
  140.  
  141.     /**
  142.      * get informations about the given SQL type
  143.      * @param string $nativeType the SQL type
  144.      * @return array an array which contains characteristics of the type
  145.      *         array ( 'nativetype', 'corresponding unifiedtype', minvalue, maxvalue, minlength, maxlength)
  146.      *  minvalue, maxvalue, minlength, maxlength can be null.
  147.      * @since 1.2
  148.     */
  149.     public function getTypeInfo($nativeType{
  150.         if(isset($this->typesInfo[$nativeType])) {
  151.             $r $this->typesInfo[$nativeType];
  152.         }
  153.         else 
  154.             $r $this->typesInfo['varchar'];
  155.         $r[($nativeType == 'serial' || $nativeType == 'bigserial' ||$nativeType == 'autoincrement' || $nativeType == 'bigautoincrement');
  156.         return $r;
  157.     }
  158.  
  159.     /**
  160.      * return the PHP type corresponding to the given unified type
  161.      * @param string $unifiedType 
  162.      * @return string the php type
  163.      * @since 1.2
  164.     */
  165.     public function unifiedToPHPType($unifiedType{
  166.         if(isset($this->unifiedToPhp[$unifiedType])) {
  167.             return $this->unifiedToPhp[$unifiedType];
  168.         }
  169.         throw new Exception('bad unified type name:'.$unifiedType);
  170.     }
  171.  
  172.     /**
  173.      * @param string $unifiedType  the unified type name
  174.      * @param string $value        the value
  175.      * @return string  the php value corresponding to the type
  176.      * @since 1.2
  177.     */
  178.     public function stringToPhpValue($unifiedType$value$checkNull false{
  179.         if($checkNull && ($value === null ||strtolower($value)=='null'))
  180.             return null;
  181.         switch($this->unifiedToPHPType($unifiedType)) {
  182.             case 'boolean':
  183.                 return ($this->getBooleanValue($value== $this->trueValue);
  184.             case 'integer':
  185.                 return intval($value);
  186.             case 'float':
  187.                 return floatval($value);
  188.             case 'numeric':
  189.             case 'decimal':
  190.                 if(is_numeric($value))
  191.                     return $value;
  192.                 else
  193.                     return floatval($value);
  194.             default:
  195.                 return $value;
  196.         }
  197.     }
  198.  
  199.     /**
  200.      * @param string $unifiedType  the unified type name
  201.      * @param mixed $value        the value
  202.      * @return string  the value which is ready to include a SQL query string
  203.      * @since 1.2
  204.     */
  205.     public function escapeValue($unifiedType$value$checkNull false$toPhpSource false{
  206.         if($checkNull && ($value === null ||strtolower($value)=='null'))
  207.             return 'NULL';
  208.         switch($this->unifiedToPHPType($unifiedType)) {
  209.             case 'boolean':
  210.                 return $this->getBooleanValue($value);
  211.             case 'integer':
  212.                 return (string)intval($value);
  213.             case 'float':
  214.             case 'numeric':
  215.             case 'decimal':
  216.                return jDb::floatToStr($value);
  217.             default:
  218.                 if ($toPhpSource{
  219.                     if ($unifiedType == 'varbinary' || $unifiedType == 'binary'{
  220.                         return '\'.$this->_conn->quote2(\''.str_replace('\'','\\\'',$value).'\',true,true).\'';
  221.                     }
  222.                     else if(strpos($value,"'"!== false{
  223.                         return '\'.$this->_conn->quote(\''.str_replace('\'','\\\'',$value).'\').\'';
  224.                     }
  225.                     else {
  226.                         return "\\'".$value."\\'";
  227.                     }
  228.                 }
  229.                 elseif ($this->_conn)
  230.                     return $this->_conn->quote($value);
  231.                 else
  232.                     return "'".addslashes($value)."'";
  233.         }
  234.     }
  235.  
  236.     /**
  237.      * @param string|boolean$value a value which is a boolean
  238.      * @return string the string value representing a boolean in SQL
  239.      * @since 1.2
  240.     */
  241.     public function getBooleanValue($value{
  242.       if(is_string($value))
  243.           $value strtolower($value);
  244.       if ($value === 'true' || $value === true || intval($value=== || $value === 't' || $value === 'on')
  245.           return $this->trueValue;
  246.       else
  247.           return $this->falseValue;
  248.     }
  249.  
  250.     /**
  251.      * enclose the field name
  252.      * @param string $fieldName the field name
  253.      * @return string the enclosed field name
  254.      * @since 1.2
  255.      */
  256.     public function encloseName($fieldName){
  257.         return $fieldName;
  258.     }
  259.  
  260.     /**
  261.     * returns the table list
  262.     */
  263.     abstract public function getTableList ();
  264.  
  265.     /**
  266.     * retrieve the list of fields of a table
  267.     * @param string $tableName the name of the table
  268.     * @param string $sequence  the sequence used to auto increment the primary key
  269.     * @return   array    keys are field names and values are jDbFieldProperties objects
  270.     */
  271.     abstract public function getFieldList ($tableName$sequence='');
  272.  
  273.     /**
  274.      * regular expression to detect comments and end of query
  275.      */
  276.     protected $dbmsStyle = array('/^\s*#/''/;\s*$/');
  277.  
  278.     public function execSQLScript ($file{
  279.         if(!isset($this->_conn->profile['table_prefix']))
  280.             $prefix '';
  281.         else
  282.             $prefix $this->_conn->profile['table_prefix'];
  283.  
  284.         $lines file($file);
  285.         $cmdSQL '';
  286.         $nbCmd 0;
  287.  
  288.         $style $this->dbmsStyle;
  289.  
  290.         foreach ((array)$lines as $key=>$line{
  291.             if ((!preg_match($style[0],$line))&&(strlen(trim($line))>0)) // la ligne n'est ni vide ni commentaire
  292.                //$line = str_replace("\\'","''",$line);
  293.                //$line = str_replace($this->scriptReplaceFrom, $this->scriptReplaceBy,$line);
  294.                
  295.                 $cmdSQL.=$line;
  296.  
  297.                 if (preg_match($style[1],$line)) {
  298.                     //Si on est à la ligne de fin de la commande on l'execute
  299.                     // On nettoie la commande du ";" de fin et on l'execute
  300.                     $cmdSQL preg_replace($style[1],'',$cmdSQL);
  301.                     $cmdSQL str_replace('%%PREFIX%%'$prefix$cmdSQL);
  302.                     $this->_conn->query ($cmdSQL);
  303.                     $nbCmd++;
  304.                     $cmdSQL '';
  305.                 }
  306.             }
  307.         }
  308.         return $nbCmd;
  309.    }
  310. }

Documentation generated on Mon, 19 Sep 2011 14:12:31 +0200 by phpDocumentor 1.4.3