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.      * dao and form use this feature
  96.      */
  97.      public $comment;
  98. }
  99.  
  100. /**
  101.  * Provides utilities methods for a database
  102.  * @package  jelix
  103.  * @subpackage db
  104.  */
  105. abstract class jDbTools {
  106.  
  107.     public $trueValue = '1';
  108.  
  109.     public $falseValue = '0';
  110.     
  111.     /**
  112.     * the database connector
  113.     * @var jDbConnection 
  114.     */
  115.     protected $_conn;
  116.  
  117.     /**
  118.     * @param jDbConnection $connector the connection to a database
  119.     */
  120.     function __construct($connector null){
  121.         $this->_conn = $connector;
  122.     }
  123.  
  124.     protected $unifiedToPhp = array(
  125.         'boolean'=>'boolean',
  126.         'integer'=>'integer',
  127.         'float'=>'float',
  128.         'double'=>'float',
  129.         'numeric'=>'numeric',
  130.         'decimal'=>'decimal',
  131.         'date'=>'string',
  132.         'time'=>'string',
  133.         'datetime'=>'string',
  134.         'year'=>'string',
  135.         'char'=>'string',
  136.         'varchar'=>'string',
  137.         'text'=>'string',
  138.         'blob'=>'string',
  139.         'binary'=>'string',
  140.         'varbinary'=>'string',
  141.     );
  142.     
  143.     protected $typesInfo = array();
  144.  
  145.  
  146.     /**
  147.      * Get informations about the given SQL type
  148.      * @param string $nativeType the SQL type
  149.      * @return array an array which contains characteristics of the type
  150.      *         array ( 'nativetype', 'corresponding unifiedtype', minvalue, maxvalue, minlength, maxlength)
  151.      *  minvalue, maxvalue, minlength, maxlength can be null.
  152.      * @since 1.2
  153.     */
  154.     public function getTypeInfo($nativeType{
  155.         if(isset($this->typesInfo[$nativeType])) {
  156.             $r $this->typesInfo[$nativeType];
  157.         }
  158.         else 
  159.             $r $this->typesInfo['varchar'];
  160.         $r[($nativeType == 'serial' || $nativeType == 'bigserial' || $nativeType == 'autoincrement' || $nativeType == 'bigautoincrement');
  161.         return $r;
  162.     }
  163.  
  164.     /**
  165.      * Return the PHP type corresponding to the given unified type
  166.      * @param string $unifiedType 
  167.      * @return string the php type
  168.      * @since 1.2
  169.     */
  170.     public function unifiedToPHPType($unifiedType{
  171.         if(isset($this->unifiedToPhp[$unifiedType])) {
  172.             return $this->unifiedToPhp[$unifiedType];
  173.         }
  174.         throw new Exception('bad unified type name:' $unifiedType);
  175.     }
  176.  
  177.     /**
  178.      * @param string $unifiedType  the unified type name
  179.      * @param string $value        the value
  180.      * @return string  the php value corresponding to the type
  181.      * @since 1.2
  182.     */
  183.     public function stringToPhpValue($unifiedType$value$checkNull false{
  184.         if($checkNull && ($value === null ||strtolower($value)=='null'))
  185.             return null;
  186.         switch($this->unifiedToPHPType($unifiedType)) {
  187.             case 'boolean':
  188.                 return ($this->getBooleanValue($value== $this->trueValue);
  189.             case 'integer':
  190.                 return intval($value);
  191.             case 'float':
  192.                 return floatval($value);
  193.             case 'numeric':
  194.             case 'decimal':
  195.                 if(is_numeric($value))
  196.                     return $value;
  197.                 else
  198.                     return floatval($value);
  199.             default:
  200.                 return $value;
  201.         }
  202.     }
  203.  
  204.     /**
  205.      * @param string $unifiedType  the unified type name
  206.      * @param mixed $value        the value
  207.      * @return string  the value which is ready to include a SQL query string
  208.      * @since 1.2
  209.     */
  210.     public function escapeValue($unifiedType$value$checkNull false$toPhpSource false{
  211.         if($checkNull && ($value === null ||strtolower($value)=='null'))
  212.             return 'NULL';
  213.         switch($this->unifiedToPHPType($unifiedType)) {
  214.             case 'boolean':
  215.                 return $this->getBooleanValue($value);
  216.             case 'integer':
  217.                 return (string)intval($value);
  218.             case 'float':
  219.             case 'numeric':
  220.             case 'decimal':
  221.                return jDb::floatToStr($value);
  222.             default:
  223.                 if ($toPhpSource{
  224.                     if ($unifiedType == 'varbinary' || $unifiedType == 'binary'{
  225.                         return '\'.$this->_conn->quote2(\''.str_replace('\'','\\\'',$value).'\',true,true).\'';
  226.                     }
  227.                     else if(strpos($value,"'"!== false{
  228.                         return '\'.$this->_conn->quote(\''.str_replace('\'','\\\'',$value).'\').\'';
  229.                     }
  230.                     else {
  231.                         return "\\'".$value."\\'";
  232.                     }
  233.                 }
  234.                 elseif ($this->_conn)
  235.                     return $this->_conn->quote($value);
  236.                 else
  237.                     return "'".addslashes($value)."'";
  238.         }
  239.     }
  240.  
  241.     /**
  242.      * @param string|boolean$value a value which is a boolean
  243.      * @return string the string value representing a boolean in SQL
  244.      * @since 1.2
  245.     */
  246.     public function getBooleanValue($value{
  247.       if(is_string($value))
  248.           $value strtolower($value);
  249.       if ($value === 'true' || $value === true || intval($value=== || $value === 't' || $value === 'on')
  250.           return $this->trueValue;
  251.       else
  252.           return $this->falseValue;
  253.     }
  254.  
  255.     /**
  256.      * Rnclose the field name
  257.      * @param string $fieldName the field name
  258.      * @return string the enclosed field name
  259.      * @since 1.2
  260.      */
  261.     public function encloseName($fieldName){
  262.         return $fieldName;
  263.     }
  264.  
  265.     /**
  266.     * <teturns the table list
  267.     */
  268.     abstract public function getTableList ();
  269.  
  270.     /**
  271.     * Retrieve the list of fields of a table
  272.     * @param string $tableName the name of the table
  273.     * @param string $sequence  the sequence used to auto increment the primary key
  274.     * @return   array    keys are field names and values are jDbFieldProperties objects
  275.     */
  276.     abstract public function getFieldList ($tableName$sequence='');
  277.  
  278.     /**
  279.      * regular expression to detect comments and end of query
  280.      */
  281.     protected $dbmsStyle = array('/^\s*#/''/;\s*$/');
  282.  
  283.     public function execSQLScript ($file{
  284.         if(!isset($this->_conn->profile['table_prefix']))
  285.             $prefix '';
  286.         else
  287.             $prefix $this->_conn->profile['table_prefix'];
  288.  
  289.         $lines file($file);
  290.         $cmdSQL '';
  291.         $nbCmd 0;
  292.  
  293.         $style $this->dbmsStyle;
  294.  
  295.         foreach ((array)$lines as $key=>$line{
  296.             if ((!preg_match($style[0],$line))&&(strlen(trim($line))>0)) // The line isn't empty and isn't a comment
  297.                //$line = str_replace("\\'","''",$line);
  298.                //$line = str_replace($this->scriptReplaceFrom, $this->scriptReplaceBy,$line);
  299.                
  300.                 $cmdSQL.=$line;
  301.  
  302.                 if (preg_match($style[1],$line)) {
  303.                     // If at the last line of the command, execute it
  304.                     // Cleanup the command from the ending ";" and execute it
  305.                     $cmdSQL preg_replace($style[1],'',$cmdSQL);
  306.                     $cmdSQL str_replace('%%PREFIX%%'$prefix$cmdSQL);
  307.                     $this->_conn->exec ($cmdSQL);
  308.                     $nbCmd++;
  309.                     $cmdSQL '';
  310.                 }
  311.             }
  312.         }
  313.         return $nbCmd;
  314.    }
  315. }

Documentation generated on Wed, 04 Jan 2017 22:53:57 +0100 by phpDocumentor 1.4.3