!c99Shell v. 1.0 pre-release build #16!

Software: Apache/2.2.3 (CentOS). PHP/5.1.6 

uname -a: Linux mx-ll-110-164-51-230.static.3bb.co.th 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44
EDT 2010 i686
 

uid=48(apache) gid=48(apache) groups=48(apache) 

Safe-mode: OFF (not secure)

/var/www/html/phpMyAdmin/libraries/   drwxr-xr-x
Free 52.3 GB of 127.8 GB (40.92%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     server_synchronize.lib.php (78.84 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php 
/* vim: set expandtab sw=4 ts=4 sts=4: */

/**
* PMA_getMatchingTables places matching tables in source 
* and target databases in $matching_tables array whereas
* $uncommon_source_tables array gets the tables present in
* source database but are absent from target database.
* Criterion for matching tables is just comparing their names.
*           
* @param    $trg_tables   array of target database table names, 
* @param    $src_tables   array of source database table names, 

* @param    &$matching_tables           empty array passed by reference to save names of matching tables, 
* @param    &$uncommon_source_tables    empty array passed by reference to save names of tables present in 
*                                       source database but absent from target database
*/
        
function PMA_getMatchingTables($trg_tables$src_tables, &$matching_tables, &$uncommon_source_tables)
{
    for(
$k=0$ksizeof($src_tables); $k++) {                  
        
$present_in_target false;   
        for(
$l=0$l sizeof($trg_tables); $l++) {   
            if (
$src_tables[$k] === $trg_tables[$l]) {            
                
$present_in_target true;
                
$matching_tables[] = $src_tables[$k];
            }
        }
        if (
$present_in_target === false) {
            
$uncommon_source_tables[] = $src_tables[$k];
        }
    }
}

/**
* PMA_getNonMatchingTargetTables() places tables present
* in target database but are absent from source database

* @param    $trg_tables   array of target database table names, 
*  
* @param    $matching_tables           $matching tables array containing names of matching tables, 
* @param    &$uncommon_target_tables    empty array passed by reference to save names of tables presnet in 
*                                       target database but absent from source database
*/

function PMA_getNonMatchingTargetTables($trg_tables$matching_tables, &$uncommon_target_tables)
{
    for(
$c=0$c<sizeof($trg_tables) ;$c++) {
        
$match false;          
        for(
$d=0$d sizeof($matching_tables); $d++)
        {
            if (
$trg_tables[$c] === $matching_tables[$d]) {
                
$match=true;
            } 
        }
        if (
$match === false) {
            
$uncommon_target_tables[] = $trg_tables[$c];
        }      
    }
}
 
 
/**
 * PMA_dataDiffInTables() finds the difference in source and target matching tables by
 * first comparing source table's primary key entries with target table enteries.
 * It gets the field names for the matching table also for comparisons.
 * If the entry is found in target table also then it is checked for the remaining
 * field values also, in order to check whether update is required or not.
 * If update is required, it is placed in $update_array
 * Otherwise that entry is placed in the $insert_array.
 * 
 * @uses     PMA_DBI_get_fields()
 * @uses     PMA_DBI_get_column_values()
 * @uses     PMA_DBI_fetch_result()
 * 
 * @param    $src_db    name of source database
 * @param    $trg_db    name of target database
 * @param    $src_link  connection established with source server
 * @param    $trg_link  connection established with target server
 * @param    $index     Index of a table from $matching_table array 
 * 
 * @param    $update_array    A three dimensional array passed by reference to 
 *                            contain updates required for each matching table
 * @param    $insert_array    A three dimensional array passed by reference to 
 *                            contain inserts required for each matching table
 * @param    $fields_num      A two dimensional array passed by reference to 
 *                            contain number of fields for each matching table
 * @param    $matching_table   array containing matching table names
 * 
 * @param    $matching_tables_fields    A two dimensional array passed by reference to contain names of fields for each matching table
 * 
 * @param    $matching_tables_keys     A two dimensional array passed by reference to contain names of keys for each matching table
 */                                                  
function PMA_dataDiffInTables($src_db$trg_db$src_link$trg_link, &$matching_table, &$matching_tables_fields,
    &
$update_array, &$insert_array, &$delete_array, &$fields_num$matching_table_index, &$matching_tables_keys)
{   
    if (isset(
$matching_table[$matching_table_index])) {
        
$fld = array();
        
$fld_results PMA_DBI_get_fields($src_db$matching_table[$matching_table_index], $src_link);
        
$is_key = array();
        if (isset(
$fld_results)) {
            foreach (
$fld_results as $each_field) {
                
$field_name $each_field['Field'];
                if (
$each_field['Key'] == 'PRI') {
                    
$is_key[] = $field_name;
                }
                
$fld[] = $field_name;
            }    
        }
        
$matching_tables_fields[$matching_table_index] = $fld
        
$fields_num[$matching_table_index] = sizeof($fld);
        
$matching_tables_keys[$matching_table_index] = $is_key;
        
        
$source_result_set PMA_DBI_get_column_values($src_db$matching_table[$matching_table_index], $is_key$src_link);      
        
$source_size sizeof($source_result_set);
        
        
$trg_fld_results PMA_DBI_get_fields($trg_db$matching_table[$matching_table_index], $trg_link);
        
$all_keys_match true;
        
$trg_keys = array();
        
        if (isset(
$trg_fld_results)) {
            foreach (
$trg_fld_results as $each_field) {
                if (
$each_field['Key'] == 'PRI') {
                    
$trg_keys[] = $each_field['Field']; 
                    if (! (
in_array($each_field['Field'], $is_key))) {
                        
$all_keys_match false;
                    }    
                }   
            }   
        }
        
$update_row 0;
        
$insert_row 0;
        
$update_field 0;
        
$insert_field 0;
        
$starting_index 0
        
        for (
$j 0$j $source_size$j++) { 
            
$starting_index 0;
            
$update_field 0

            if (isset(
$source_result_set[$j]) && ($all_keys_match)) {

                
// Query the target server to see which rows already exist
                
$trg_select_query "SELECT * FROM " PMA_backquote($trg_db) . "." 
                    
PMA_backquote($matching_table[$matching_table_index]) . " WHERE ";
  
                if (
sizeof($is_key) == 1) {
                    
$trg_select_query .= $is_key[0]. "='" $source_result_set[$j] . "'";
                } elseif (
sizeof($is_key) > 1){
                    for (
$k=0$k sizeof($is_key); $k++) {
                        
$trg_select_query .= $is_key[$k] . "='" $source_result_set[$j][$is_key[$k]] . "'";
                        if (
$k < (sizeof($is_key)-1)){
                            
$trg_select_query .= " AND ";    
                        }
                    }  
                }
        
                
$target_result_set PMA_DBI_fetch_result($trg_select_querynullnull$trg_link);
                if (
$target_result_set) {

                    
// Fetch the row from the source server to do a comparison
                    
$src_select_query "SELECT * FROM " PMA_backquote($src_db) . "." 
                        
PMA_backquote($matching_table[$matching_table_index]) . " WHERE ";
                    
                    if (
sizeof($is_key) == 1) {
                        
$src_select_query .= $is_key[0] . "='" $source_result_set[$j] . "'";
                    } else if(
sizeof($is_key) > 1){
                        for (
$k=0$ksizeof($is_key); $k++) {
                            
$src_select_query .= $is_key[$k] . "='" $source_result_set[$j][$is_key[$k]] . "'";
                            if (
$k < (sizeof($is_key) - 1)){
                                
$src_select_query .= " AND ";    
                            }
                        }
                    }  
                    
                    
$src_result_set PMA_DBI_fetch_result($src_select_querynullnull$src_link);
                    
                    
/**
                    * Comparing each corresponding field of the source and target matching rows.
                    * Placing the primary key, value of primary key, field to be updated, and the 
                    * new value of field to be updated in each row of the update array. 
                    */
                    
for ($m 0; ($m $fields_num[$matching_table_index]) && ($starting_index == 0) ; $m++) {
                        if (isset(
$src_result_set[0][$fld[$m]])) {
                          if (isset(
$target_result_set[0][$fld[$m]])) {
                            if ((
$src_result_set[0][$fld[$m]] != $target_result_set[0][$fld[$m]]) && (! (in_array($fld[$m], $is_key)))) {
                                if (
sizeof($is_key) == 1) {
                                    if (
$source_result_set[$j]) {
                                        
$update_array[$matching_table_index][$update_row][$is_key[0]] = $source_result_set[$j];
                                    }
                                } elseif (
sizeof($is_key) > 1) {  
                                    for (
$n=0$n sizeof($is_key); $n++) {
                                        if (isset(
$src_result_set[0][$is_key[$n]])) {
                                            
$update_array[$matching_table_index][$update_row][$is_key[$n]] = $src_result_set[0][$is_key[$n]];
                                        }
                                    }
                                }
                                        
                                
$update_array[$matching_table_index][$update_row][$update_field] = $fld[$m];
                                
                                
$update_field++;
                                if (isset(
$src_result_set[0][$fld[$m]])) {
                                    
$update_array[$matching_table_index][$update_row][$update_field] = $src_result_set[0][$fld[$m]]; 
                                    
$update_field++;
                                }
                                
$starting_index $m;
                                
$update_row++;
                            }
                        } else {
                               if (
sizeof($is_key) == 1) {
                                    if (
$source_result_set[$j]) {
                                        
$update_array[$matching_table_index][$update_row][$is_key[0]] = $source_result_set[$j];
                                
                                    }
                                } elseif (
sizeof($is_key) > 1) {  
                                    for (
$n 0$n sizeof($is_key); $n++) {
                                        if (isset(
$src_result_set[0][$is_key[$n]])) {
                                            
$update_array[$matching_table_index][$update_row][$is_key[$n]] = $src_result_set[0][$is_key[$n]];
                                        }
                                    }
                                }
                                        
                                
$update_array[$matching_table_index][$update_row][$update_field] = $fld[$m];
                                
                                
$update_field++;
                                if (isset(
$src_result_set[0][$fld[$m]])) {
                                    
$update_array[$matching_table_index][$update_row][$update_field] = $src_result_set[0][$fld[$m]]; 
                                    
$update_field++;
                                }
                                
$starting_index $m;
                                
$update_row++;
                        }
                      }
                    }
                    for (
$m $starting_index 1$m $fields_num[$matching_table_index] ; $m++)
                    {   
                        if (isset(
$src_result_set[0][$fld[$m]])) {
                            if (isset(
$target_result_set[0][$fld[$m]])) { 
                                if ((
$src_result_set[0][$fld[$m]] != $target_result_set[0][$fld[$m]]) && (!(in_array($fld[$m], $is_key)))) {
                                
$update_row--; 
                                
$update_array[$matching_table_index][$update_row][$update_field] = $fld[$m];
                                
$update_field++;
                                if (
$src_result_set[0][$fld[$m]]) {
                                    
$update_array[$matching_table_index][$update_row][$update_field] = $src_result_set[0][$fld[$m]];
                                    
$update_field++;
                                }
                                
$update_row++; 
                            }
                        } else {
                               
$update_row--; 
                                
$update_array[$matching_table_index][$update_row][$update_field] = $fld[$m];
                                
$update_field++;
                                if (
$src_result_set[0][$fld[$m]]) {
                                    
$update_array[$matching_table_index][$update_row][$update_field] = $src_result_set[0][$fld[$m]];
                                    
$update_field++;
                                }
                                
$update_row++; 
                            }
                        }
                    }
                } else {
                    
/**
                     * Placing the primary key, and the value of primary key of the row that is to be inserted in the target table
                     */
                    
if (sizeof($is_key) == 1) {
                        if (isset(
$source_result_set[$j])) {
                            
$insert_array[$matching_table_index][$insert_row][$is_key[0]] = $source_result_set[$j];
                        }
                    } elseif (
sizeof($is_key) > 1) {  
                        for(
$l 0$l sizeof($is_key); $l++) {
                            if (isset(
$source_result_set[$j][$matching_tables_fields[$matching_table_index][$l]])) {
                                
$insert_array[$matching_table_index][$insert_row][$is_key[$l]] = $source_result_set[$j][$matching_tables_fields[$matching_table_index][$l]];
                            }
                        }
                    }
                    
$insert_row++;
                }
            } else {
                    
/**
                    * Placing the primary key, and the value of primary key of the row that is to be inserted in the target table
                    * This condition is met when there is an additional column in the source table                                                  
                    */
                    
if (sizeof($is_key) == 1) {
                        if (isset(
$source_result_set[$j])) {
                            
$insert_array[$matching_table_index][$insert_row][$is_key[0]] = $source_result_set[$j];
                        }
                    } elseif (
sizeof($is_key) > 1) {  
                        for (
$l 0$l sizeof($is_key); $l++) {
                            if (isset(
$source_result_set[$j][$matching_tables_fields[$matching_table_index][$l]])) {
                                
$insert_array[$matching_table_index][$insert_row][$is_key[$l]] = $source_result_set[$j][$matching_tables_fields[$matching_table_index][$l]];
                            }
                        }
                    }
                
$insert_row++;
            }
        } 
// for loop ends
    
}    

/**
* PMA_findDeleteRowsFromTargetTables finds the rows which are to be deleted from target table.
* @uses   sizeof()
* @uses   PMA_DBI_get_column_values()
* @uses   in_array()

* @param  $delete_array          array containing rows that are to be deleted 
* @param  $matching_table        array containing matching table names
* @param  $matching_table_index  index of a table from $matching_table array
* @param  $trg_keys              array of target table keys
* @param  $src_keys              array of source table keys
* @param  $trg_db                name of target database
* @param  $trg_link              connection established with target server
* @param  $src_db                name of source database 
* @param  $src_link              connection established with source server

*/
function PMA_findDeleteRowsFromTargetTables(&$delete_array$matching_table$matching_table_index$trg_keys$src_keys$trg_db$trg_link,$src_db$src_link)
{
    if (isset(
$trg_keys[$matching_table_index])) {
        
$target_key_values PMA_DBI_get_column_values($trg_db$matching_table[$matching_table_index], $trg_keys[$matching_table_index], $trg_link);      
        
$target_row_size sizeof($target_key_values);        
    }
    if (isset(
$src_keys[$matching_table_index])) {
        
$source_key_values PMA_DBI_get_column_values($src_db$matching_table[$matching_table_index], $src_keys[$matching_table_index], $src_link);      
        
$source_size sizeof($source_key_values);        
    }
    
$all_keys_match 1;
    for (
$a 0$a sizeof($trg_keys[$matching_table_index]); $a++) {
        if (isset(
$trg_keys[$matching_table_index][$a])) {
           if (! (
in_array($trg_keys[$matching_table_index][$a], $src_keys[$matching_table_index]))) {
               
$all_keys_match 0;
           }
       }   
    }
    if (! (
$all_keys_match)) {
        if (isset(
$target_key_values)) {
            
$delete_array[$matching_table_index] = $target_key_values;
        }
    }
    if (isset(
$trg_keys[$matching_table_index])) {
        if ((
sizeof($trg_keys[$matching_table_index]) == 1) && $all_keys_match) {
           
$row 0
           if (isset(
$target_key_values)) {
               for (
$i 0$i sizeof($target_key_values); $i++) {
                    if (! (
in_array($target_key_values[$i], $source_key_values))) {
                        
$delete_array[$matching_table_index][$row] = $target_key_values[$i];
                        
$row++;   
                    }
                }                  
            }
        } elseif ((
sizeof($trg_keys[$matching_table_index]) > 1) && $all_keys_match) {
            
$row 0;  
            if (isset(
$target_key_values)) {
                for (
$i 0$i sizeof($target_key_values); $i++) {
                    
$is_present false;
                    for (
$j 0$j sizeof($source_key_values) && ($is_present == false) ; $j++) {
                        
$check true;
                        for (
$k 0$k sizeof($trg_keys[$matching_table_index]); $k++) {
                            if (
$target_key_values[$i][$trg_keys[$matching_table_index][$k]] != $source_key_values[$j][$trg_keys[$matching_table_index][$k]]) {
                                
$check false;
                            }    
                        }
                        if (
$check) {
                            
$is_present true;
                        }
                    }
                    if (! (
$is_present)) {
                        for (
$l 0$l sizeof($trg_keys[$matching_table_index]); $l++) {
                            
$delete_array[$matching_table_index][$row][$trg_keys[$matching_table_index][$l]] = $target_key_values[$i][$trg_keys[$matching_table_index][$l]];
                        }
                        
$row++;
                    }
                }                    
            }        
        }
    }    
}

/**
* PMA_dataDiffInUncommonTables() finds the data difference in  $source_tables_uncommon
* @uses   PMA_DBI_fetch_result()

* @param  $source_tables_uncommon  array of table names; containing table names that are in source db and not in target db
* @param  $src_db                  name of source database
* @param  $src_link                connection established with source server
* @param  $index                   index of a table from $matching_table array
* @param  $row_count               number of rows
*/

function PMA_dataDiffInUncommonTables($source_tables_uncommon$src_db$src_link$index, &$row_count)
{
   
$query "SELECT COUNT(*) FROM " PMA_backquote($src_db) . "." PMA_backquote($source_tables_uncommon[$index]);  
   
$rows  PMA_DBI_fetch_result($querynullnull$src_link); 
   
$row_count[$index] = $rows[0]; 
}

/**
* PMA_updateTargetTables() sets the updated field values to target table rows using $update_array[$matching_table_index]
*
* @uses    PMA_DBI_fetch_result()
* @uses    PMA_backquote()
*  
* @param    $table                 Array containing matching tables' names 
* @param    $update_array          A three dimensional array containing field
*                                  value updates required for each matching table
* @param    $src_db                Name of source database 
* @param    $trg_db                Name of target database
* @param    $trg_link              Connection established with target server
* @param    $matching_table_index  index of matching table in matching_table_array    
* @param    $display               true/false value
*/                                                                                                        

function PMA_updateTargetTables($table$update_array$src_db$trg_db$trg_link$matching_table_index$matching_table_keys$display)

    if (isset(
$update_array[$matching_table_index])) {
        if (
sizeof($update_array[$matching_table_index])) {
               
            for (
$update_row 0$update_row sizeof($update_array[$matching_table_index]); $update_row++) {
                   
                if (isset(
$update_array[$matching_table_index][$update_row])) { 
                     
$update_fields_num sizeof($update_array[$matching_table_index][$update_row])-sizeof($matching_table_keys[$matching_table_index]);
                     if (
$update_fields_num 0) {
                        
$query "UPDATE " PMA_backquote($trg_db) . "." .PMA_backquote($table[$matching_table_index]) . " SET ";   
                     
                     for (
$update_field 0$update_field $update_fields_num$update_field $update_field+2) {
                         if (isset(
$update_array[$matching_table_index][$update_row][$update_field]) && isset($update_array[$matching_table_index][$update_row][$update_field+1])) {
                             
$query .= $update_array[$matching_table_index][$update_row][$update_field] . "='" $update_array[$matching_table_index][$update_row][$update_field+1] . "'";
                         }
                         if (
$update_field < ($update_fields_num 2)) {
                             
$query .= ", ";    
                         }
                     }
                     
$query .= " WHERE ";
                     if (isset(
$matching_table_keys[$matching_table_index])) {
                        for (
$key 0$key sizeof($matching_table_keys[$matching_table_index]); $key++)
                        {
                            if (isset(
$matching_table_keys[$matching_table_index][$key])) {
                            
                                
$query .= $matching_table_keys[$matching_table_index][$key] . "='" $update_array[$matching_table_index][$update_row][$matching_table_keys[$matching_table_index][$key]] . "'";
                            }
                            if (
$key < (sizeof($matching_table_keys[$matching_table_index]) - 1)) {
                                 
$query .= " AND ";
                            }
                        }
                    }
                    if (
$display == true) {
                        echo 
"<p>" $query "</p>";
                    }                    
                    
PMA_DBI_try_query($query$trg_link0);
                    }
                }                    
            }
        }
    }
}
/**
* PMA_insertIntoTargetTable() inserts missing rows in the target table using $array_insert[$matching_table_index]
*  
* @uses    PMA_DBI_fetch_result()
* @uses    PMA_backquote()

*                                              
* @param  $matching_table         array containing matching table names
* @param  $src_db                 name of source database
* @param  $trg_db                 name of target database
* @param  $src_link               connection established with source server
* @param  $trg_link               connection established with target server
* @param  $table_fields           array containing field names of a table
* @param  $array_insert            
* @param  $matching_table_index   index of matching table in matching_table_array 
* @param  $matching_tables_keys   array containing field names that are keys in the matching table
* @param  $source_columns         array containing source column information
* @param  $add_column_array       array containing column names that are to be added in target table
* @param  $criteria               array containing criterias like type, null, collation, default etc
* @param  $target_tables_keys     array containing field names that are keys in the target table
* @param  $uncommon_tables        array containing table names that are present in source db but not in targt db
* @param  $uncommon_tables_fields array containing field names of the uncommon tables
* @param  $uncommon_cols          column names that are present in target table and not in source table
* @param  $alter_str_array        array containing column names that are to be altered 
* @param  $source_indexes         column names on which indexes are made in source table 
* @param  $target_indexes         column names on which indexes are made in target table 
* @param  $add_indexes_array      array containing column names on which index is to be added in target table
* @param  $alter_indexes_array    array containing column names whose indexes are to be altered. Only index name and uniqueness of an index can be changed 
* @param  $delete_array           array containing rows that are to be deleted
* @param  $update_array           array containing rows that are to be updated in target
* @param  $display                true/false value
*
*/
function PMA_insertIntoTargetTable($matching_table$src_db$trg_db$src_link$trg_link$table_fields, &$array_insert$matching_table_index,
 
$matching_tables_keys$source_columns, &$add_column_array$criteria$target_tables_keys$uncommon_tables, &$uncommon_tables_fields,$uncommon_cols
 &
$alter_str_array,&$source_indexes, &$target_indexes, &$add_indexes_array, &$alter_indexes_array, &$delete_array, &$update_array$display)
{   
    if(isset(
$array_insert[$matching_table_index])) {
        if (
sizeof($array_insert[$matching_table_index])) {
            for (
$insert_row 0$insert_rowsizeof($array_insert[$matching_table_index]); $insert_row++) {
                if (isset(
$array_insert[$matching_table_index][$insert_row][$matching_tables_keys[$matching_table_index][0]])) {
                   
                    
$select_query "SELECT * FROM " PMA_backquote($src_db) . "." PMA_backquote($matching_table[$matching_table_index]) . " WHERE ";
                    for (
$i 0$i sizeof($matching_tables_keys[$matching_table_index]); $i++) {
                        
$select_query .= $matching_tables_keys[$matching_table_index][$i] . "='";
                        
$select_query .= $array_insert[$matching_table_index][$insert_row][$matching_tables_keys[$matching_table_index][$i]] . "'" ;
                        
                        if (
$i < (sizeof($matching_tables_keys[$matching_table_index]) - 1)) {
                            
$select_query.= " AND ";    
                        }
                    }
                    
$select_query .= "; ";
                    
$result PMA_DBI_fetch_result ($select_querynullnull$src_link);
                    
$insert_query "INSERT INTO " PMA_backquote($trg_db) . "." PMA_backquote($matching_table[$matching_table_index]) ." (";
                    
                    for (
$field_index 0$field_index sizeof($table_fields[$matching_table_index]); $field_index++) 
                    {
                        
$insert_query .=  $table_fields[$matching_table_index][$field_index];
                        
                        
$is_fk_query "SELECT * FROM  information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" $trg_db ."' 
                                         AND TABLE_NAME = '" 
$matching_table[$matching_table_index]. "'AND COLUMN_NAME = '" .
                                         
$table_fields[$matching_table_index][$field_index] . "' AND TABLE_NAME <> REFERENCED_TABLE_NAME;" ;
                    
                        
$is_fk_result PMA_DBI_fetch_result($is_fk_querynullnull$trg_link);
                        if (
sizeof($is_fk_result) > 0) {
                            for (
$j 0$j sizeof($is_fk_result); $j++)
                            {
                                
$table_index array_keys($matching_table$is_fk_result[$j]['REFERENCED_TABLE_NAME']);
                                 
                                if (isset(
$alter_str_array[$table_index[0]])) {
                                   
PMA_alterTargetTableStructure($trg_db$trg_link$matching_tables$source_columns$alter_str_array$matching_tables_fields,
                                    
$criteria$matching_tables_keys$target_tables_keys$table_index[0], $display);
                                    unset(
$alter_str_array[$table_index[0]]);        
                                }                                                           
                                if (isset(
$uncommon_columns[$table_index[0]])) {
                                    
PMA_removeColumnsFromTargetTable($trg_db$trg_link$matching_tables$uncommon_columns$table_index[0], $display);
                                    unset(
$uncommon_columns[$table_index[0]]); 
                                }           
                                if (isset(
$add_column_array[$table_index[0]])) {
                                    
PMA_findDeleteRowsFromTargetTables($delete_array$matching_tables$table_index[0], $target_tables_keys$matching_tables_keys,
                                    
$trg_db$trg_link$src_db$src_link);
                                     
                                    if (isset(
$delete_array[$table_index[0]])) {
                                       
PMA_deleteFromTargetTable($trg_db$trg_link$matching_tables$table_index[0], $target_tables_keys$delete_array$display);
                                       unset(
$delete_array[$table_index[0]]); 
                                    }        
                                    
PMA_addColumnsInTargetTable($src_db$trg_db$src_link$trg_link$matching_tables$source_columns$add_column_array
                                    
$matching_tables_fields$criteria$matching_tables_keys$target_tables_keys$uncommon_tables,$uncommon_tables_fields,
                                    
$table_index[0], $uncommon_cols$display);
                                    unset(
$add_column_array[$table_index[0]]);
                                }
                                if (isset(
$add_indexes_array[$table_index[0]]) || isset($remove_indexes_array[$table_index[0]]) 
                                    || isset(
$alter_indexes_array[$table_index[0]])) {
                                    
PMA_applyIndexesDiff ($trg_db$trg_link$matching_tables$source_indexes$target_indexes$add_indexes_array$alter_indexes_array
                                    
$remove_indexes_array$table_index[0], $display); 
                                   
                                    unset(
$add_indexes_array[$table_index[0]]);
                                    unset(
$alter_indexes_array[$table_index[0]]);
                                    unset(
$remove_indexes_array[$table_index[0]]);
                                }
                                if (isset(
$update_array[$table_index[0]])) {
                                    
PMA_updateTargetTables($matching_tables$update_array$src_db$trg_db$trg_link$table_index[0], $matching_table_keys,
                                     
$display);
                                    unset(
$update_array[$table_index[0]]);
                                }
                                if (isset(
$array_insert[$table_index[0]])) {
                                     
PMA_insertIntoTargetTable($matching_table$src_db$trg_db$src_link$trg_link$table_fields$array_insert,
                                     
$table_index[0], $matching_tables_keys$source_columns$add_column_array$criteria$target_tables_keys$uncommon_tables,
                                     
$uncommon_tables_fields$uncommon_cols$alter_str_array$source_indexes$target_indexes$add_indexes_array
                                     
$alter_indexes_array$delete_array$update_array$display); 
                                     unset(
$array_insert[$table_index[0]]);
                                }      
                            }
                        }
                        if (
$field_index sizeof($table_fields[$matching_table_index])-1) {
                            
$insert_query .= ", ";
                        }
                    }             
                    
$insert_query .= ") VALUES(";
                    if (
sizeof($table_fields[$matching_table_index]) == 1) {
                         
$insert_query .= "'" PMA_sqlAddslashes($result[0]) . "'";
                    } else {
                        for (
$field_index 0$field_index sizeof($table_fields[$matching_table_index]); $field_index++) {
                            if (isset(
$result[0][$table_fields[$matching_table_index][$field_index]])) {
                                
$insert_query .= "'" PMA_sqlAddslashes($result[0][$table_fields[$matching_table_index][$field_index]]) . "'";
                            } else {
                                
$insert_query .= "'NULL'";
                            }
                            if (
$field_index < (sizeof($table_fields[$matching_table_index])) - 1) {
                                    
$insert_query .= " ," ;
                            }      
                        }
                    } 
                    
$insert_query .= ");";
                    if (
$display == true) {
                        
PMA_displayQuery($insert_query);
                    }
                    
PMA_DBI_try_query($insert_query$trg_link0);
                }   
            }
        }
    }

/**
* PMA_createTargetTables() Create the missing table $uncommon_table in target database 

* @uses    PMA_DBI_get_fields()
* @uses    PMA_backquote()
* @uses    PMA_DBI_fetch_result()
*                                                                     
* @param    $src_db                 name of source database 
* @param    $trg_db                 name of target database
* @param    $trg_link               connection established with target server
* @param    $src_link               connection established with source server
* @param    $uncommon_table         name of table present in source but not in target
* @param    $table_index            index of table in matching_table_array 
* @param    $uncommon_tables_fields field names of the uncommon table
* @param    $display                 true/false value
*/ 
function PMA_createTargetTables($src_db$trg_db$src_link$trg_link, &$uncommon_tables$table_index, &$uncommon_tables_fields$display)
{
    if (isset(
$uncommon_tables[$table_index])) {
        
$fields_result PMA_DBI_get_fields($src_db$uncommon_tables[$table_index], $src_link);
        
$fields = array();
        foreach (
$fields_result as $each_field) {
            
$field_name $each_field['Field'];
            
$fields[] = $field_name;
        }
        
$uncommon_tables_fields[$table_index] = $fields
       
        
$Create_Query PMA_DBI_fetch_value("SHOW CREATE TABLE " PMA_backquote($src_db) . '.' PMA_backquote($uncommon_tables[$table_index]), 01$src_link);

        
// Replace the src table name with a `dbname`.`tablename`
        
$Create_Table_Query preg_replace('/' PMA_backquote($uncommon_tables[$table_index]) . '/'
                                            
PMA_backquote($trg_db) . '.' .PMA_backquote($uncommon_tables[$table_index]),
                                            
$Create_Query,
                                            
$limit 1
        
);

        
$is_fk_query "SELECT * FROM  information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" $src_db "' 
                        AND TABLE_NAME = '" 
$uncommon_tables[$table_index] . "' AND TABLE_NAME <> REFERENCED_TABLE_NAME;" ;
                    
        
$is_fk_result PMA_DBI_fetch_result($is_fk_querynullnull$src_link);
        if (
sizeof($is_fk_result) > 0) {
            for (
$j 0$j sizeof($is_fk_result); $j++)
            {
                if (
in_array($is_fk_result[$j]['REFERENCED_TABLE_NAME'], $uncommon_tables)) {
                    
$table_index array_keys($uncommon_tables$is_fk_result[$j]['REFERENCED_TABLE_NAME']);
                    
PMA_createTargetTables($src_db$trg_db$trg_link$src_link$uncommon_tables$table_index[0], $uncommon_tables_fields$display);
                    unset(
$uncommon_tables[$table_index[0]]);
                }      
            }
         }
         if (
$display == true) {
              echo 
'<p>' $Create_Table_Query '</p>';
         }
         
PMA_DBI_try_query($Create_Table_Query$trg_link0);
    }                                   
}
/**
* PMA_populateTargetTables() inserts data into uncommon tables after they have been created
* @uses   PMA_DBI_fetch_result()
* @uses  PMA_backquote()
* @uses   sizeof()
* @uses  PMA_DBI_try_query()

* @param  $src_db                 name of source database
* @param  $trg_db                 name of target database
* @param  $src_link               connection established with source server
* @param  $trg_link               connection established with target server
* @param  $uncommon_tables        array containing uncommon table names (table names that are present in source but not in target db) 
* @param  $table_index            index of table in matching_table_array 
* @param  $uncommon_tables_fields field names of the uncommon table
* @param  $display                true/false value
*
* FIXME: This turns NULL values into '' (empty string)
*/
function PMA_populateTargetTables($src_db$trg_db$src_link$trg_link$uncommon_tables$table_index$uncommon_tables_fields$display
{                                                                            
    
$display false// todo: maybe display some of the queries if they are not too numerous
    
$unbuffered_result PMA_DBI_try_query('SELECT * FROM ' PMA_backquote($src_db) . '.' PMA_backquote($uncommon_tables[$table_index]), $src_linkPMA_DBI_QUERY_UNBUFFERED);
    if (
false !== $unbuffered_result) {
        
$insert_query 'INSERT INTO ' PMA_backquote($trg_db) . '.' .PMA_backquote($uncommon_tables[$table_index]) . ' VALUES';         
        while (
$one_row PMA_DBI_fetch_row($unbuffered_result)) {
            
$insert_query .= '(';
            
$key_of_last_value count($one_row) - 1;
            foreach(
$one_row as $key => $value) {
                
$insert_query .= "'" PMA_sqlAddslashes($value) . "'";
                if (
$key $key_of_last_value) {
                    
$insert_query .= ",";
                }
            }
            
$insert_query .= '),';
        }
        
$insert_query substr($insert_query0, -1);
        
$insert_query .= ';';
        if (
$display == true) {
            
PMA_displayQuery($insert_query);
        }
        
PMA_DBI_try_query($insert_query$trg_link0);
    }
}
/**
* PMA_deleteFromTargetTable() delete rows from target table 
* @uses  sizeof()
* @uses  PMA_backquote()
* @uses  PMA_DBI_try_query()


* @param  $trg_db                 name of target database
* @param  $trg_link               connection established with target server
* @param  $matching_tables        array containing matching table names
* @param  $table_index            index of table in matching_table_array
* @param  $target_table_keys      primary key names of the target tables
* @param  $delete array           array containing the key values of rows that are to be deleted 
* @param  $display                true/false value
*/
function PMA_deleteFromTargetTable($trg_db$trg_link$matching_tables$table_index$target_tables_keys$delete_array$display
{
    for(
$i 0$i sizeof($delete_array[$table_index]); $i++) {
        if (isset(
$target_tables_keys[$table_index])) {
            
$delete_query 'DELETE FROM ' PMA_backquote($trg_db) . '.' .PMA_backquote($matching_tables[$table_index]) . ' WHERE ';         
            for(
$y 0$y sizeof($target_tables_keys[$table_index]); $y++) {
                
$delete_query .= $target_tables_keys[$table_index][$y] . " = '";
                
                if (
sizeof($target_tables_keys[$table_index]) == 1) {
                    
$delete_query .= $delete_array[$table_index][$i] . "'";   
                } elseif (
sizeof($target_tables_keys[$table_index]) > 1) {
                    
$delete_query .= $delete_array[$table_index][$i][$target_tables_keys[$table_index][$y]] . "'";
                }
                if (
$y < (sizeof($target_tables_keys[$table_index]) - 1)) {
                    
$delete_query .= ' AND ';
                }
                
$pk_query "SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '" $trg_db "' 
                            AND REFERENCED_TABLE_NAME = '" 
$matching_tables[$table_index]."' AND REFERENCED_COLUMN_NAME = '"
                           
$target_tables_keys[$table_index][$y] . "' AND TABLE_NAME <> REFERENCED_TABLE_NAME;";
    
                
$pk_query_result PMA_DBI_fetch_result($pk_querynullnull$trg_link);
                
$result_size sizeof($pk_query_result);
             
                if (
$result_size 0) {
                    for (
$b 0$b $result_size$b++) {
                        
$drop_pk_query "DELETE FROM " PMA_backquote($pk_query_result[$b]['TABLE_SCHEMA']) . "." PMA_backquote($pk_query_result[$b]['TABLE_NAME']) . " WHERE " $pk_query_result[$b]['COLUMN_NAME'] . " = " $target_tables_keys[$table_index][$y] . ";";
                        
PMA_DBI_try_query($drop_pk_query$trg_link0);
                    }              
                }       
            }               
        }
        if (
$display == true) {
            echo 
'<p>' $delete_query '</p>';    
        }
        
PMA_DBI_try_query($delete_query$trg_link0);
    }
}
/**
* PMA_structureDiffInTables() Gets all the column information for source and target table.
* Compare columns on their names.
* If column exists in target then compare Type, Null, Collation, Key, Default and Comment for that column.
* If column does not exist in target table then it is placed in  $add_column_array.
* If column exists in target table but criteria is different then it is palced in $alter_str_array.
* If column does not exist in source table but is present in target table then it is placed in  $uncommon_columns.
* Keys for all the source tables that have a corresponding target table are placed  in $matching_tables_keys.
* Keys for all the target tables that have a corresponding source table are placed  in $target_tables_keys. 

* @uses    PMA_DBI_get_columns_full()
* @uses    sizeof() 
*                                                                     
* @param    $src_db                name of source database 
* @param    $trg_db                name of target database
* @param    $src_link              connection established with source server
* @param    $trg_link              connection established with target server
* @param    $matching_tables       array containing names of matching tables
* @param    $source_columns        array containing columns information of the source tables
* @param    $target_columns        array containing columns information of the target tables
* @param    $alter_str_array       three dimensional associative array first index being the matching table index, second index being column name for which target 
*                                  column have some criteria different and third index containing the criteria which is different.
* @param    $add_column_array      two dimensional associative array, first index of the array contain the matching table number and second index contain the 
*                                  column name which is to be added in the target table
* @param    $uncommon_columns      array containing the columns that are present in the target table but not in the source table
* @param    $criteria              array containing the criterias which are to be checked for field that is present in source table and target table
* @param    $target_tables_keys    array containing the field names which is key in the target table
* @param    $matching_table_index  integer number of the matching table 
*                              
*/
function PMA_structureDiffInTables($src_db$trg_db$src_link$trg_link$matching_tables, &$source_columns, &$target_columns, &$alter_str_array,
 &
$add_column_array, &$uncommon_columns$criteria, &$target_tables_keys$matching_table_index
{
    
//Gets column information for source and target table
    
$source_columns[$matching_table_index] = PMA_DBI_get_columns_full($src_db$matching_tables[$matching_table_index], null$src_link);
    
$target_columns[$matching_table_index] = PMA_DBI_get_columns_full($trg_db$matching_tables[$matching_table_index], null$trg_link);
    foreach (
$source_columns[$matching_table_index] as $column_name => $each_column) {
        if (isset(
$target_columns[$matching_table_index][$column_name]['Field'])) {
            
//If column exists in target table then matches criterias like type, null, collation, key, default, comment of the column 
            
for ($i 0$i sizeof($criteria); $i++) {
                if (
$source_columns[$matching_table_index][$column_name][$criteria[$i]] != $target_columns[$matching_table_index][$column_name][$criteria[$i]]) {
                    if ((
$criteria[$i] == 'Default') && ($source_columns[$matching_table_index][$column_name][$criteria[$i]] == '' )) {
                        
$alter_str_array[$matching_table_index][$column_name][$criteria[$i]] = 'None'
                    } else {
                        if (! ((
$criteria[$i] == 'Key') && (($source_columns[$matching_table_index][$column_name][$criteria[$i]] == 'MUL')
                            || (
$target_columns[$matching_table_index][$column_name][$criteria[$i]] == 'MUL'
                            || (
$source_columns[$matching_table_index][$column_name][$criteria[$i]] == 'UNI'
                            || (
$target_columns[$matching_table_index][$column_name][$criteria[$i]] == 'UNI')))) {
                            
$alter_str_array[$matching_table_index][$column_name][$criteria[$i]] = $source_columns[$matching_table_index][$column_name][$criteria[$i]];
                        }
                    }
                }
            }
        } else {
            
$add_column_array[$matching_table_index][$column_name]= $column_name;
        }
    }
    
//Finds column names that are present in target table but not in source table
    
foreach ($target_columns[$matching_table_index] as $fld_name => $each_column) {
        if (! (isset(
$source_columns[$matching_table_index][$fld_name]['Field']))) {
            
$fields_uncommon[] = $fld_name
        }
        if (
$target_columns[$matching_table_index][$fld_name]['Key'] == 'PRI') {
            
$keys[] = $fld_name;
        }
    }
    if (isset(
$fields_uncommon)) {
        
$uncommon_columns[$matching_table_index] = $fields_uncommon;   
    }
    if (isset(
$keys)) {
        
$target_tables_keys[$matching_table_index] = $keys
    }
}
/**
* PMA_addColumnsInTargetTable() adds column that are present in source table but not in target table
* @uses    sizeof()
* @uses    in_array()
* @uses    array_keys()
* @uses    PMA_checkForeignKeys()
* @uses    PMA_createTargetTables()
* @uses    PMA_DBI_try_query()
* @uses    PMA_DBI_fetch_result()

* @param   $src_db                 name of source database 
* @param   $trg_db                 name of target database
* @param   $src_link               connection established with source server
* @param   $trg_link               connection established with target server
* @param   $matching_tables        array containing names of matching tables
* @param   $source_columns         array containing columns information of the source tables
* @param   $add_column_array       array containing the names of the column(field) that are to be added in the target
* @param   $matching_tables_fields
* @param   $criteria               array containing the criterias 
* @param   $matching_tables_keys   array containing the field names which is key in the source table
* @param   $target_tables_keys     array containing the field names which is key in the target table
* @param   $uncommon_tables        array containing the table names that are present in source db and not in target db
* @param   $uncommon_tables_fields array containing the names of the fields of the uncommon tables
* @param   $table_counter          integer number of the matching table
* @param   $uncommon_cols
* @param   $display                true/false value
*/
function PMA_addColumnsInTargetTable($src_db$trg_db$src_link$trg_link$matching_tables$source_columns, &$add_column_array$matching_tables_fields,
         
$criteria$matching_tables_keys$target_tables_keys$uncommon_tables, &$uncommon_tables_fields$table_counter$uncommon_cols$display)
{
    for (
$i 0$i sizeof($matching_tables_fields[$table_counter]); $i++) {
        if (isset(
$add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]])) {
            
$query "ALTER TABLE " PMA_backquote($trg_db) . '.' PMA_backquote($matching_tables[$table_counter]). " ADD COLUMN " .
            
$add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]] . " " $source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Type'];
 
            if(
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Null'] == 'NO') {
                
$query .= ' Not Null ';
            } elseif (
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Null'] == 'YES') {
                
$query .= ' Null '
            }
            if (
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Collation'] != '') {
                
$query .= ' COLLATE ' $source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Collation'];
            }
            if (
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Default'] != '') {
                
$query .= " DEFAULT " $source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Default'];
            }
            if (
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Comment'] != '') {
                
$query .= " COMMENT " $source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Comment']; 
            }                                                   
            if (
$source_columns[$table_counter][$matching_tables_fields[$table_counter][$i]]['Key'] == 'PRI' ) {  
                
$trg_key_size sizeof($target_tables_keys[$table_counter]);
                if (
$trg_key_size) {
                    
$check true;
                    for (
$a 0; ($a $trg_key_size) && ($check); $a++) {    
                        if (! (
in_array($target_tables_keys[$table_counter], $uncommon_cols))) {
                             
$check false;
                         }    
                    }
                    if (! 
$check) {
                        
$query .= " ,DROP PRIMARY KEY " ;      
                    }
                } 
                
$query .= " , ADD PRIMARY KEY (";
                for (
$t 0$t sizeof($matching_tables_keys[$table_counter]); $t++) {
                    
$query .= $matching_tables_keys[$table_counter][$t];
                    if (
$t < (sizeof($matching_tables_keys[$table_counter]) - 1)) {
                        
$query .= " , " ;
                    }
                }
                
$query .= ")";
            }
            
            
$query .= ";";
            if (
$display == true) {
                echo 
'<p>' $query '</p>';
            }
            
PMA_DBI_try_query($query$trg_link0);
          
            
//Checks if column to be added is a foreign key or not
            
$is_fk_query "SELECT * FROM  information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" $trg_db "' AND TABLE_NAME = '"
            
$matching_tables[$table_counter] . "' AND COLUMN_NAME ='" $add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]] .
            
"' AND TABLE_NAME <> REFERENCED_TABLE_NAME;";
            
            
$is_fk_result PMA_DBI_fetch_result($is_fk_querynullnull$src_link);
            
            
//If column is a foreign key then it is checked that referenced table exist in target db. If referenced table does not exist in target db then 
            //it is created first.
            
if (isset($is_fk_result)) {
                if (
in_array($is_fk_result[0]['REFERENCED_TABLE_NAME'], $uncommon_tables)) {
                    
$table_index array_keys($uncommon_tables$is_fk_result[0]['REFERENCED_TABLE_NAME']);
                    
PMA_checkForeignKeys($src_db$src_link$trg_db$trg_link$is_fk_result[0]['REFERENCED_TABLE_NAME'], $uncommon_tables$uncommon_tables_fields);
                    
PMA_createTargetTables($src_db$trg_db$trg_link$src_link$uncommon_tables$table_index[0], $uncommon_tables_fields);
                    unset(
$uncommon_tables[$table_index[0]]);
                }
                
$fk_query "ALTER TABLE " PMA_backquote($trg_db) . '.' PMA_backquote($matching_tables[$table_counter]) . 
                            
"ADD CONSTRAINT FOREIGN KEY " $add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]] . 
                            (" 
$add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]] . ") REFERENCES " PMA_backquote($trg_db) .
                             
'.' PMA_backquote($is_fk_result[0]['REFERENCED_TABLE_NAME']) . " (" $is_fk_result[0]['REFERENCED_COLUMN_NAME'] . ");";
             
                
PMA_DBI_try_query($fk_query$trg_linknull);    
            }
        }
    }
}
/**
* PMA_checkForeignKeys() checks if the referenced table have foreign keys.
* @uses   sizeof()
* @uses   in_array()
* @uses   array_keys()
* @uses   PMA_checkForeignKeys()
* uses    PMA_createTargetTables()

* @param  $src_db                 name of source database
* @param  $src_link               connection established with source server
* @param  $trg_db                 name of target database
* @param  $trg_link               connection established with target server
* @param  $referenced_table       table whose column is a foreign key in another table
* @param  $uncommon_tables        array containing names that are uncommon 
* @param  $uncommon_tables_fields field names of the uncommon table
* @param  $display                true/false value
*/
function PMA_checkForeignKeys($src_db$src_link$trg_db$trg_link ,$referenced_table, &$uncommon_tables, &$uncommon_tables_fields$display)
{
    
$is_fk_query "SELECT * FROM  information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" $src_db "' 
                    AND TABLE_NAME = '" 
$referenced_table "' AND TABLE_NAME <> REFERENCED_TABLE_NAME;";
    
    
$is_fk_result PMA_DBI_fetch_result($is_fk_querynullnull$src_link);
    if (
sizeof($is_fk_result) > 0) {
        for (
$j 0$j sizeof($is_fk_result); $j++) {
            if (
in_array($is_fk_result[$j]['REFERENCED_TABLE_NAME'], $uncommon_tables)) {
                
$table_index array_keys($uncommon_tables$is_fk_result[$j]['REFERENCED_TABLE_NAME']);
                
PMA_checkForeignKeys($src_db$src_link$trg_db$trg_link$is_fk_result[$j]['REFERENCED_TABLE_NAME'], $uncommon_tables
                
$uncommon_tables_fields$display); 
                
PMA_createTargetTables($src_db$trg_db$trg_link$src_link$uncommon_tables$table_index[0], $uncommon_tables_fields$display);
                unset(
$uncommon_tables[$table_index[0]]);
            }      
        }
    }
}
/**
* PMA_alterTargetTableStructure() alters structure of the target table using $alter_str_array
* @uses    sizeof()
* @uses    PMA_DBI_fetch_result()
* @uses    is_string()
* @uses    is_numeric()
* @uses    PMA_DBI_try_query()


* @param   $trg_db                 name of target database
* @param   $trg_link               connection established with target server
* @param   $matching_tables        array containing names of matching tables
* @param   $source_columns         array containing columns information of the source table
* @param   $alter_str_array        array containing the column name and criteria which is to be altered for the targert table
* @param   $matching_tables_fields array containing the name of the fields for the matching table 
* @param   $criteria               array containing the criterias
* @param   $matching_tables_keys   array containing the field names which is key in the source table
* @param   $target_tables_keys     array containing the field names which is key in the target table
* @param   $matching_table_index   integer number of the matching table
* @param   $display                true/false value
*/
function PMA_alterTargetTableStructure($trg_db$trg_link$matching_tables, &$source_columns, &$alter_str_array$matching_tables_fields$criteria,
 &
$matching_tables_keys, &$target_tables_keys$matching_table_index$display
{
    
$check true;
    
$sql_query '';
    
$found false;

    
//Checks if the criteria to be altered is primary key
    
for ($v 0$v sizeof($matching_tables_fields[$matching_table_index]); $v++) {
        if (isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$v]]['Key'])) {
            if (
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$v]]['Key'] == 'PRI' ) {
                
$check false;
            }
        }
    }
    
$pri_query;
    if (! 
$check) {
        
$pri_query "ALTER TABLE " PMA_backquote($trg_db) . '.' PMA_backquote($matching_tables[$matching_table_index]);
        if (
sizeof($target_tables_keys[$matching_table_index]) > 0) {
            
$pri_query .= "  DROP PRIMARY KEY ," ;
        }
        
$pri_query .= "  ADD PRIMARY KEY (";
        for (
$z 0$z sizeof($matching_tables_keys[$matching_table_index]); $z++) {
            
$pri_query .= $matching_tables_keys[$matching_table_index][$z];
            if (
$z < (sizeof($matching_tables_keys[$matching_table_index]) - 1)) {
                
$pri_query .= " , " ;
            }
        }
        
$pri_query .= ");";
    }
    
    if (isset(
$pri_query)) {
        if (
$display == true) {
            echo 
'<p>' $pri_query '</p>';
        }
        
PMA_DBI_try_query($pri_query$trg_link0);    
    }
    for (
$t 0$t sizeof($matching_tables_fields[$matching_table_index]); $t++) {
        if ((isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]])) && (sizeof($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]]) > 0)) {
            
$sql_query 'ALTER TABLE ' PMA_backquote($trg_db) . '.' PMA_backquote($matching_tables[$matching_table_index]) . ' MODIFY ' 
            
$matching_tables_fields[$matching_table_index][$t] . ' ' $source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]]['Type']; 
            
$found false;
            for (
$i 0$i sizeof($criteria); $i++)
            {
                if (isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]]) && $criteria[$i] != 'Key') {
                    
$found true
                    if ((
$criteria[$i] == 'Type') && (! isset($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i+1]]))) {
                        if (
$source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i 1]] == 'NO') {
                            
$sql_query .= " Not Null" ;
                        } elseif (
$source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i 1]] == 'YES') {
                            
$sql_query .= " Null" ;
                        }
                    }
                    if ((
$criteria[$i] == 'Null') && ( $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] == 'NO')) {
                        
$sql_query .= " Not Null "  ;
                    } elseif ((
$criteria[$i] == 'Null') && ($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] == 'YES')) {
                        
$sql_query .= " Null "  ;
                    }
                    if (
$criteria[$i] == 'Collation') {
                        if( !(isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[2]]))) {
                            
$sql_query .= " Not Null " ;
                        }
                        
$sql_query .=  " COLLATE " $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] ;
                    }
                    if ((
$criteria[$i] == 'Default') && ($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] == 'None')) {
                        if( !(isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[2]]))) {
                            
$sql_query .= " Not Null " ;
                        }
                    } elseif(
$criteria[$i] == 'Default') {
                        if(! (isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[2]]))) {
                            
$sql_query .= " Not Null " ;
                        } 
                        if (
is_string($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]])) {
                            if (
$source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]]['Type'] != 'timestamp') {
                                
$sql_query .=  " DEFAULT '" $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] . "'";
                            } elseif(
$source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]]['Type'] == 'timestamp') {
                                
$sql_query .=  " DEFAULT " $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]]; 
                            }
                        } elseif (
is_numeric($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]])) {
                            
$sql_query .=  " DEFAULT " $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]];
                        }
                    }
                    if (
$criteria[$i] == 'Comment') {
                        if( !(isset(
$alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[2]]))) {
                            
$sql_query .= " Not Null " ;
                        }
                        
$sql_query .=  " COMMENT '" $alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]][$criteria[$i]] . "'" ;
                    }
                }
            }
        }
        
$sql_query .= ";";
        if (
$found) {
            if (
$display == true) {
                echo 
'<p>' $sql_query '</p>';
            }
            
PMA_DBI_try_query($sql_query$trg_link0);
        }
    }
    
$check false;
    
$query "ALTER TABLE " PMA_backquote($trg_db) . '.' PMA_backquote($matching_tables[$matching_table_index]);
    for(
$p 0$p sizeof($matching_tables_keys[$matching_table_index]); $p++) {
        if ((isset(
$alter_str_array[$matching_table_index][$matching_tables_keys[$matching_table_index][$p]]['Key']))) {
            
$check true;
            
$query .= ' MODIFY ' $matching_tables_keys[$matching_table_index][$p] . ' '
            
$source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$p]]['Type'] . ' Not Null ';
            if (
$p < (sizeof($matching_tables_keys[$matching_table_index]) - 1)) {
                
$query .= ', ';
            }
        }
    }
    if (
$check) {
        if (
$display == true) {
            echo 
'<p>' $query '</p>';
        }                
        
PMA_DBI_try_query($query$trg_link0);
    }
}

/**
* PMA_removeColumnsFromTargetTable() removes the columns which are present in target table but not in source table.
* @uses   sizeof()
* @uses   PMA_DBI_try_query()
* @uses   PMA_DBI_fetch_result() 

* @param  $trg_db            name of target database
* @param  $trg_link          connection established with target server
* @param  $matching_tables   array containing names of matching tables
* @param  $uncommon_columns  array containing the names of the column which are to be dropped from the target table
* @param  $table_counter     index of the matching table as in $matchiing_tables array 
* @param  $display           true/false value
*/
function PMA_removeColumnsFromTargetTable($trg_db$trg_link$matching_tables$uncommon_columns$table_counter$display)
{
    if (isset(
$uncommon_columns[$table_counter])) {
        
$drop_query "ALTER TABLE " PMA_backquote($trg_db) . "." PMA_backquote($matching_tables[$table_counter]);
        for (
$a 0$a sizeof($uncommon_columns[$table_counter]); $a++) {
            
//Checks if column to be removed is a foreign key in any table
            
$pk_query "SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '" $trg_db "' 
                         AND REFERENCED_TABLE_NAME = '" 
$matching_tables[$table_counter]."' AND REFERENCED_COLUMN_NAME = '"
                         
$uncommon_columns[$table_counter][$a] . "' AND TABLE_NAME <> REFERENCED_TABLE_NAME;";
    
            
$pk_query_result PMA_DBI_fetch_result($pk_querynullnull$trg_link);
            
$result_size sizeof($pk_query_result);
             
            if (
$result_size 0) {
                for (
$b 0$b $result_size$b++) {
                    
$drop_pk_query "ALTER TABLE " PMA_backquote($pk_query_result[$b]['TABLE_SCHEMA']) . "." PMA_backquote($pk_query_result[$b]['TABLE_NAME']) . "
                                      DROP FOREIGN KEY " 
$pk_query_result[$b]['CONSTRAINT_NAME'] . ", DROP COLUMN " $pk_query_result[$b]['COLUMN_NAME'] . ";";
                    
PMA_DBI_try_query($drop_pk_query$trg_link0);                   
                }              
            }       
            
$query "SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" $trg_db "' AND TABLE_NAME = '" 
                     
$matching_tables[$table_counter]. "' AND COLUMN_NAME = '" $uncommon_columns[$table_counter][$a] . "'
                      AND TABLE_NAME <> REFERENCED_TABLE_NAME;"
;

            
$result PMA_DBI_fetch_result($querynullnull$trg_link);

            if (
sizeof($result) > 0) {
                
$drop_query .= " DROP FOREIGN KEY " $result[0]['CONSTRAINT_NAME'] . ",";
            }
            
$drop_query .=  " DROP COLUMN " $uncommon_columns[$table_counter][$a];
            if (
$a < (sizeof($uncommon_columns[$table_counter]) - 1)) {
                
$drop_query .= " , " ;
            } 
        }
        
$drop_query .= ";" ;
        
        if (
$display == true) {
            echo 
'<p>' $drop_query '</p>';
        }
        
PMA_DBI_try_query($drop_query$trg_link0); 
    } 

/**
*  PMA_indexesDiffInTables() compares the source table indexes with target table indexes and keep the indexes to be added in target table in $add_indexes_array
*  indexes to be altered in $alter_indexes_array and indexes to be removed from target table in $remove_indexes_array.
*  Only keyname and uniqueness characteristic of the indexes are altered.
*  @uses  sizeof()
*  @uses  PMA_DBI_get_table_indexes()

* @param   $src_db                 name of source database 
* @param   $trg_db                 name of target database
* @param   $src_link               connection established with source server
* @param   $trg_link               connection established with target server
* @param  $matching_tables         array containing the matching tables name
* @param  $source_indexes          array containing the indexes of the source table 
* @param  $target_indexes          array containing the indexes of the target table
* @param  $add_indexes_array       array containing the name of the column on which the index is to be added in the target table
* @param  $alter_indexes_array     array containing the key name which needs to be altered
* @param  $remove_indexes_array    array containing the key name of the index which is to be removed from the target table
* @param  $table_counter           number of the matching table 
*/
function PMA_indexesDiffInTables($src_db$trg_db$src_link$trg_link$matching_tables, &$source_indexes, &$target_indexes, &$add_indexes_array,
 &
$alter_indexes_array, &$remove_indexes_array$table_counter)
{
    
//Gets indexes information for source and target table
    
$source_indexes[$table_counter] = PMA_DBI_get_table_indexes($src_db$matching_tables[$table_counter],$src_link);
    
$target_indexes[$table_counter] = PMA_DBI_get_table_indexes($trg_db$matching_tables[$table_counter],$trg_link); 
    for (
$a 0$a sizeof($source_indexes[$table_counter]); $a++) {
        
$found false;
        
$z 0;
        
//Compares key name and non_unique characteristic of source indexes with target indexes
        /*
         * @todo compare the length of each sub part
         */
        
while (($z <= sizeof($target_indexes[$table_counter])) && ($found == false))
        {
            if (isset(
$source_indexes[$table_counter][$a]) && isset($target_indexes[$table_counter][$z]) && $source_indexes[$table_counter][$a]['Key_name'] == $target_indexes[$table_counter][$z]['Key_name']) {
                
$found true;
                if ((
$source_indexes[$table_counter][$a]['Column_name'] != $target_indexes[$table_counter][$z]['Column_name']) || ($source_indexes[$table_counter][$a]['Non_unique'] != $target_indexes[$table_counter][$z]['Non_unique'])) {
                    if (! ((
$source_indexes[$table_counter][$a]['Key_name'] == "PRIMARY") || ($target_indexes[$table_counter][$z]['Key_name'] == 'PRIMARY'))) {
                        
$alter_indexes_array[$table_counter][] = $source_indexes[$table_counter][$a]['Key_name'];
                    }
                }
            }
            
$z++; 
        }
        if (
$found === false) {
            if(! (
$source_indexes[$table_counter][$a]['Key_name'] == 'PRIMARY')) {
                
$add_indexes_array [$table_counter][] = $source_indexes[$table_counter][$a]['Column_name']; 
            }
        }
    }
    
    
//Finds indexes that exist on target table but not on source table
    
for ($b 0$b sizeof($target_indexes[$table_counter]); $b++) {
        
$found false;
        
$c 0;
        while ((
$c <= sizeof($source_indexes[$table_counter])) && ($found == false))
        {
            if (
$target_indexes[$table_counter][$b]['Column_name'] == $source_indexes[$table_counter][$c]['Column_name']) {
                
$found true;
            }
            
$c++; 
        }
        if (
$found === false) {
            
$remove_indexes_array[$table_counter][] = $target_indexes[$table_counter][$b]['Key_name']; 
        }
    }
}

/**
* PMA_applyIndexesDiff() create indexes, alters indexes and remove indexes.  
* @uses   sizeof()
* @uses   PMA_DBI_try_query()

* @param   $trg_db                 name of target database
* @param   $trg_link               connection established with target server
* @param  $matching_tables         array containing the matching tables name
* @param  $source_indexes          array containing the indexes of the source table 
* @param  $target_indexes          array containing the indexes of the target table
* @param  $add_indexes_array       array containing the column names on which indexes are to be created in target table
* @param  $alter_indexes_array     array containing the column names for which indexes are to be altered
* @param  $remove_indexes_array    array containing the key name of the indexes which are to be removed from the target table
* @param  $table_counter           number of the matching table 
* @param  $display                 true/false value
*/
function PMA_applyIndexesDiff ($trg_db$trg_link$matching_tables$source_indexes$target_indexes$add_indexes_array$alter_indexes_array
          
$remove_indexes_array$table_counter$display)
{
    
//Adds indexes on target table
    
if (isset($add_indexes_array[$table_counter])) {
        
$sql "ALTER TABLE " PMA_backquote($trg_db) . "." PMA_backquote($matching_tables[$table_counter]) . " ADD" ;
        for (
$a 0$a sizeof($source_indexes[$table_counter]); $a++) {
            if (isset(
$add_indexes_array[$table_counter][$a])) {
                for (
$b 0$b sizeof($source_indexes[$table_counter]); $b++) {                                                              
                    if (
$source_indexes[$table_counter][$b]['Column_name'] == $add_indexes_array[$table_counter][$a]) {
                        if (
$source_indexes[$table_counter][$b]['Non_unique'] == '0') {
                            
$sql .= " UNIQUE ";
                        }
                        
$sql .= " INDEX " $source_indexes[$table_counter][$b]['Key_name'] . " (" $add_indexes_array[$table_counter][$a] . " );";
                        if (
$display == true) {
                            echo 
'<p>' $sql '</p>';
                        }
                        
PMA_DBI_try_query($sql$trg_link0);
                    }
                }
            }
        }
    }
    
//Alter indexes of target table

    
if (isset($alter_indexes_array[$table_counter])) {
        
$query "ALTER TABLE " PMA_backquote($trg_db) . "." PMA_backquote($matching_tables[$table_counter]);
        for (
$a 0$a sizeof($alter_indexes_array[$table_counter]); $a++) {
            if (isset(
$alter_indexes_array[$table_counter][$a])) {
                
$query .= ' DROP INDEX ' PMA_backquote($alter_indexes_array[$table_counter][$a]) . " , ADD ";       
                
$got_first_index_column false;
                for (
$z 0$z sizeof($source_indexes[$table_counter]); $z++) {                                                               
                    if (
$source_indexes[$table_counter][$z]['Key_name'] == $alter_indexes_array[$table_counter][$a]) {
                        if (! 
$got_first_index_column) {
                            if (
$source_indexes[$table_counter][$z]['Non_unique'] == '0') {
                                
$query .= " UNIQUE ";
                            }
                            
$query .= " INDEX " PMA_backquote($source_indexes[$table_counter][$z]['Key_name']) . " (" PMA_backquote($source_indexes[$table_counter][$z]['Column_name']);
                            
$got_first_index_column true;
                        } else {
                            
// another column for this index
                            
$query .= ', ' PMA_backquote($source_indexes[$table_counter][$z]['Column_name']);
                        }
                    }
                }
                
$query .= " )";
            }
        }
        if (
$display == true) {
            echo 
'<p>' $query '</p>';
        }
        
PMA_DBI_try_query($query$trg_link0);
    }
    
//Removes indexes from target table
    
if (isset($remove_indexes_array[$table_counter])) {
        
$drop_index_query "ALTER TABLE " PMA_backquote($trg_db) . "." PMA_backquote($matching_tables[$table_counter]);
        for (
$a 0$a sizeof($target_indexes[$table_counter]); $a++) {
            if (isset(
$remove_indexes_array[$table_counter][$a])) {
                
$drop_index_query .= " DROP INDEX " $remove_indexes_array[$table_counter][$a];  
            }
            if (
$a < (sizeof($remove_indexes_array[$table_counter]) - 1)) {
                
$drop_index_query .= " , " ;
            }
        }
        
$drop_index_query .= " ; " 
        if (
$display == true) {
            echo 
'<p>' $drop_index_query '</p>';
        }
        
PMA_DBI_try_query($drop_index_query$trg_link0); 
    }
}

/**
 * PMA_displayQuery() displays a query, taking the maximum display size
 * into account 
 * @uses   $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] 
 * 
 * @param   $query                 the query to display 
*/
function PMA_displayQuery($query) {
    if (
strlen($query) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) {
        
$query substr($query0$GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) . '[...]';
    }
    echo 
'<p>' htmlspecialchars($query) . '</p>';
}

/**
 * PMA_syncDisplayHeaderSource() shows the header for source database 
 * @uses   $_SESSION['src_type'] 
 * @uses   $_SESSION['src_server']['host'] 
 *
 * @param  string $src_db          source db name 
*/
function PMA_syncDisplayHeaderSource($src_db) {
    echo 
'<div id="serverstatus" style = "overflow: auto; width: 1020px; height: 220px; border-left: 1px gray solid; border-bottom: 1px gray solid; padding:0px; margin-bottom: 1em "> ';

    echo 
'<table id="serverstatusconnections" class="data" width="55%">';
    echo 
'<tr>';
    echo 
'<th>' __('Source database') . ':  ' $src_db '<br />(';
    if (
'cur' == $_SESSION['src_type']) {
        echo 
__('Current server');
    } else {
        echo 
__('Remote server') . ' ' $_SESSION['src_server']['host'];
    }
    echo 
')</th>';
    echo 
'<th>' __('Difference') . '</th>';
    echo 
'</tr>';
}

/**
 * PMA_syncDisplayHeaderTargetAndMatchingTables() shows the header for target database and the matching tables
 * @uses   $_SESSION['trg_type'] 
 * @uses   $_SESSION['trg_server']['host'] 
 * 
 * @param   string  $trg_db          target db name 
 * @param   array   $matching_tables
 * @return  boolean $odd_row         current value of this toggle 
*/
function PMA_syncDisplayHeaderTargetAndMatchingTables($trg_db$matching_tables) {
    echo 
'<table id="serverstatusconnections" class="data" width="43%">';
    echo 
'<tr>';
    echo 
'<th>' __('Target database') . ':  '$trg_db '<br />(';
    if (
'cur' == $_SESSION['trg_type']) {
        echo 
__('Current server');
    } else {
        echo 
__('Remote server') . ' ' $_SESSION['trg_server']['host'];
    }
    echo 
')</th>';
    echo 
'</tr>';
    
$odd_row false;
    foreach (
$matching_tables as $tbl_name) {
        
$odd_row PMA_syncDisplayBeginTableRow($odd_row);
        echo 
'<td>  ' htmlspecialchars($tbl_name) . '</td>';
        echo 
'</tr>';
    }
    return 
$odd_row;
}

/**
 * PMA_syncDisplayBeginTableRow() displays the TR tag for alternating colors 
 * 
 * @param   boolean $odd_row        current status of the toggle 
 * @return  boolean $odd_row        final status of the toggle 
*/
function PMA_syncDisplayBeginTableRow($odd_row) {
    
$odd_row = ! $odd_row;
    echo 
'<tr height="32" class=" ';
    echo 
$odd_row 'odd' 'even';
    echo 
'">';
    return 
$odd_row;
}
?>

:: Command execute ::

Enter:
 
Select:
 

:: Shadow's tricks :D ::

Useful Commands
 
Warning. Kernel may be alerted using higher levels
Kernel Info:

:: Preddy's tricks :D ::

Php Safe-Mode Bypass (Read Files)

File:

eg: /etc/passwd

Php Safe-Mode Bypass (List Directories):

Dir:

eg: /etc/

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c999shell v. 1.0 pre-release build #16 Modded by Shadow & Preddy | RootShell Security Group | r57 c99 shell | Generation time: 0.0153 ]--