|
@@ -1,4 +1,4 @@
|
|
|
-<?php // $Id: compare_db.php 10519 2006-12-18 17:12:37Z yannoo $
|
|
|
+<?php // $Id: compare_db.php 10520 2006-12-18 23:14:27Z yannoo $
|
|
|
/*
|
|
|
==============================================================================
|
|
|
Dokeos - elearning and course management software
|
|
@@ -58,22 +58,35 @@ $prefix_old = 'dokeos160_';
|
|
|
$bases_old=array($prefix_old.'dokeos_main',$prefix_old.'dokeos_stats',$prefix_old.'dokeos_user',$prefix_old.'COURSE',$prefix_old.'dokeos_scorm');
|
|
|
$db_old = mysql_connect($sql_server_old,$sql_user_old,$sql_pass_old) or die(mysql_error());
|
|
|
|
|
|
+$field_details = array(0=>'Field',1=>'Type',2=>'Null',3=>'Key',4=>'Default',5=>'Extra');
|
|
|
+
|
|
|
/********************************/
|
|
|
|
|
|
+$all_db_changes = array();
|
|
|
+
|
|
|
+echo "<h1>Databases structure comparison script</h1>";
|
|
|
+
|
|
|
+//iterate through databases given above (checking from the 'new' database side)
|
|
|
foreach($bases_new as $num_base=>$base)
|
|
|
{
|
|
|
+ //init tables lists for this database
|
|
|
$modif_tables=array();
|
|
|
$tables_db_new=array();
|
|
|
$tables_db_old=array();
|
|
|
$dump=array();
|
|
|
-
|
|
|
+
|
|
|
+ //display current processed database
|
|
|
+ echo "<h2>Now analysing differences between databases <em>$base</em> and <em>".$bases_old[$num_base]."</em></h2>";
|
|
|
+
|
|
|
+ //get a list of tables for this database
|
|
|
$query_new="SHOW TABLES FROM ".$bases_new[$num_base];
|
|
|
$result_new=mysql_query($query_new,$db_new);
|
|
|
|
|
|
- if($result_new)
|
|
|
+ if($result_new) //if there are tables in this database
|
|
|
{
|
|
|
$i=0;
|
|
|
|
|
|
+ //as there are tables, process them one by one
|
|
|
while($row_new=mysql_fetch_row($result_new))
|
|
|
{
|
|
|
$dump[$i]['table_name']=$row_new[0];
|
|
@@ -84,6 +97,7 @@ foreach($bases_new as $num_base=>$base)
|
|
|
|
|
|
$j=0;
|
|
|
|
|
|
+ //get the fields details (numbered fields)
|
|
|
while($row_old=mysql_fetch_row($result_old))
|
|
|
{
|
|
|
$dump[$i]['fields'][$j][0]=$row_old[0];
|
|
@@ -92,6 +106,8 @@ foreach($bases_new as $num_base=>$base)
|
|
|
$dump[$i]['fields'][$j][3]=$row_old[3];
|
|
|
$dump[$i]['fields'][$j][4]=$row_old[4];
|
|
|
$dump[$i]['fields'][$j][5]=$row_old[5];
|
|
|
+ //get the field name in one special element of this array
|
|
|
+ $dump[$i]['field_names'][$row_old[0]]=$j;
|
|
|
|
|
|
$j++;
|
|
|
}
|
|
@@ -106,37 +122,59 @@ foreach($bases_new as $num_base=>$base)
|
|
|
|
|
|
if(!$result)
|
|
|
{
|
|
|
- $modif_tables[]=$table['table_name'];
|
|
|
+ $modif_tables[]='**'.$table['table_name'].'**';
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
$i=0;
|
|
|
-
|
|
|
- if(sizeof($table['fields']) != mysql_num_rows($result))
|
|
|
- {
|
|
|
- $modif_tables[]=$table['table_name'];
|
|
|
+
|
|
|
+ //check for removed, new or modified fields
|
|
|
+ $fields_old = array();
|
|
|
+ $fields_new = array();
|
|
|
+ //list the new fields in a enumeration array
|
|
|
+ foreach($table['field_names'] as $dummy_key=>$dummy_field){
|
|
|
+ $fields_new[] = $dummy_key;
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- while($row=mysql_fetch_row($result))
|
|
|
- {
|
|
|
- $field_infos=$table['fields'][$i];
|
|
|
-
|
|
|
- foreach($row as $key=>$enreg)
|
|
|
+ //list the old fields in an enumeration array and check if their corresponding
|
|
|
+ //field in the new table is different (if any)
|
|
|
+ $modif_fields = array();
|
|
|
+ while($row_old = mysql_fetch_row($result)){
|
|
|
+ $fields_old[] = $row_old[0];
|
|
|
+ $modif_field = '';
|
|
|
+ if(isset($table['fields'][$table['field_names'][$row_old[0]]])){
|
|
|
+ $field_infos=$table['fields'][$table['field_names'][$row_old[0]]];
|
|
|
+ foreach($row_old as $key=>$enreg)
|
|
|
{
|
|
|
- if($row[$key] != $field_infos[$key])
|
|
|
+ //if the old field information of this kind doesn't match the new, record it
|
|
|
+ if($row_old[$key] != $field_infos[$key])
|
|
|
{
|
|
|
- $modif_tables[]=$table['table_name'];
|
|
|
-
|
|
|
- break;
|
|
|
+ $modif_field .='~+~'.$field_details[$key].'~+~,';
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- $i++;
|
|
|
+ //only record the whole stuff if the string is not empty
|
|
|
+ if(strlen($modif_field)>0){
|
|
|
+ $modif_fields[$row_old[0]] .= substr($modif_field,0,-1);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ $new_fields = array_diff($fields_new,$fields_old);
|
|
|
+ foreach($new_fields as $dummy=>$val){
|
|
|
+ $new_fields[$dummy] = '++'.$val.'++';
|
|
|
+ }
|
|
|
+ $old_fields = array_diff($fields_old,$fields_new);
|
|
|
+ foreach($old_fields as $dummy=>$val){
|
|
|
+ $old_fields[$dummy] = '--'.$val.'--';
|
|
|
+ }
|
|
|
+ if(count($old_fields)>0 or count($modif_fields)>0 or count($new_fields)>0 ){
|
|
|
+ $modif_tables[]=array(
|
|
|
+ 'table'=>$table['table_name'],
|
|
|
+ 'old_fields'=>$old_fields,
|
|
|
+ 'changed_fields'=>$modif_fields,
|
|
|
+ 'new_fields'=>$new_fields,
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
$tables_db_new[]=$table['table_name'];
|
|
|
}
|
|
|
|
|
@@ -152,15 +190,93 @@ foreach($bases_new as $num_base=>$base)
|
|
|
|
|
|
foreach($diff as $enreg)
|
|
|
{
|
|
|
- $modif_tables[]=$enreg;
|
|
|
+ $modif_tables[]='---'.$enreg.'---';
|
|
|
}
|
|
|
+ //$modif_tables=array_unique($modif_tables); //deprecated with the structure complexification
|
|
|
+
|
|
|
+ }else{ //this database was removed in the new version
|
|
|
+ $query="SHOW TABLES FROM ".$bases_old[$num_base];
|
|
|
+ $result=mysql_query($query,$db_old) or die(mysql_error());
|
|
|
|
|
|
- $modif_tables=array_unique($modif_tables);
|
|
|
+ while($row=mysql_fetch_row($result))
|
|
|
+ {
|
|
|
+ $tables_db_old[]=$row[0];
|
|
|
+ }
|
|
|
+
|
|
|
+ $diff=array_diff($tables_db_old,$tables_db_new);
|
|
|
|
|
|
- echo '<pre>'.print_r($modif_tables,true).'</pre>';
|
|
|
+ foreach($diff as $enreg)
|
|
|
+ {
|
|
|
+ $modif_tables[]='---'.$enreg.'---';
|
|
|
+ }
|
|
|
+
|
|
|
+ $modif_tables=array_unique($modif_tables);
|
|
|
+ echo "<h3>This database has been removed!</h3>";
|
|
|
}
|
|
|
+ echo "<h3>Differences between each table</h3>" .
|
|
|
+ "- fields display under each table's name, <br>" .
|
|
|
+ "- new tables are surrounded by '**', <br/>" .
|
|
|
+ "- removed tables are surrounded by '---',<br/>" .
|
|
|
+ "- new fields are surrounded by '++',<br/>" .
|
|
|
+ "- removed fields are surrounded by '--',<br/>" .
|
|
|
+ "- modified fields are surrounded by '~+~',<br/>";
|
|
|
+ echo '<pre>'.print_r($modif_tables,true).'</pre>';
|
|
|
+ $all_db_changes[$base] = $modif_tables;
|
|
|
}
|
|
|
|
|
|
mysql_close($db_new);
|
|
|
mysql_close($db_old);
|
|
|
+
|
|
|
+echo "<h2>Generating SQL</h2>";
|
|
|
+//going through all databases changes
|
|
|
+foreach($all_db_changes as $base => $changes){
|
|
|
+ echo "<h3>SQL for DB $base</h3>";
|
|
|
+ foreach($changes as $table){
|
|
|
+ if(is_array($table)){
|
|
|
+ //we have a field-level difference
|
|
|
+ $mytable = $table['table'];
|
|
|
+ $myold = $table['old_fields'];
|
|
|
+ $mychanged = $table['changed_fields'];
|
|
|
+ $mynew = $table['new_fields'];
|
|
|
+ foreach($myold as $myname){
|
|
|
+ //column lost, display DROP command
|
|
|
+ $myname = str_replace('--','',$myname);
|
|
|
+ echo "ALTER TABLE ".$mytable." DROP COLUMN ".$myname."<br/>";
|
|
|
+ }
|
|
|
+ foreach($mychanged as $myname=>$myprop){
|
|
|
+ //field changed, display SET command
|
|
|
+ $myprops = split(',',$myprop);
|
|
|
+ $myprops_string = '';
|
|
|
+ foreach($myprops as $myprop){
|
|
|
+ $myprop = str_replace('~+~','',$myprop);
|
|
|
+ $myprops_string .= $myprop." ";
|
|
|
+ }
|
|
|
+ echo "ALTER TABLE ".$mytable." SET COLUMN $myname $myprops_string<br/>";
|
|
|
+ }
|
|
|
+ foreach($mynew as $myname){
|
|
|
+ //column created, display ADD command
|
|
|
+ $myname = str_replace('++','',$myname);
|
|
|
+ echo "ALTER TABLE ".$mytable." ADD COLUMN $myname...<br/>";
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //we have a table-level difference
|
|
|
+ $open_tag = substr($table,0,2);
|
|
|
+ switch($open_tag){
|
|
|
+ case '**':
|
|
|
+ //new table, display CREATE TABLE command
|
|
|
+ $table = str_replace('**','',$table);
|
|
|
+ echo "CREATE TABLE ".$table."();<br/>";
|
|
|
+ break;
|
|
|
+ case '--':
|
|
|
+ //dropped table, display DROP TABLE command
|
|
|
+ $table = str_replace('---','',$table);
|
|
|
+ echo "DROP TABLE ".$table."();<br/>";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ echo "Unknown table problem: ".$table."<br/>";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
?>
|