Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Remove the Synchronize feature

  • Loading branch information...
commit c4ff4bee20a7d6724af9773c142615c85f95e2c1 1 parent 3c68a0b
@lem9 lem9 authored
View
1  ChangeLog
@@ -69,6 +69,7 @@ VerboseMultiSubmit, ReplaceHelpImg
+ Renamed configuration directive: LeftRecentTable => NumRecentTables
+ Renamed configuration directive: LeftDisplayDatabaseFilterMinimum => NavigationTreeDisplayDbFilterMinimum
+ Removed the "Mark row on click" feature; must now click the checkbox to mark
++ Removed the "Synchronize" feature
3.5.4.0 (not yet released)
- bug #3570212 [edit] uuid_short() is a no-arguments function
View
77 Documentation.html
@@ -142,10 +142,6 @@ <h2 id="intro">Introduction</h2>
<li>create, edit, export and drop events and triggers</li>
<li>communicate in <a href="http://www.phpmyadmin.net/home_page/translations.php">62 different languages</a>
</li>
- <li>synchronize two databases residing on the same as well as remote servers
- <a href="#faq9_1">(see <abbr title="Frequently Asked Questions">FAQ</abbr> 9.1)</a>
- </li>
-
</ul>
<h4>A word about users:</h4>
@@ -1427,8 +1423,8 @@ <h2 id="config">Configuration</h2>
<dt id="cfg_ExecTimeLimit">$cfg['ExecTimeLimit'] integer [number of seconds]</dt>
<dd>Set the number of seconds a script is allowed to run. If seconds is set
to zero, no time limit is imposed.<br />
- This setting is used while importing/exporting dump files and in the
- Synchronize feature but has no effect when PHP is running in safe mode.</dd>
+ This setting is used while importing/exporting dump files but has no
+ effect when PHP is running in safe mode.</dd>
<dt id="cfg_SessionSavePath">$cfg['SessionSavePath'] string</dt>
<dd>Path for storing session data (<a
@@ -1514,7 +1510,8 @@ <h2 id="config">Configuration</h2>
<dt id="AllowArbitraryServer">
<span id="cfg_AllowArbitraryServer">$cfg['AllowArbitraryServer']</span> boolean</dt>
- <dd>If enabled, allows you to log in to arbitrary servers using cookie auth and permits to specify servers of your choice in the Synchronize dialog.
+ <dd>If enabled, allows you to log in to arbitrary servers using cookie
+ auth.
<br /><br />
<strong>NOTE:</strong> Please use this carefully, as this may allow users access to
@@ -4467,70 +4464,10 @@ <h4 id="faq8_2">
<h3 id="faqsynchronization">Synchronization</h3>
<h4 id="faq9_1">
- <a href="#faq9_1">9.1 How can I synchronize two databases/tables in phpMyAdmin?</a></h4>
-
-<p> You can now synchronize databases/tables in phpMyAdmin using the Synchronize feature.
-It allows you to connect to local as well as remote servers. This requires you to enter
-server host name, username, password, port and the name of the database. Therefore you can
-now synchronize your databases placed on the same server or some remote server.
-</p>
-
-<p>
-This feature is helpful for developers who need to replicate their
-database&#8217;s structure as well as data. Moreover, this feature not only
-helps replication but also facilitates the user to keep his/her database
-in sync with another database. Other than the full database, certain
-tables of the databases can also be synchronized.
-</p>
-
-<p>
-You need to fill in the host name of the server, the username and
-password of an user account already there in MySQL. Port is by default
-populated with 3306 (MySQL default port). Then the name of the database
-should be mentioned at the end. All the information other than the port
-needs to be filled explicitly for the source as well as target servers.
-</p>
-
-<p>
-After successfully passing through the authentication phase, the source and
-target database table names will be displayed. It will be a tabular
-representation.
-</p>
-
-<p>
-On the left, are listed the source database table names. Some of the
-names have a <code>+</code> plus sign preceding them. This shows that these tables
-are only present in source database and they need to be added to the
-target database in order to synchronize the target database. The tables
-whose names are not preceded by a <code>+</code> sign are already present in the
-target database.
-</p>
-
-<p>
-On the right, are listed the target database table names. There are few
-table names that have <code>(not present)</code> appended after their names. This
-means that these tables are to be created in target database in order to
-synchronize target database with source database. Some table names
-have a <code>-</code> minus sign preceding them. This shows that these tables are
-only present in target database and they will remain unchanged in the
-target database. The column in the middle shows the difference between
-the source and target corresponding tables.
-</p>
-
-<p>
-The difference is depicted by the red and green buttons with <code>S</code> and <code>D</code>
-letters, indicating that either Structure or Data are not up to date. By
-clicking on them, they will turn grey, what means that they will be synchronized.
-</p>
+ <a href="#faq9_1">9.1 (withdrawn)</a></h4>
<h4 id="faq9_2">
- <a href="#faq9_2">9.2 Are there problems with data synchronizing large
- tables?</a></h4>
-
-<p>
-Yes. This aspect of synchronization is currently limited to small tables, and they
-must have a primary key.
-</p>
+ <a href="#faq9_2">9.2 (withdrawn)</a></h4>
<!-- DEVELOPERS -->
<h2 id="developers">Developers Information</h2>
@@ -4804,7 +4741,7 @@ <h2 id="credits">Credits</h2>
<li>Zahra Naeem (Google Summer of Code 2009)
<ul>
- <li>Synchronization feature</li>
+ <li>Synchronization feature (withdrawn in release 4.0)</li>
</ul></li>
<li>Tom&#225;&#353; Srnka (Google Summer of Code 2009)
View
395 js/server_synchronize.js
@@ -1,395 +0,0 @@
-/* vim: set expandtab sw=4 ts=4 sts=4: */
-/**
- * for server_synchronize.php
- *
- */
-
-// Global variable row_class is set to even
-var row_class = 'even';
-
-/**
-* Generates a row dynamically in the differences table displaying
-* the complete statistics of difference in table like number of
-* rows to be updated, number of rows to be inserted, number of
-* columns to be added, number of columns to be removed, etc.
-*
-* @param index index of matching table
-* @param update_size number of rows/column to be updated
-* @param insert_size number of rows/coulmns to be inserted
-* @param remove_size number of columns to be removed
-* @param insert_index number of indexes to be inserted
-* @param remove_index number of indexes to be removed
-* @param img_obj image object
-* @param table_name name of the table
-*/
-
-function showDetails(i, update_size, insert_size, remove_size, insert_index, remove_index, img_obj, table_name)
-{
- // a jQuery object
- var $img = $(img_obj);
-
- $img.toggleClass('selected');
-
- // The image source is changed when the showDetails function is called.
- if ($img.hasClass('selected')) {
- if ($img.hasClass('struct_img')) {
- $img.attr('src', pmaThemeImage + 'new_struct_selected.png');
- }
- if ($img.hasClass('data_img')) {
- $img.attr('src', pmaThemeImage + 'new_data_selected.png');
- }
- } else {
- if ($img.hasClass('struct_img')) {
- $img.attr('src', pmaThemeImage + 'new_struct.png');
- }
- if ($img.hasClass('data_img')) {
- $img.attr('src', pmaThemeImage + 'new_data.png');
- }
- }
-
- var div = document.getElementById("list");
- var table = div.getElementsByTagName("table")[0];
- var table_body = table.getElementsByTagName("tbody")[0];
-
- //Global variable row_class is being used
- if (row_class == 'even') {
- row_class = 'odd';
- } else {
- row_class = 'even';
- }
- // If the red or green button against a table name is pressed then append a new row to show the details of differences of this table.
- if ($img.hasClass('selected')) {
- var newRow = document.createElement("tr");
- newRow.setAttribute("class", row_class);
- newRow.className = row_class;
- // Id assigned to this row element is same as the index of this table name in the matching_tables/source_tables_uncommon array
- newRow.setAttribute("id", i);
-
- var table_name_cell = document.createElement("td");
- table_name_cell.align = "center";
- table_name_cell.innerHTML = table_name ;
-
- newRow.appendChild(table_name_cell);
-
- var create_table = document.createElement("td");
- create_table.align = "center";
-
- var add_cols = document.createElement("td");
- add_cols.align = "center";
-
- var remove_cols = document.createElement("td");
- remove_cols.align = "center";
-
- var alter_cols = document.createElement("td");
- alter_cols.align = "center";
-
- var add_index = document.createElement("td");
- add_index.align = "center";
-
- var delete_index = document.createElement("td");
- delete_index.align = "center";
-
- var update_rows = document.createElement("td");
- update_rows.align = "center";
-
- var insert_rows = document.createElement("td");
- insert_rows.align = "center";
-
- var tick_image = document.createElement("img");
- tick_image.src = PMA_getImage('s_success.png').attr('src');
- tick_image.className = PMA_getImage('s_success.png').attr('class');
-
- if (update_size == '' && insert_size == '' && remove_size == '') {
- /**
- This is the case when the table needs to be created in target database.
- */
- create_table.appendChild(tick_image);
- add_cols.innerHTML = "--";
- remove_cols.innerHTML = "--";
- alter_cols.innerHTML = "--";
- delete_index.innerHTML = "--";
- add_index.innerHTML = "--";
- update_rows.innerHTML = "--";
- insert_rows.innerHTML = "--";
-
- newRow.appendChild(create_table);
- newRow.appendChild(add_cols);
- newRow.appendChild(remove_cols);
- newRow.appendChild(alter_cols);
- newRow.appendChild(delete_index);
- newRow.appendChild(add_index);
- newRow.appendChild(update_rows);
- newRow.appendChild(insert_rows);
-
- } else if (update_size == '' && remove_size == '') {
- /**
- This is the case when data difference is displayed in the
- table which is present in source but absent from target database
- */
- create_table.innerHTML = "--";
- add_cols.innerHTML = "--";
- remove_cols.innerHTML = "--";
- alter_cols.innerHTML = "--";
- add_index.innerHTML = "--";
- delete_index.innerHTML = "--";
- update_rows.innerHTML = "--";
- insert_rows.innerHTML = insert_size;
-
- newRow.appendChild(create_table);
- newRow.appendChild(add_cols);
- newRow.appendChild(remove_cols);
- newRow.appendChild(alter_cols);
- newRow.appendChild(delete_index);
- newRow.appendChild(add_index);
- newRow.appendChild(update_rows);
- newRow.appendChild(insert_rows);
-
- } else if (remove_size == '') {
- /**
- This is the case when data difference between matching_tables is displayed.
- */
- create_table.innerHTML = "--";
- add_cols.innerHTML = "--";
- remove_cols.innerHTML = "--";
- alter_cols.innerHTML = "--";
- add_index.innerHTML = "--";
- delete_index.innerHTML = "--";
- update_rows.innerHTML = update_size;
- insert_rows.innerHTML = insert_size;
-
- newRow.appendChild(create_table);
- newRow.appendChild(add_cols);
- newRow.appendChild(remove_cols);
- newRow.appendChild(alter_cols);
- newRow.appendChild(delete_index);
- newRow.appendChild(add_index);
- newRow.appendChild(update_rows);
- newRow.appendChild(insert_rows);
-
- } else {
- /**
- This is the case when structure difference between matching_tables id displayed
- */
- create_table.innerHTML = "--";
- add_cols.innerHTML = insert_size;
- remove_cols.innerHTML = remove_size;
- alter_cols.innerHTML = update_size;
- delete_index.innerHTML = remove_index;
- add_index.innerHTML = insert_index;
- update_rows.innerHTML = "--";
- insert_rows.innerHTML = "--";
-
- newRow.appendChild(create_table);
- newRow.appendChild(add_cols);
- newRow.appendChild(remove_cols);
- newRow.appendChild(alter_cols);
- newRow.appendChild(delete_index);
- newRow.appendChild(add_index);
- newRow.appendChild(update_rows);
- newRow.appendChild(insert_rows);
- }
- table_body.appendChild(newRow);
-
- } else {
- //The case when the row showing the details need to be removed from the table i.e. the difference button is deselected now.
- var table_rows = table_body.getElementsByTagName("tr");
- var j;
- var index = 0;
- for (j=0; j < table_rows.length; j++)
- {
- if (table_rows[j].id == i) {
- index = j;
- table_rows[j].parentNode.removeChild(table_rows[j]);
- }
- }
- //The table row css is being adjusted. Class "odd" for odd rows and "even" for even rows should be maintained.
- for(index = 0; index < table_rows.length; index++)
- {
- row_class_element = table_rows[index].getAttribute('class');
- if (row_class_element == "even") {
- table_rows[index].setAttribute("class", "odd"); // for Mozilla firefox
- table_rows[index].className = "odd"; // for IE browser
- } else {
- table_rows[index].setAttribute("class", "even"); // for Mozilla firefox
- table_rows[index].className = "even"; // for IE browser
- }
- }
- }
-}
-
-/**
- * Generates the URL containing the list of selected table ids for synchronization and
- * a variable checked for confirmation of deleting previous rows from target tables
- *
- * @param token the token generated for each PMA form
- *
- */
-function ApplySelectedChanges(token)
-{
- /**
- Append the token at the beginning of the query string followed by
- Table_ids that shows that "Apply Selected Changes" button is pressed
- */
- var params = {
- token: $('#synchronize_form input[name=token]').val(),
- server: $('#synchronize_form input[name=server]').val(),
- checked: $('#delete_rows').prop('checked') ? 'true' : 'false',
- Table_ids: 1
- };
- var $rows = $('#list tbody tr');
- for(var i = 0; i < $rows.length; i++) {
- params[i] = $($rows[i]).attr('id');
- }
-
- //Appending the token and list of table ids in the URL
- location.href = $('#synchronize_form').attr('action') + '?' + $.param(params);
-}
-
-
-/**
- * Validates a partial form (source part or target part)
- *
- * @param which 'src' or 'trg'
- * @return boolean whether the partial form is valid
- *
- */
-function validateSourceOrTarget(which)
-{
- var partial_form_is_ok = true;
-
- if ($("#" + which + "_type").val() != 'cur') {
- // did not choose "current connection"
- if ($("input[name='" + which + "_username']").val() == ''
- || $("input[name='" + which + "_pass']").val() == ''
- || $("input[name='" + which + "_db']").val() == ''
- // must have at least a host or a socket
- || ($("input[name='" + which + "_host']").val() == ''
- && $("input[name='" + which + "_socket']").val() == '')
- // port can be empty
- ) {
- partial_form_is_ok = false;
- }
- }
- return partial_form_is_ok;
-}
-/**
-* Displays an error message if any text field
-* is left empty other than the port field, unless
-* we are dealing with the "current connection" choice
-*
-* @return boolean whether the form is valid
-*/
-function validateConnectionParams()
-{
- var form_is_ok = true;
-
- if (! validateSourceOrTarget('src') || ! validateSourceOrTarget('trg')) {
- form_is_ok = false;
- }
- if (! form_is_ok) {
- alert(PMA_messages['strFormEmpty']);
- }
- return form_is_ok;
-}
-
-/**
- * Handles the dynamic display of form fields related to a server selector
- */
-
-function hideOrDisplayServerFields($server_selector, selected_option)
-{
- $tbody = $server_selector.closest('tbody');
- if (selected_option == 'cur') {
- $tbody.children('.current-server').css('display', '');
- $tbody.children('.remote-server').css('display', 'none');
- } else if (selected_option == 'rmt') {
- $tbody.children('.current-server').css('display', 'none');
- $tbody.children('.remote-server').css('display', '');
- } else {
- $tbody.children('.current-server').css('display', 'none');
- $tbody.children('.remote-server').css('display', '');
- var parts = selected_option.split('||||');
- $tbody.find('.server-host').val(parts[0]);
- $tbody.find('.server-port').val(parts[1]);
- $tbody.find('.server-socket').val(parts[2]);
- $tbody.find('.server-user').val(parts[3]);
- $tbody.find('.server-pass').val('');
- $tbody.find('.server-db').val(parts[4]);
- }
-}
-
-/**
- * Unbind all event handlers before tearing down a page
- */
-AJAX.registerTeardown('server_synchonize.js', function() {
- $('select.server_selector').unbind('change');
- $('img.struct_img').unbind('hover');
- $('img.data_img').unbind('hover');
- $('#buttonGo').unbind('click');
-});
-
-AJAX.registerOnload('server_synchronize.js', function() {
- $('select.server_selector').change(function(evt) {
- var selected_option = $(evt.target).val();
- hideOrDisplayServerFields($(evt.target), selected_option);
- });
-
- // initial display of the selectors
- $('select.server_selector').each(function() {
- var selected_option = $(this).val();
- hideOrDisplayServerFields($(this), selected_option);
- });
-
- $('img.struct_img').hover(
- // pmaThemeImage comes from js/messages.php
- function() {
- // mouse enters the element
- var $img = $(this);
- $img.addClass('hover');
- if ($img.hasClass('selected')) {
- $img.attr('src', pmaThemeImage + 'new_struct_selected_hovered.png');
- } else {
- $img.attr('src', pmaThemeImage + 'new_struct_hovered.png');
- }
- },
- function() {
- // mouse leaves the element
- var $img = $(this);
- $img.removeClass('hover');
- if ($img.hasClass('selected')) {
- $img.attr('src', pmaThemeImage + 'new_struct_selected.png');
- } else {
- $img.attr('src', pmaThemeImage + 'new_struct.png');
- }
- }
- );
-
- $('img.data_img').hover(
- function() {
- // mouse enters the element
- var $img = $(this);
- $img.addClass('hover');
- if ($img.hasClass('selected')) {
- $img.attr('src', pmaThemeImage + 'new_data_selected_hovered.png');
- } else {
- $img.attr('src', pmaThemeImage + 'new_data_hovered.png');
- }
- },
- function() {
- // mouse leaves the element
- var $img = $(this);
- $img.removeClass('hover');
- if ($img.hasClass('selected')) {
- $img.attr('src', pmaThemeImage + 'new_data_selected.png');
- } else {
- $img.attr('src', pmaThemeImage + 'new_data.png');
- }
- }
- );
-
- $('#buttonGo').click(function(event) {
- if (! validateConnectionParams()) {
- event.preventDefault();
- }
- });
-});
View
4 libraries/Menu.class.php
@@ -479,10 +479,6 @@ private function _getServerTabs()
array('prefs_forms.php', 'prefs_manage.php')
);
- $tabs['synchronize']['icon'] = 's_sync.png';
- $tabs['synchronize']['link'] = 'server_synchronize.php';
- $tabs['synchronize']['text'] = __('Synchronize');
-
if (! empty($binary_logs)) {
$tabs['binlog']['icon'] = 's_tbl.png';
$tabs['binlog']['link'] = 'server_binlog.php';
View
7 libraries/Util.class.php
@@ -3266,12 +3266,7 @@ public static function expandUserString(
$vars['server_verbose_or_name'] = $GLOBALS['cfg']['Server']['verbose'];
}
- if (is_array($GLOBALS['db'])) {
- // this happens when clicking on Synchronize
- $vars['database'] = '';
- } else {
- $vars['database'] = $GLOBALS['db'];
- }
+ $vars['database'] = $GLOBALS['db'];
$vars['table'] = $GLOBALS['table'];
$vars['phpmyadmin_version'] = 'phpMyAdmin ' . PMA_VERSION;
View
1,701 libraries/server_synchronize.lib.php
@@ -1,1701 +0,0 @@
-<?php
-/* vim: set expandtab sw=4 ts=4 sts=4: */
-/**
- * Server synchronisation functions.
- *
- * @package PhpMyAdmin
- */
-if (! defined('PHPMYADMIN')) {
- exit;
-}
-
-/**
- * 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 array $trg_tables array of target database table names,
- * @param array $src_tables array of source database table names,
- * @param array &$matching_tables empty array passed by reference to save
- * names of matching tables,
- * @param array &$uncommon_source_tables empty array passed by reference to save
- * names of tables present in source database
- * but absent from target database
- *
- * @return void
- */
-function PMA_getMatchingTables($trg_tables, $src_tables, &$matching_tables,
- &$uncommon_source_tables
-) {
- for ($k=0; $k< count($src_tables); $k++) {
- $present_in_target = false;
- for ($l=0; $l < count($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];
- }
- }
-}
-
-/**
- * Places tables present in target database but are absent from source database
- *
- * @param array $trg_tables array of target database table names,
- * @param array $matching_tables matching tables array containing names
- * of matching tables,
- * @param array &$uncommon_target_tables empty array passed by reference to save
- * names of tables presnet in target database
- * but absent from source database
- *
- * @return void
- */
-function PMA_getNonMatchingTargetTables($trg_tables, $matching_tables,
- &$uncommon_target_tables
-) {
- for ($c=0; $c<count($trg_tables); $c++) {
- $match = false;
- for ($d=0; $d < count($matching_tables); $d++) {
- if ($trg_tables[$c] === $matching_tables[$d]) {
- $match=true;
- }
- }
- if ($match === false) {
- $uncommon_target_tables[] = $trg_tables[$c];
- }
- }
-}
-
-/**
- * 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.
- *
- * @param string $src_db name of source database
- * @param string $trg_db name of target database
- * @param db_link $src_link connection established with source server
- * @param db_link $trg_link connection established with target server
- * @param array &$matching_table array containing matching table names
- * @param array &$matching_tables_fields A two dimensional array passed by
- * reference to contain names of fields for
- * each matching table
- * @param array &$update_array A three dimensional array passed by
- * reference to contain updates required
- * for each matching table
- * @param array &$insert_array A three dimensional array passed by
- * reference to contain inserts required
- * for each matching table
- * @param array &$delete_array Unused
- * @param array &$fields_num A two dimensional array passed by
- * reference to contain number of fields
- * for each matching table
- * @param int $matching_table_index Index of a table from $matching_table
- * array
- * @param array &$matching_tables_keys A two dimensional array passed by
- * reference to contain names of keys for
- * each matching table
- *
- * @return void
- */
-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])) {
- return;
- }
-
- $fld = array();
- $fld_results = PMA_DBI_get_columns(
- $src_db, $matching_table[$matching_table_index], null, true, $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] = count($fld);
- $matching_tables_keys[$matching_table_index] = $is_key;
-
- $source_result_set = PMA_getColumnValues(
- $src_db, $matching_table[$matching_table_index], $is_key, $src_link
- );
- $source_size = count($source_result_set);
-
- $trg_fld_results = PMA_DBI_get_columns(
- $trg_db, $matching_table[$matching_table_index], null, true, $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;
-
- 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_Util::backquote($trg_db) . "."
- . PMA_Util::backquote($matching_table[$matching_table_index])
- . " WHERE ";
-
- if (count($is_key) == 1) {
- $trg_select_query .= PMA_Util::backquote($is_key[0])
- . "='" . $source_result_set[$j] . "'";
- } elseif (count($is_key) > 1) {
- for ($k=0; $k < count($is_key); $k++) {
- $trg_select_query .= PMA_Util::backquote($is_key[$k])
- . "='" . $source_result_set[$j][$is_key[$k]] . "'";
- if ($k < (count($is_key)-1)) {
- $trg_select_query .= " AND ";
- }
- }
- }
-
- $target_result_set = PMA_DBI_fetch_result(
- $trg_select_query,
- null,
- null,
- $trg_link
- );
- if ($target_result_set) {
-
- // Fetch the row from the source server to do a comparison
- $src_select_query = "SELECT * FROM "
- . PMA_Util::backquote($src_db) . "."
- . PMA_Util::backquote(
- $matching_table[$matching_table_index]
- )
- . " WHERE ";
-
- if (count($is_key) == 1) {
- $src_select_query .= PMA_Util::backquote($is_key[0])
- . "='" . $source_result_set[$j] . "'";
- } elseif (count($is_key) > 1) {
- for ($k=0; $k< count($is_key); $k++) {
- $src_select_query .= PMA_Util::backquote($is_key[$k])
- . "='" . $source_result_set[$j][$is_key[$k]] . "'";
- if ($k < (count($is_key) - 1)) {
- $src_select_query .= " AND ";
- }
- }
- }
-
- $src_result_set = PMA_DBI_fetch_result(
- $src_select_query,
- null,
- null,
- $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]])) {
- continue;
- }
- 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 (count($is_key) == 1) {
- if ($source_result_set[$j]) {
- $update_array[$matching_table_index][$update_row][$is_key[0]] = $source_result_set[$j];
- }
- } elseif (count($is_key) > 1) {
- for ($n=0; $n < count($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 (count($is_key) == 1) {
- if ($source_result_set[$j]) {
- $update_array[$matching_table_index][$update_row][$is_key[0]] = $source_result_set[$j];
- }
- } elseif (count($is_key) > 1) {
- for ($n = 0; $n < count($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]])) {
- continue;
- }
-
- 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 (count($is_key) == 1) {
- if (isset($source_result_set[$j])) {
- $insert_array[$matching_table_index][$insert_row][$is_key[0]] = $source_result_set[$j];
- }
- } elseif (count($is_key) > 1) {
- for ($l = 0; $l < count($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 (count($is_key) == 1) {
- if (isset($source_result_set[$j])) {
- $insert_array[$matching_table_index][$insert_row][$is_key[0]] = $source_result_set[$j];
- }
- } elseif (count($is_key) > 1) {
- for ($l = 0; $l < count($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
-}
-
-/**
- * Finds the rows which are to be deleted from target table.
- *
- * @param array &$delete_array array containing rows that are to be deleted
- * @param array $matching_table array containing matching table names
- * @param int $matching_table_index index of a table from $matching_table array
- * @param array $trg_keys array of target table keys
- * @param array $src_keys array of source table keys
- * @param string $trg_db name of target database
- * @param db_link $trg_link connection established with target server
- * @param string $src_db name of source database
- * @param db_link $src_link connection established with source server
- *
- * @return void
- */
-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_getColumnValues(
- $trg_db, $matching_table[$matching_table_index],
- $trg_keys[$matching_table_index], $trg_link
- );
- }
- if (isset($src_keys[$matching_table_index])) {
- $source_key_values = PMA_getColumnValues(
- $src_db, $matching_table[$matching_table_index],
- $src_keys[$matching_table_index], $src_link
- );
- }
- $all_keys_match = 1;
- for ($a = 0; $a < count($trg_keys[$matching_table_index]); $a++) {
- if (! isset($trg_keys[$matching_table_index][$a])) {
- continue;
- }
- 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 ((count($trg_keys[$matching_table_index]) == 1) && $all_keys_match) {
- $row = 0;
- if (isset($target_key_values)) {
- for ($i = 0; $i < count($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 ((count($trg_keys[$matching_table_index]) > 1) && $all_keys_match) {
- $row = 0;
- if (isset($target_key_values)) {
- for ($i = 0; $i < count($target_key_values); $i++) {
- $is_present = false;
- for ($j = 0; $j < count($source_key_values) && ($is_present == false) ; $j++) {
- $check = true;
- for ($k = 0; $k < count($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 < count($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
- *
- * @param array $source_tables_uncommon table names that are in source db and not
- * in target db
- * @param string $src_db name of source database
- * @param mixed $src_link connection established with source server
- * @param int $index index of a table from $matching_table array
- * @param array &$row_count number of rows
- *
- * @return void
- */
-function PMA_dataDiffInUncommonTables(
- $source_tables_uncommon, $src_db, $src_link, $index, &$row_count
-) {
- $query = "SELECT COUNT(*) FROM " . PMA_Util::backquote($src_db) . "."
- . PMA_Util::backquote($source_tables_uncommon[$index]);
- $rows = PMA_DBI_fetch_result($query, null, null, $src_link);
- $row_count[$index] = $rows[0];
-}
-
-/**
- * PMA_updateTargetTables() sets the updated field values to
- * target table rows using $update_array[$matching_table_index]
- *
- * @param array $table Matching tables' names
- * @param array $update_array A three dimensional array containing field
- * value updates required for each matching
- * table
- * @param string $src_db Name of source database
- * @param string $trg_db Name of target database
- * @param mixed $trg_link Connection established with target server
- * @param int $matching_table_index index of matching table in
- * matching_table_array
- * @param array $matching_table_keys matching keys for table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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])
- || count($update_array[$matching_table_index]) == 0
- ) {
- return;
- }
-
- for (
- $update_row = 0;
- $update_row < count($update_array[$matching_table_index]);
- $update_row++
- ) {
-
- if (! isset($update_array[$matching_table_index][$update_row])) {
- continue;
- }
-
- $update_fields_num
- = count($update_array[$matching_table_index][$update_row])
- - count($matching_table_keys[$matching_table_index]);
- if ($update_fields_num == 0) {
- continue;
- }
-
- $query = "UPDATE " . PMA_Util::backquote($trg_db) . "."
- . PMA_Util::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 .= PMA_Util::backquote($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 < count($matching_table_keys[$matching_table_index]);
- $key++
- ) {
- if (isset($matching_table_keys[$matching_table_index][$key])) {
- $query .= PMA_Util::backquote($matching_table_keys[$matching_table_index][$key]) . "='" . $update_array[$matching_table_index][$update_row][$matching_table_keys[$matching_table_index][$key]] . "'";
- }
- if ($key < (count($matching_table_keys[$matching_table_index]) - 1)) {
- $query .= " AND ";
- }
- }
- }
- $query .= ';';
- if ($display == true) {
- echo "<p>" . $query . "</p>";
- }
- PMA_DBI_try_query($query, $trg_link, 0);
- }
-}
-
-/**
- * PMA_insertIntoTargetTable() inserts missing rows in the target table
- * using $array_insert[$matching_table_index]
- *
- * @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 list of rows to 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 whether to display query
- *
- * @return void
- *
- * @todo this function uses undefined variables and is possibly broken:
- * $matching_tables, $matching_tables_fields, $remove_indexes_array,
- * $matching_table_keys
- */
-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])
- || count($array_insert[$matching_table_index]) == 0
- ) {
- return;
- }
-
- for (
- $insert_row = 0;
- $insert_row< count($array_insert[$matching_table_index]);
- $insert_row++
- ) {
- if (!isset($array_insert[$matching_table_index][$insert_row][$matching_tables_keys[$matching_table_index][0]])) {
- continue;
- }
-
- $select_query = "SELECT * FROM " . PMA_Util::backquote($src_db) . "." . PMA_Util::backquote($matching_table[$matching_table_index]) . " WHERE ";
- for (
- $i = 0;
- $i < count($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 < (count($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_Util::backquote($trg_db) . "." . PMA_Util::backquote($matching_table[$matching_table_index]) ." (";
-
- for (
- $field_index = 0;
- $field_index < count($table_fields[$matching_table_index]);
- $field_index++
- ) {
- $insert_query .= PMA_Util::backquote(
- $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_query, null, null, $trg_link
- );
-
- if (count($is_fk_result) > 0) {
- for ($j = 0; $j < count($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 < count($table_fields[$matching_table_index])-1) {
- $insert_query .= ", ";
- }
- }
- $insert_query .= ") VALUES(";
- if (count($table_fields[$matching_table_index]) == 1) {
- $insert_query .= "'" . PMA_Util::sqlAddSlashes($result[0]) . "'";
- } else {
- for (
- $field_index = 0;
- $field_index < count($table_fields[$matching_table_index]);
- $field_index++
- ) {
- if (isset($result[0][$table_fields[$matching_table_index][$field_index]])) {
- $insert_query .= "'" . PMA_Util::sqlAddSlashes(
- $result[0][$table_fields[$matching_table_index][$field_index]]
- ) . "'";
- } else {
- $insert_query .= "'NULL'";
- }
- if ($field_index < (count($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);
- }
-}
-
-/**
- * PMA_createTargetTables() Create the missing table $uncommon_table in
- * target database
- *
- * @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 &$uncommon_tables names of tables present in source but
- * not in target
- * @param int $table_index index of table in $uncommon_tables array
- * @param array &$uncommon_tables_fields field names of the uncommon table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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_columns(
- $src_db,
- $uncommon_tables[$table_index],
- null,
- true,
- $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_Util::backquote($src_db) . '.'
- . PMA_Util::backquote($uncommon_tables[$table_index]),
- 0,
- 1,
- $src_link
- );
-
- // Replace the src table name with a `dbname`.`tablename`
- $Create_Table_Query = preg_replace(
- '/' . preg_quote(PMA_Util::backquote($uncommon_tables[$table_index]), '/') . '/',
- PMA_Util::backquote($trg_db) . '.'
- . PMA_Util::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_query, null, null, $src_link);
- if (count($is_fk_result) > 0) {
- for ($j = 0; $j < count($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]]);
- }
- }
- }
- $Create_Table_Query .= ';';
- if ($display == true) {
- echo '<p>' . $Create_Table_Query . '</p>';
- }
- PMA_DBI_try_query($Create_Table_Query, $trg_link, 0);
- }
-}
-/**
- * PMA_populateTargetTables() inserts data into uncommon tables after they have
- * been created
- *
- * @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 $uncommon_tables uncommon table names (table names that
- * are present in source but not in target db)
- * @param int $table_index index of table in matching_table_array
- * @param array $uncommon_tables_fields field names of the uncommon table
- * @param bool $display whether to display query
- *
- * @return void
- *
- * @todo 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
-) {
- // @todo: maybe display some of the queries if they are not too numerous
- $display = false;
- $unbuffered_result = PMA_DBI_try_query(
- 'SELECT * FROM ' . PMA_Util::backquote($src_db) . '.'
- . PMA_Util::backquote($uncommon_tables[$table_index]),
- $src_link,
- PMA_DBI_QUERY_UNBUFFERED
- );
- if (false !== $unbuffered_result) {
- $insert_query = 'INSERT INTO ' . PMA_Util::backquote($trg_db) . '.'
- . PMA_Util::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_Util::sqlAddSlashes($value) . "'";
- if ($key < $key_of_last_value) {
- $insert_query .= ",";
- }
- }
- $insert_query .= '),';
- }
- $insert_query = substr($insert_query, 0, -1);
- $insert_query .= ';';
- if ($display == true) {
- PMA_displayQuery($insert_query);
- }
- PMA_DBI_try_query($insert_query, $trg_link, 0);
- }
-}
-
-/**
- * Deletes rows from target table
- *
- * @param string $trg_db name of target database
- * @param mixed $trg_link connection established with target server
- * @param array $matching_tables matching table names
- * @param int $table_index index of table in matching_table_array
- * @param array $target_tables_keys primary key names of the target tables
- * @param array $delete_array key values of rows that are to be deleted
- * @param bool $display whether to display query
- *
- * @return void
- */
-function PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables,
- $table_index, $target_tables_keys, $delete_array, $display
-) {
- for ($i = 0; $i < count($delete_array[$table_index]); $i++) {
- if (isset($target_tables_keys[$table_index])) {
- $delete_query = 'DELETE FROM ' . PMA_Util::backquote($trg_db) . '.'
- . PMA_Util::backquote($matching_tables[$table_index]) . ' WHERE ';
- for ($y = 0; $y < count($target_tables_keys[$table_index]); $y++) {
- $delete_query .= PMA_Util::backquote($target_tables_keys[$table_index][$y]) . " = '";
-
- if (count($target_tables_keys[$table_index]) == 1) {
- $delete_query .= $delete_array[$table_index][$i] . "'";
- } elseif (count($target_tables_keys[$table_index]) > 1) {
- $delete_query .= $delete_array[$table_index][$i][$target_tables_keys[$table_index][$y]] . "'";
- }
- if ($y < (count($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_query, null, null, $trg_link
- );
- $result_size = count($pk_query_result);
-
- if ($result_size > 0) {
- for ($b = 0; $b < $result_size; $b++) {
- $drop_pk_query = "DELETE FROM "
- . PMA_Util::backquote($pk_query_result[$b]['TABLE_SCHEMA'])
- . "."
- . PMA_Util::backquote($pk_query_result[$b]['TABLE_NAME'])
- . " WHERE "
- . PMA_Util::backquote($pk_query_result[$b]['COLUMN_NAME'])
- . " = " . $target_tables_keys[$table_index][$y] . ";";
- PMA_DBI_try_query($drop_pk_query, $trg_link, 0);
- }
- }
- }
- }
- if ($display == true) {
- echo '<p>' . $delete_query . '</p>';
- }
- PMA_DBI_try_query($delete_query, $trg_link, 0);
- }
-}
-
-/**
- * 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.
- *
- * @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 $matching_tables names of matching tables
- * @param array &$source_columns columns information of the source tables
- * @param array &$target_columns columns information of the target tables
- * @param array &$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 array &$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 array &$uncommon_columns columns that are present in the target table
- * but not in the source table
- * @param array $criteria criteria which are to be checked for field
- * that is present in source table and
- * target table
- * @param array &$target_tables_keys field names which is key in the target table
- * @param int $matching_table_index number of the matching table
- *
- * @return void
- */
-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 criteria like type,
- // null, collation, key, default, comment of the column
- for ($i = 0; $i < count($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;
- }
-}
-/**
- * Adds column that are present in source table but not in target table
- *
- * @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 $matching_tables names of matching tables
- * @param array $source_columns columns information of the source tables
- * @param array &$add_column_array the names of the column(field) that are
- * to be added in the target
- * @param array $matching_tables_fields A two dimensional array passed by
- * reference to contain names of fields for
- * each matching table
- * @param array $criteria criteria
- * @param array $matching_tables_keys field names which is key in the source
- * table
- * @param array $target_tables_keys field names which is key in the target
- * table
- * @param array $uncommon_tables table names that are present in source
- * db and not in target db
- * @param array &$uncommon_tables_fields names of the fields of the uncommon tables
- * @param int $table_counter number of the matching table
- * @param array $uncommon_cols column names that are present in target
- * table and not in source table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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 < count($matching_tables_fields[$table_counter]); $i++) {
- if (isset($add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]])) {
- $query = "ALTER TABLE " . PMA_Util::backquote($trg_db) . '.' . PMA_Util::backquote($matching_tables[$table_counter]). " ADD COLUMN " .
- PMA_Util::backquote($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 = count($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 < count($matching_tables_keys[$table_counter]); $t++) {
- $query .= PMA_Util::backquote($matching_tables_keys[$table_counter][$t]);
- if ($t < (count($matching_tables_keys[$table_counter]) - 1)) {
- $query .= " , " ;
- }
- }
- $query .= ")";
- }
-
- $query .= ";";
- if ($display == true) {
- echo '<p>' . $query . '</p>';
- }
- PMA_DBI_try_query($query, $trg_link, 0);
-
- // 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_query, null, null, $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, $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]]);
- }
- $fk_query = "ALTER TABLE " . PMA_Util::backquote($trg_db) . '.' . PMA_Util::backquote($matching_tables[$table_counter]) .
- "ADD CONSTRAINT FOREIGN KEY " . PMA_Util::backquote($add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]]) . "
- (" . $add_column_array[$table_counter][$matching_tables_fields[$table_counter][$i]] . ") REFERENCES " . PMA_Util::backquote($trg_db) .
- '.' . PMA_Util::backquote($is_fk_result[0]['REFERENCED_TABLE_NAME']) . " (" . $is_fk_result[0]['REFERENCED_COLUMN_NAME'] . ");";
-
- PMA_DBI_try_query($fk_query, $trg_link, null);
- }
- }
- }
-}
-/**
- * Checks if the referenced table have foreign keys.
- * uses PMA_createTargetTables()
- *
- * @param string $src_db name of source database
- * @param mixed $src_link connection established with source server
- * @param string $trg_db name of target database
- * @param mixed $trg_link connection established with target server
- * @param string $referenced_table table whose column is a foreign key in
- * another table
- * @param array &$uncommon_tables names that are uncommon
- * @param array &$uncommon_tables_fields field names of the uncommon table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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_query, null, null, $src_link);
- if (count($is_fk_result) > 0) {
- for ($j = 0; $j < count($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]]);
- }
- }
- }
-}
-/**
- * Alters structure of the target table using $alter_str_array
- *
- * @param string $trg_db name of target database
- * @param mixed $trg_link connection established with target server
- * @param array $matching_tables names of matching tables
- * @param array &$source_columns columns information of the source table
- * @param array &$alter_str_array column name and criteria which is to be
- * altered for the targert table
- * @param array $matching_tables_fields name of the fields for the matching table
- * @param array $criteria criteria
- * @param array &$matching_tables_keys field names which is key in the source
- * table
- * @param array &$target_tables_keys field names which is key in the target
- * table
- * @param int $matching_table_index number of the matching table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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 < count($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 = null;
- if (! $check) {
- $pri_query = "ALTER TABLE " . PMA_Util::backquote($trg_db) . '.' . PMA_Util::backquote($matching_tables[$matching_table_index]);
- if (count($target_tables_keys[$matching_table_index]) > 0) {
- $pri_query .= " DROP PRIMARY KEY ," ;
- }
- $pri_query .= " ADD PRIMARY KEY (";
- for ($z = 0; $z < count($matching_tables_keys[$matching_table_index]); $z++) {
- $pri_query .= PMA_Util::backquote($matching_tables_keys[$matching_table_index][$z]);
- if ($z < (count($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_link, 0);
- }
- for ($t = 0; $t < count($matching_tables_fields[$matching_table_index]); $t++) {
- if ((isset($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]])) && (count($alter_str_array[$matching_table_index][$matching_tables_fields[$matching_table_index][$t]]) > 0)) {
- $sql_query = 'ALTER TABLE ' . PMA_Util::backquote($trg_db) . '.' . PMA_Util::backquote($matching_tables[$matching_table_index]) . ' MODIFY ' .
- PMA_Util::backquote($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 < count($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_link, 0);
- }
- }
- $check = false;
- $query = "ALTER TABLE " . PMA_Util::backquote($trg_db) . '.'
- . PMA_Util::backquote($matching_tables[$matching_table_index]);
- for ($p = 0; $p < count($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 ' . PMA_Util::backquote($matching_tables_keys[$matching_table_index][$p]) . ' '
- . $source_columns[$matching_table_index][$matching_tables_fields[$matching_table_index][$p]]['Type'] . ' Not Null ';
- if ($p < (count($matching_tables_keys[$matching_table_index]) - 1)) {
- $query .= ', ';
- }
- }
- }
- $query .= ';';
- if ($check) {
- if ($display == true) {
- echo '<p>' . $query . '</p>';
- }
- PMA_DBI_try_query($query, $trg_link, 0);
- }
-}
-
-/**
- * Removes the columns which are present in target table but not in source table.
- *
- * @param string $trg_db name of target database
- * @param mixed $trg_link connection established with target server
- * @param array $matching_tables names of matching tables
- * @param array $uncommon_columns array containing the names of the column which
- * are to be dropped from the target table
- * @param int $table_counter index of the matching table as in
- * $matchiing_tables array
- * @param bool $display whether to display query
- *
- * @return void
- */
-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_Util::backquote($trg_db) . "."
- . PMA_Util::backquote($matching_tables[$table_counter]);
- for ($a = 0; $a < count($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_query, null, null, $trg_link);
- $result_size = count($pk_query_result);
-
- if ($result_size > 0) {
- for ($b = 0; $b < $result_size; $b++) {
- $drop_pk_query = "ALTER TABLE " . PMA_Util::backquote($pk_query_result[$b]['TABLE_SCHEMA']) . "." . PMA_Util::backquote($pk_query_result[$b]['TABLE_NAME']) . "
- DROP FOREIGN KEY " . PMA_Util::backquote($pk_query_result[$b]['CONSTRAINT_NAME']) . ", DROP COLUMN " . PMA_Util::backquote($pk_query_result[$b]['COLUMN_NAME']) . ";";
- PMA_DBI_try_query($drop_pk_query, $trg_link, 0);
- }
- }
- $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($query, null, null, $trg_link);
-
- if (count($result) > 0) {
- $drop_query .= " DROP FOREIGN KEY " . PMA_Util::backquote($result[0]['CONSTRAINT_NAME']) . ",";
- }
- $drop_query .= " DROP COLUMN " . PMA_Util::backquote($uncommon_columns[$table_counter][$a]);
- if ($a < (count($uncommon_columns[$table_counter]) - 1)) {
- $drop_query .= " , " ;
- }
- }
- $drop_query .= ";" ;
-
- if ($display == true) {
- echo '<p>' . $drop_query . '</p>';
- }
- PMA_DBI_try_query($drop_query, $trg_link, 0);
- }
-}
-
-/**
- * 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.
- *
- * @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 $matching_tables matching tables name
- * @param array &$source_indexes indexes of the source table
- * @param array &$target_indexes indexes of the target table
- * @param array &$add_indexes_array name of the column on which the index
- * is to be added in the target table
- * @param array &$alter_indexes_array key name which needs to be altered
- * @param array &$remove_indexes_array key name of the index which is to be
- * removed from the target table
- * @param int $table_counter number of the matching table
- *
- * @return void
- */
-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 < count($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 <= count($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 < count($target_indexes[$table_counter]); $b++) {
- $found = false;
- $c = 0;
- while (($c <= count($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.
- *
- * @param string $trg_db name of target database
- * @param mixed $trg_link connection established with target server
- * @param array $matching_tables matching tables name
- * @param array $source_indexes indexes of the source table
- * @param array $target_indexes indexes of the target table
- * @param array $add_indexes_array column names on which indexes are to be
- * created in target table
- * @param array $alter_indexes_array column names for which indexes are to be
- * altered
- * @param array $remove_indexes_array key name of the indexes which are to be
- * removed from the target table
- * @param int $table_counter number of the matching table
- * @param bool $display whether to display query
- *
- * @return void
- */
-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_Util::backquote($trg_db) . "." . PMA_Util::backquote($matching_tables[$table_counter]) . " ADD" ;
- for ($a = 0; $a < count($source_indexes[$table_counter]); $a++) {
- if (isset($add_indexes_array[$table_counter][$a])) {
- for ($b = 0; $b < count($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 " . PMA_Util::backquote($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_link, 0);
- }
- }
- }
- }
- }
- //Alter indexes of target table
-