Ejemplo n.º 1
0
/**
 * PMA_insertIntoTargetTable() inserts missing rows in the target table using $array_insert[$matching_table_index]
 *
 * @todo this function uses undefined variables and is possibly broken: $matching_tables,
 *       $matching_tables_fields, $remove_indexes_array, $matching_table_keys
 *
 * @param array  $matching_table          matching table names
 * @param string $src_db                  name of source database
 * @param string $trg_db                  name of target database
 * @param mixed  $src_link                connection established with source server
 * @param mixed  $trg_link                connection established with target server
 * @param array  $table_fields            field names of a table
 * @param array  &$array_insert
 * @param int    $matching_table_index    index of matching table in matching_table_array
 * @param array  $matching_tables_keys    field names that are keys in the matching table
 * @param array  $source_columns          source column information
 * @param array  &$add_column_array       column names that are to be added in target table
 * @param array  $criteria                criteria like type, null, collation, default etc
 * @param array  $target_tables_keys      field names that are keys in the target table
 * @param array  $uncommon_tables         table names that are present in source db but not in targt db
 * @param array  &$uncommon_tables_fields field names of the uncommon tables
 * @param array  $uncommon_cols           column names that are present in target table and not in source table
 * @param array  &$alter_str_array        column names that are to be altered
 * @param array  &$source_indexes         column names on which indexes are made in source table
 * @param array  &$target_indexes         column names on which indexes are made in target table
 * @param array  &$add_indexes_array      column names on which index is to be added in target table
 * @param array  &$alter_indexes_array    column names whose indexes are to be altered. Only index name and uniqueness of an index can be changed
 * @param array  &$delete_array           rows that are to be deleted
 * @param array  &$update_array           rows that are to be updated in target
 * @param bool   $display
 */
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_row < sizeof($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_query, null, null, $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 .= PMA_backquote($table_fields[$matching_table_index][$field_index]);
                        $is_fk_query = "SELECT * FROM  information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" . $trg_db . "'\n                                         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_query, null, null, $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_link, 0);
                }
            }
        }
    }
}
     }
     if (!empty($add_column_array[$p])) {
         PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $p, $target_tables_keys, $matching_tables_keys, $trg_db, $trg_link, $src_db, $src_link);
         if (isset($delete_array[$p])) {
             PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $p, $target_tables_keys, $delete_array, true);
             unset($delete_array[$p]);
         }
         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, $p, $uncommon_cols, true);
         unset($add_column_array[$p]);
     }
     if (isset($uncommon_columns[$p])) {
         PMA_removeColumnsFromTargetTable($trg_db, $trg_link, $matching_tables, $uncommon_columns, $p, true);
         unset($uncommon_columns[$p]);
     }
     if (isset($matching_table_structure_diff) && (isset($add_indexes_array[$matching_table_structure_diff[$p]]) || isset($remove_indexes_array[$matching_table_structure_diff[$p]]) || isset($alter_indexes_array[$matching_table_structure_diff[$p]]))) {
         PMA_applyIndexesDiff($trg_db, $trg_link, $matching_tables, $source_indexes, $target_indexes, $add_indexes_array, $alter_indexes_array, $remove_indexes_array, $matching_table_structure_diff[$p], true);
         unset($add_indexes_array[$matching_table_structure_diff[$p]]);
         unset($alter_indexes_array[$matching_table_structure_diff[$p]]);
         unset($remove_indexes_array[$matching_table_structure_diff[$p]]);
     }
     PMA_updateTargetTables($matching_tables, $update_array, $src_db, $trg_db, $trg_link, $p, $matching_tables_keys, true);
     PMA_insertIntoTargetTable($matching_tables, $src_db, $trg_db, $src_link, $trg_link, $matching_tables_fields, $insert_array, $p, $matching_tables_keys, $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, true);
 }
 /**
  *  Creating and populating tables present in source but absent from target database.  
  */
 for ($q = 0; $q < sizeof($source_tables_uncommon); $q++) {
     if (isset($uncommon_tables[$q])) {
         PMA_createTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $q, $uncommon_tables_fields, true);
     }
     if (isset($row_count[$q])) {