Source for file mysql.dbtools.php

Documentation is available at mysql.dbtools.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage db_driver
  5. @author     GĂ©rald Croes, Laurent Jouanneau
  6. @contributor Laurent Jouanneau
  7. @copyright  2001-2005 CopixTeam, 2005-2011 Laurent Jouanneau
  8. *  This class was get originally from the Copix project (CopixDbToolsMysql, Copix 2.3dev20050901, http://www.copix.org)
  9. *  Some lines of code are copyrighted 2001-2005 CopixTeam (LGPL licence).
  10. *  Initial authors of this Copix class are Gerald Croes and Laurent Jouanneau,
  11. *  and this class was adapted/improved for Jelix by Laurent Jouanneau
  12. *
  13. @link      http://www.jelix.org
  14. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  15. */
  16.  
  17. /**
  18.  * Provides utilities methods for a mysql database
  19.  * @package    jelix
  20.  * @subpackage db_driver
  21.  */
  22. class mysqlDbTools extends jDbTools {
  23.  
  24.     protected $typesInfo = array(
  25.       // type                  native type        unified type  minvalue     maxvalue   minlength  maxlength
  26.       'bool'            =>array('boolean',          'boolean',  0,           1,          null,     null),
  27.       'boolean'         =>array('boolean',          'boolean',  0,           1,          null,     null),
  28.       'bit'             =>array('bit',              'integer',  0,           1,          null,     null),
  29.       'tinyint'         =>array('tinyint',          'integer',  -128,        127,        null,     null),
  30.       'smallint'        =>array('smallint',         'integer',  -32768,      32767,      null,     null),
  31.       'mediumint'       =>array('mediumint',        'integer',  -8388608,    8388607,    null,     null),
  32.       'integer'         =>array('integer',          'integer',  -21474836482147483647null,     null),
  33.       'int'             =>array('integer',          'integer',  -21474836482147483647null,     null),
  34.       'bigint'          =>array('bigint',           'numeric',  '-9223372036854775808''9223372036854775807'nullnull),
  35.       'serial'          =>array('integer',          'numeric',  '-9223372036854775808''9223372036854775807'nullnull),
  36.       'bigserial'       =>array('integer',          'numeric',  '-9223372036854775808''9223372036854775807'nullnull),
  37.       'autoincrement'   =>array('integer',          'integer',  -21474836482147483647null,     null)// for old dao files
  38.       'bigautoincrement'=>array('bigint',           'numeric',  '-9223372036854775808''9223372036854775807'nullnull),// for old dao files
  39.  
  40.       'float'           =>array('float',            'float',    null,       null,       null,     null)//4bytes
  41.       'money'           =>array('float',            'float',    null,       null,       null,     null)//4bytes
  42.       'double precision'=>array('double precision''decimal',  null,       null,       null,     null)//8bytes
  43.       'double'          =>array('double precision''decimal',  null,       null,       null,     null)//8bytes
  44.       'real'            =>array('real',             'decimal',  null,       null,       null,     null)//8bytes
  45.       'number'          =>array('real',             'decimal',  null,       null,       null,     null)//8bytes
  46.       'binary_float'    =>array('float',            'float',    null,       null,       null,     null)//4bytes
  47.       'binary_double'   =>array('real',             'decimal',  null,       null,       null,     null)//8bytes
  48.  
  49.       'numeric'         =>array('numeric',          'numeric',  null,       null,       null,     null),
  50.       'decimal'         =>array('decimal',          'decimal',  null,       null,       null,     null),
  51.       'dec'             =>array('decimal',          'decimal',  null,       null,       null,     null),
  52.  
  53.       'date'            =>array('date',       'date',       null,       null,       10,    10),
  54.       'time'            =>array('time',       'time',       null,       null,       8,     8),
  55.       'datetime'        =>array('datetime',   'datetime',   null,       null,       19,    19),
  56.       'timestamp'       =>array('datetime',   'datetime',   null,       null,       19,    19)// oracle/pgsql timestamp
  57.       'utimestamp'      =>array('timestamp',  'integer',    0,          2147483647null,  null)// mysql timestamp
  58.       'year'            =>array('year',       'year',       null,       null,       2,     4),
  59.       'interval'        =>array('datetime',   'datetime',   null,       null,       19,    19),
  60.  
  61.       'char'            =>array('char',       'char',       null,       null,       0,     255),
  62.       'nchar'           =>array('char',       'char',       null,       null,       0,     255),
  63.       'varchar'         =>array('varchar',    'varchar',    null,       null,       0,     65535),
  64.       'varchar2'        =>array('varchar',    'varchar',    null,       null,       0,     4000),
  65.       'nvarchar2'       =>array('varchar',    'varchar',    null,       null,       0,     4000),
  66.       'character'       =>array('varchar',    'varchar',    null,       null,       0,     65535),
  67.       'character varying'=>array('varchar',   'varchar',    null,       null,       0,     65535),
  68.       'name'            =>array('varchar',    'varchar',    null,       null,       0,     64),
  69.       'longvarchar'     =>array('varchar',    'varchar',    null,       null,       0,     65535),
  70.       'string'          =>array('varchar',    'varchar',    null,       null,       0,     65535),// for old dao files
  71.  
  72.       'tinytext'        =>array('tinytext',   'text',       null,       null,       0,     255),
  73.       'text'            =>array('text',       'text',       null,       null,       0,     65535),
  74.       'mediumtext'      =>array('mediumtext''text',       null,       null,       0,     16777215),
  75.       'longtext'        =>array('longtext',   'text',       null,       null,       0,     0),
  76.       'long'            =>array('longtext',   'text',       null,       null,       0,     0),
  77.       'clob'            =>array('longtext',   'text',       null,       null,       0,     0),
  78.       'nclob'           =>array('longtext',   'text',       null,       null,       0,     0),
  79.  
  80.  
  81.       'tinyblob'        =>array('tinyblob',   'varbinary',  null,       null,       0,     255),
  82.       'blob'            =>array('blob',       'varbinary',  null,       null,       0,     65535),
  83.       'mediumblob'      =>array('mediumblob''varbinary',  null,       null,       0,     16777215),
  84.       'longblob'        =>array('longblob',   'varbinary',  null,       null,       0,     0),
  85.       'bfile'           =>array('longblob',   'varbinary',  null,       null,       0,     0),
  86.  
  87.       'bytea'           =>array('longblob',   'varbinary',  null,       null,       0,     0),
  88.       'binary'          =>array('binary',     'binary',     null,       null,       0,     255),
  89.       'varbinary'       =>array('varbinary',  'varbinary',  null,       null,       0,     255),
  90.       'raw'             =>array('varbinary',  'varbinary',  null,       null,       0,     2000),
  91.       'long raw'        =>array('varbinary',  'varbinary',  null,       null,       0,     0),
  92.  
  93.       'enum'            =>array('varchar',    'varchar',    null,       null,       0,     65535),
  94.       'set'             =>array('varchar',    'varchar',    null,       null,       0,     65535),
  95.       'xmltype'         =>array('varchar',    'varchar',    null,       null,       0,     65535),
  96.  
  97.       'point'           =>array('varchar',    'varchar',    null,       null,       0,     16),
  98.       'line'            =>array('varchar',    'varchar',    null,       null,       0,     32),
  99.       'lsed'            =>array('varchar',    'varchar',    null,       null,       0,     32),
  100.       'box'             =>array('varchar',    'varchar',    null,       null,       0,     32),
  101.       'path'            =>array('varchar',    'varchar',    null,       null,       0,     65535),
  102.       'polygon'         =>array('varchar',    'varchar',    null,       null,       0,     65535),
  103.       'circle'          =>array('varchar',    'varchar',    null,       null,       0,     24),
  104.       'cidr'            =>array('varchar',    'varchar',    null,       null,       0,     24),
  105.       'inet'            =>array('varchar',    'varchar',    null,       null,       0,     24),
  106.       'macaddr'         =>array('integer',    'integer',    0,          0xFFFFFFFFFFFFnull,       null),
  107.       'bit varying'     =>array('varchar',    'varchar',    null,       null,       0,     65535),
  108.       'arrays'          =>array('varchar',    'varchar',    null,       null,       0,     65535),
  109.       'complex types'   =>array('varchar',    'varchar',    null,       null,       0,     65535),
  110.     );
  111.  
  112.     public function encloseName($name){
  113.         return '`'.$name.'`';
  114.     }
  115.  
  116.     /**
  117.     * returns the list of tables
  118.     * @return   array    list of table names
  119.     */
  120.     public function getTableList ({
  121.         $results array ();
  122.         if (isset($this->_conn->profile['database'])) {
  123.             $db $this->_conn->profile['database'];
  124.         }
  125.         else if (isset($this->_conn->profile['dsn'])
  126.                  && preg_match('/dbname=([a-z0-9_ ]*)/'$this->_conn->profile['dsn']$m)){
  127.             $db $m[1];
  128.         }
  129.         else {
  130.             throw new jException("jelix~error.no.database.name"$this->_conn->profile['name']);
  131.         }
  132.         $rs $this->_conn->query ('SHOW TABLES FROM '.$this->encloseName($db));
  133.         $col_name 'Tables_in_'.$db;
  134.  
  135.         while ($line $rs->fetch ()){
  136.             $results[$line->$col_name;
  137.         }
  138.  
  139.         return $results;
  140.     }
  141.  
  142.     /**
  143.     * retrieve the list of fields of a table
  144.     * @param string $tableName the name of the table
  145.     * @param string $sequence  the sequence used to auto increment the primary key (not supported here)
  146.     * @return   array    keys are field names and values are jDbFieldProperties objects
  147.     */
  148.     public function getFieldList ($tableName$sequence=''{
  149.  
  150.         $tableName $this->_conn->prefixTable($tableName);
  151.         $results array ();
  152.  
  153.         // get FULL table information (to get comment for label form)
  154.         $rs $this->_conn->query ('SHOW FULL FIELDS FROM `'.$tableName.'`');
  155.  
  156.         while ($line $rs->fetch ()){
  157.             $field new jDbFieldProperties();
  158.  
  159.             if (preg_match('/^(\w+)\s*(\((\d+)\))?.*$/',$line->Type,$m)) {
  160.                 $field->type strtolower($m[1]);
  161.                 if ($field->type == 'varchar' && isset($m[3])) {
  162.                     $field->length intval($m[3]);
  163.                 }
  164.             else {
  165.                 $field->type $line->Type;
  166.             }
  167.             $typeinfo $this->getTypeInfo($field->type);
  168.             $field->unifiedType $typeinfo[1];
  169.             $field->maxValue $typeinfo[3];
  170.             $field->minValue $typeinfo[2];
  171.             $field->maxLength $typeinfo[5];
  172.             $field->minLength $typeinfo[4];
  173.             if ($field->length !=0)
  174.                 $field->maxLength $field->length;
  175.  
  176.             $field->name $line->Field;
  177.             $field->notNull ($line->Null == 'NO');
  178.             $field->primary ($line->Key == 'PRI');
  179.             $field->autoIncrement  ($line->Extra == 'auto_increment');
  180.             $field->hasDefault ($line->Default != '' || !($line->Default == null && $field->notNull));
  181.             // use Mysql comment on dao and form
  182.             if(isset($line->Comment&& $line->Comment!=''{
  183.                 $field->comment $line->Comment;
  184.             }
  185.             // to fix a bug in php 5.2.5 or mysql 5.0.51
  186.             if($field->notNull && $line->Default === null && !$field->autoIncrement)
  187.                 $field->default ='';
  188.             else
  189.                 $field->default $line->Default;
  190.             $results[$line->Field$field;
  191.         }
  192.         return $results;
  193.     }
  194.  
  195.     public function execSQLScript ($file{
  196.         if(!isset($this->_conn->profile['table_prefix']))
  197.             $prefix '';
  198.         else
  199.             $prefix $this->_conn->profile['table_prefix'];
  200.         $sqlQueries str_replace('%%PREFIX%%'$prefixfile_get_contents($file));
  201.         $queries $this->parseSQLScript($sqlQueries);
  202.         foreach($queries as $query)
  203.             $this->_conn->exec($query);
  204.         return count($queries);
  205.     }
  206.  
  207.     /**
  208.      *
  209.      */
  210.     protected function parseSQLScript($script{
  211.  
  212.         $delimiters array();
  213.         $distinctDelimiters array(';');
  214.         if(preg_match_all("/DELIMITER ([^\n]*)/i"$script$dPREG_SET_ORDER)) {
  215.             $delimiters $d[1];
  216.             $distinctDelimiters array_unique(array_merge($distinctDelimiters,$delimiters));
  217.         }
  218.         $preg'';
  219.         foreach($distinctDelimiters as $dd{
  220.             $preg.='|'.preg_quote($dd);
  221.         }
  222.  
  223.         $tokens preg_split('!(\'|"|\\\\|`|DELIMITER |#|/\\*|\\*/|\\-\\-(?=\s)|'."\n".$preg.')!i'$script-1PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_NO_EMPTY);
  224.  
  225.         $currentDelimiter ';';
  226.         $context 0;
  227.         $queries array();
  228.         $query '';
  229.         $previousToken '';
  230.         foreach ($tokens as $k=>$token{
  231.             switch ($context{
  232.             // 0 : statement
  233.             case 0:
  234.                 $previousToken $token;
  235.                 switch($token{
  236.                 case $currentDelimiter:
  237.                     if (preg_replace("/\s/","",$query!= ''{
  238.                         $queries[trim($query);
  239.                     }
  240.                     $query '';
  241.                     break;
  242.                 case '\'':
  243.                     $context 1;
  244.                     $previousToken '';
  245.                     $query.=$token;
  246.                     break;
  247.                 case '"':
  248.                     $context 2;
  249.                     $previousToken '';
  250.                     $query.=$token;
  251.                     break;
  252.                 case '`':
  253.                     $context 3;
  254.                     $query.=$token;
  255.                     $previousToken '';
  256.                     break;
  257.                 case 'DELIMITER ':
  258.                     $context 6;
  259.                     break;
  260.                 case '#':
  261.                 case '--':
  262.                     $context 4;
  263.                     break;
  264.                 case '/*':
  265.                     $context 5;
  266.                     break;
  267.                 case "\n":
  268.                 default :
  269.                     $query.=$token;
  270.                 }
  271.                 break;
  272.             // 1 : string '
  273.             case 1:
  274.                 if ($token =="'"{
  275.                     if ($previousToken != "\\" && $previousToken != "'"{
  276.                         if(isset($tokens[$k+1])) {
  277.                             if ($tokens[$k+1!= "'"{
  278.                                 $context 0;
  279.                             }
  280.                         }
  281.                         else
  282.                             $context 0;
  283.                     }
  284.                 }
  285.                 $previousToken $token;
  286.                 $query.=$token;
  287.                 break;
  288.             // 2 : string "
  289.             case 2:
  290.                 if ($token =='"'{
  291.                     if ($previousToken != "\\" && $previousToken != '"'{
  292.                         if(isset($tokens[$k+1])) {
  293.                             if ($tokens[$k+1!= '"'{
  294.                                 $context 0;
  295.                             }
  296.                         }
  297.                         else
  298.                             $context 0;
  299.                     }
  300.                 }
  301.                 $previousToken $token;
  302.                 $query.=$token;
  303.                 break;
  304.             // 3 : name with `
  305.             case 3:
  306.                 if ($token =='`'{
  307.                     if ($previousToken != "\\" && $previousToken != '`'{
  308.                         if(isset($tokens[$k+1])) {
  309.                             if ($tokens[$k+1!= '`'{
  310.                                 $context 0;
  311.                             }
  312.                         }
  313.                         else
  314.                             $context 0;
  315.                     }
  316.                 }
  317.                 $previousToken $token;
  318.                 $query.=$token;
  319.                 break;
  320.             // 4 : comment single line
  321.             case 4:
  322.                 if ($token == "\n"{
  323.                     //$query.=$token;
  324.                     $context 0;
  325.                 }
  326.                 break;
  327.             // 5 : comment multi line
  328.             case 5:
  329.                 if ($token == "*/"{
  330.                     $context 0;
  331.                 }
  332.                 break;
  333.             // 6 : delimiter definition
  334.             case 6:
  335.                 $currentDelimiter $token;
  336.                 $context 0;
  337.                 break;
  338.             }
  339.  
  340.         }
  341.         if (preg_replace("/\s/","",$query!= ''{
  342.             $queries[trim($query);
  343.         }
  344.         return $queries;
  345.     }
  346. }

Documentation generated on Wed, 04 Jan 2017 22:58:10 +0100 by phpDocumentor 1.4.3