Guest User

SQL-Diff

a guest
Aug 3rd, 2012
473
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function ParseSQLTable($name)
  2. {
  3.         /*
  4.         CREATE TABLE `cms_users` (
  5.         `id` int(10) unsigned NOT NULL auto_increment,
  6.         `group` int(11) NOT NULL default '0',
  7.         `name` varchar(50) NOT NULL default '',
  8.         `pass` varchar(32) NOT NULL default '',
  9.         `avatar` varchar(30) NOT NULL default '/no-avatar.gif',
  10.         `mail` varchar(40) NOT NULL default '',
  11.         PRIMARY KEY  (`id`),
  12.         KEY `group` (`group`,`name`,`pass`)
  13.         ) ENGINE=MyISAM DEFAULT CHARSET=cp1251
  14.  
  15.  
  16.         */
  17.  
  18.         global $db,$cfg;
  19.         $db->query("SHOW CREATE TABLE $name");
  20.         $sql=$db->assoc();
  21.         $sql=end($sql);
  22.         if (!preg_match('#^CREATE TABLE `(.*?)` \((.*)\)(.*)$#si',$sql,$res)) die('Неизвестный формат... Не вдупляю что это =)');
  23.  
  24.         $table['name']=str_replace($cfg['prefix'],'#',trim($res[1]));
  25.         $table['params']=trim($res[3]);
  26.  
  27.         $struct=explode(',',$res[2]);
  28.         $i=0;
  29.         $test=0;
  30.         foreach ($struct as $k=>$v)
  31.         {
  32.                 if (!isset($struct2[++$i])) $struct2[$i]='';
  33.                 $struct2[$i].=trim($v);
  34.                 $test=$test + substr_count($v,'(') - substr_count($v,')');
  35.                 if ($test > 0) $struct2[$i--].=',';
  36.         }
  37.         foreach ($struct2 as $k=>$v)
  38.         {
  39.                 if (!preg_match('#`(.*?)`#',$v,$res)) die($v.' - без понятия где тут название поля');
  40.                 if (strpos($v,'KEY')!==false || strpos($v,'INDEX')!==false)
  41.                 $table['keys'][$res[1]]=$v;
  42.                 else $table['struct'][$res[1]]=$v;
  43.         }
  44.  
  45.         return $table;
  46. }
  47.  
  48.  
  49. function tableDiff($my,$remote)
  50. {
  51.         /*
  52.         // добавить поле
  53.         ALTER TABLE `cms_ank` ADD `test` VARCHAR( 15 ) NOT NULL AFTER `id` ;
  54.         // добавить индекс
  55.         ALTER TABLE `cms_ank` ADD KEY ( `date` )
  56.         ALTER TABLE `cms_ank` ADD KEY `test` ( `date` )
  57.         // изменить поле
  58.         ALTER TABLE `cms_users` CHANGE `group` `group` INT( 11 ) DEFAULT '1' NOT NULL
  59.         // изменить индекс
  60.         ALTER TABLE `cms_users` DROP INDEX `group` ,
  61.         ADD INDEX `group` ( `group` , `name` ) */
  62.  
  63.         $sql='';
  64.  
  65.         // структура
  66.         foreach ($remote['struct'] as $name => $text)
  67.         {
  68.                 if (!isset($my['struct'][$name]))
  69.                 {// если не существует у меня такое поле
  70.                         $sql.="ALTER TABLE `$my[name]` ADD $text;\n"; // добавим
  71.                 } elseif ($my['struct'][$name] != $text)
  72.                 {// если что-то изменено
  73.                         $sql.="ALTER TABLE `$my[name]` CHANGE `$name` $text;\n";
  74.                 }
  75.         }
  76.  
  77.         // индексы
  78.         foreach ($remote['keys'] as $name => $text)
  79.         {
  80.                 if (!isset($my['keys'][$name]))
  81.                 {// если не существует у меня такой индекс
  82.                         $sql.="ALTER TABLE `$my[name]` ADD $text;\n"; // добавим
  83.                 } elseif ($my['keys'][$name] != $text)
  84.                 {// если индекс поменялся
  85.                         $sql.="ALTER TABLE `$my[name]` DROP KEY `$name`, ADD $text;\n";
  86.                 }
  87.         }
  88.         return $sql;
  89.  
  90. }
RAW Paste Data