Added ability for synchronizing databases among servers.
[phpmyadmin/crack.git] / server_synchronize.php
blob4a998b9b63d614a03cf0dd210ed168b8328cc1a8
1 <?php
3 /* vim: set expandtab sw=4 ts=4 sts=4: */
4 /**
6 * @version $Id$
7 * @package phpMyAdmin
8 */
10 /**
13 require_once './libraries/common.inc.php';
15 /**
16 * Does the common work
17 */
18 $GLOBALS['js_include'][] = 'functions.js';
19 require_once './libraries/server_common.inc.php';
21 /**
22 * Contains all the functions specific to synchronization
24 require './libraries/server_synchronize.lib.php';
26 /**
27 * Displays the links
29 require './libraries/server_links.inc.php';
31 /**
32 * Enables warnings on the page
34 //$cfg['Error_Handler']['display'] = true;
35 //$cfg['Error_Handler']['gather'] = true;
37 /**
38 * Save the value of token generated for this page
40 if (isset($_REQUEST['token'])) {
41 $_SESSION['token'] = $_REQUEST['token'];
45 /**
46 * Displays the page when 'Go' is pressed
49 if ((isset($_REQUEST['submit_connect']))) {
50 $src_host = $_REQUEST['src_host'];
51 $src_username = $_REQUEST['src_username'];
52 $src_password = $_REQUEST['src_pass'];
53 $src_port = $_REQUEST['src_port'];
54 $src_db = $_REQUEST['src_db'];
55 $src_connection = @mysql_connect($src_host, $src_username, $src_password);
57 $trg_host = $_REQUEST['trg_host'];
58 $trg_username = $_REQUEST['trg_username'];
59 $trg_password = $_REQUEST['trg_pass'];
60 $trg_port = $_REQUEST['trg_port'];
61 $trg_db = $_REQUEST['trg_db'];
62 $trg_connection = @mysql_connect($trg_host, $trg_username, $trg_password);
64 if (!($src_connection) || !($trg_connection)) {
65 /**
66 * Displays the connection error string if
67 * connections are not established
69 echo '<div class="error">' . "\n" ;
70 if(!$src_connection) {
71 echo "Could not connect to the source</br>";
73 if(!$trg_connection){
74 echo "Could not connect to the target";
76 echo '</div>';
77 unset($_REQUEST['submit_connect']);
79 } else if (($src_connection) && ($trg_connection)) {
80 /**
81 * Creating the link object for both source and target databases and
82 * selecting the source and target databases using these links
84 $src_link = PMA_DBI_connect($src_username, $src_password, $is_controluser = false);
85 $src_db_selected = PMA_DBI_select_db($src_db, $src_link);
87 $trg_link = PMA_DBI_connect($trg_username, $trg_password, $is_controluser = false);
88 $trg_db_selected = PMA_DBI_select_db($trg_db, $trg_link);
90 if (($src_db_selected != 1) || ($trg_db_selected != 1)) {
91 /**
92 * Displays error string if the database(s) did not exist
94 echo '<div class="error">' . "\n" ;
95 if ($src_db_selected != 1) {
96 echo "'".$src_db."' database does not exists</br>";
98 if ($trg_db_selected != 1) {
99 echo "'".$trg_db."' database does not exists</br>";
101 echo '</div>';
102 unset($_REQUEST['submit_connect']);
104 } else if (($src_db_selected == 1) && ($trg_db_selected == 1)) {
107 * Using PMA_DBI_get_tables() to get all the tables
108 * from target and source databases.
110 $src_tables = PMA_DBI_get_tables($src_db, $src_link);
111 $source_tables_num = sizeof($src_tables);
113 $trg_tables = PMA_DBI_get_tables($trg_db, $trg_link);
114 $target_tables_num = sizeof($trg_tables);
117 * initializing arrays to save matching and non-matching
118 * table names from target and source databases.
120 $unmatched_num_src = 0;
121 $source_tables_uncommon = array();
122 $unmatched_num_trg = 0;
123 $target_tables_uncommon = array();
124 $matching_tables = array();
125 $matching_tables_num = 0;
128 * Using PMA_getMatchingTables to find which of the tables' names match
129 * in target and source database.
131 PMA_getMatchingTables($trg_tables, $src_tables, $matching_tables, $source_tables_uncommon);
133 * Finding the uncommon tables for the target database
134 * using function PMA_getNonMatchingTargetTables()
136 PMA_getNonMatchingTargetTables($trg_tables, $matching_tables, $target_tables_uncommon);
139 * Initializing several arrays to save the data and structure
140 * difference between the source and target databases.
142 $row_count = array(); //number of rows in source table that needs to be created in target database
143 $fields_num = array(); //number of fields in each matching table
144 $delete_array = array(); //stores the primary key values for target tables that have excessive rows than corresponding source tables.
145 $insert_array = array(array(array()));// stores the primary key values for the rows in each source table that are not present in target tables.
146 $update_array = array(array(array())); //stores the primary key values, name of field to be updated, value of the field to be updated for
147 // each row of matching table.
148 $matching_tables_fields = array(); //contains the fields' names for each matching table
149 $matching_tables_keys = array(); //contains the primary keys' names for each matching table
150 $uncommon_tables_fields = array(); //coantains the fields for all the source tables that are not present in target
151 $matching_tables_num = sizeof($matching_tables);
153 $source_columns = array(); //contains the full columns' information for all the source tables' columns
154 $target_columns = array(); //contains the full columns' information for all the target tables' columns
155 $uncommon_columns = array(); //contains names of columns present in source table but absent from the corresponding target table
156 $source_indexes = array(); //contains indexes on all the source tables
157 $target_indexes = array(); //contains indexes on all the target tables
158 $add_indexes_array = array(); //contains the indexes name present in source but absent from target tables
159 $target_tables_keys = array(); //contains the keys of all the target tables
160 $alter_indexes_array = array(); //contains the names of all the indexes for each table that need to be altered in target database
161 $remove_indexes_array = array(); //contains the names of indexes that are excessive in target tables
162 $alter_str_array = array(array()); //contains the criteria for each column that needs to be altered in target tables
163 $add_column_array = array(array()); //contains the name of columns that need to be added in target tables
165 * The criteria array contains all the criteria against which columns are compared for differences.
167 $criteria = array('Field', 'Type', 'Null', 'Collation', 'Key', 'Default', 'Comment');
169 for($i=0; $i< sizeof($matching_tables); $i++)
172 * Finding out all the differences structure, data and index diff for all the matching tables only
174 PMA_dataDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $matching_tables_fields, $update_array, $insert_array,
175 $delete_array, $fields_num, $i, $matching_tables_keys);
177 PMA_structureDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_columns,
178 $target_columns, $alter_str_array, $add_column_array, $uncommon_columns, $criteria, $target_tables_keys, $i);
180 PMA_indexesDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_indexes, $target_indexes,
181 $add_indexes_array, $alter_indexes_array,$remove_indexes_array, $i);
184 for($j=0; $j< sizeof($source_tables_uncommon); $j++)
187 * Finding out the number of rows to be added in tables that need to be added in target database
189 PMA_dataDiffInUncommonTables($source_tables_uncommon, $src_db, $src_link, $j, $row_count);
192 * Storing all arrays in session for use when page is reloaded for each button press
194 $_SESSION['matching_tables'] = $matching_tables;
195 $_SESSION['update_array'] = $update_array;
196 $_SESSION['insert_array'] = $insert_array;
197 $_SESSION['src_db'] = $src_db;
198 $_SESSION['trg_db'] = $trg_db;
199 $_SESSION['matching_fields'] = $matching_tables_fields;
200 $_SESSION['src_uncommon_tables'] = $source_tables_uncommon;
201 $_SESSION['src_username'] = $src_username ;
202 $_SESSION['trg_username'] = $trg_username;
203 $_SESSION['src_password'] = $src_password;
204 $_SESSION['trg_password'] = $trg_password;
205 $_SESSION['trg_password'] = $trg_password;
206 $_SESSION['matching_tables_keys'] = $matching_tables_keys;
207 $_SESSION['uncommon_tables_fields'] = $uncommon_tables_fields;
208 $_SESSION['uncommon_tables_row_count'] = $row_count;
209 $_SESSION['target_tables_uncommon'] = $target_tables_uncommon;
210 $_SESSION['uncommon_tables'] = $source_tables_uncommon;
211 $_SESSION['delete_array'] = $delete_array;
212 $_SESSION['uncommon_columns'] = $uncommon_columns;
213 $_SESSION['source_columns'] = $source_columns;
214 $_SESSION['alter_str_array'] = $alter_str_array;
215 $_SESSION['target_tables_keys'] = $target_tables_keys;
216 $_SESSION['add_column_array'] = $add_column_array;
217 $_SESSION['criteria'] = $criteria;
218 $_SESSION['target_tables'] = $trg_tables;
219 $_SESSION['add_indexes_array'] = $add_indexes_array;
220 $_SESSION['alter_indexes_array'] = $alter_indexes_array;
221 $_SESSION['remove_indexes_array'] = $remove_indexes_array;
222 $_SESSION['source_indexes'] = $source_indexes;
223 $_SESSION['target_indexes'] = $target_indexes;
226 * Displays the sub-heading and icons showing Structure Synchronization and Data Synchronization
228 echo '<form name="synchronize_form" id="synchronize_form" method="POST" action="server_synchronize.php">'
229 . PMA_generate_common_hidden_inputs('', '');
230 echo '<table id="serverstatustraffic" class="data" width = "50%">
231 <tr>
232 <td> <h2>' . "\n"
233 . ($GLOBALS['cfg']['MainPageIconic']
234 ? '<img class="icon" src="' . $pmaThemeImage . 'new_struct.jpg" width="32"'
235 . ' height="32" alt="" />' . "\n"
236 : '')
237 . $strStructureSyn . "\n"
238 .'</h2>' . "\n" .'</td>';
239 echo '<td> <h2>' . "\n"
240 . ($GLOBALS['cfg']['MainPageIconic']
241 ? '<img class="icon" src="' . $pmaThemeImage . 'new_data.jpg" width="32"'
242 . ' height="32" alt="" />' . "\n"
243 : '')
244 . $strDataSyn . "\n"
245 . '</h2>' . "\n" .'</td>';
246 echo '</tr>
247 </table>';
250 * Displays the tables containing the source tables names, their difference with the target tables and target tables names
252 echo '<div id="serverstatus" style = "overflow: auto; width: 1020px; height: 220px;
253 border-left: 1px gray solid; border-bottom: 1px gray solid;
254 padding:0px; margin-bottom: 1em "> ';
256 echo '<table id="serverstatustraffic" class="data" width = "55%" >
257 <tr>
258 <th> Source Database: '. $src_db .'</th>
259 <th> Difference </th>
260 </tr>';
261 $odd_row = false;
263 * Display the matching tables' names and difference, first
265 for($i = 0; $i < count($matching_tables); $i++)
267 $num_of_updates = 0;
268 $num_of_insertions = 0;
270 * Calculating the number of updates for each matching table
272 if (isset($update_array[$i])) {
273 if (isset($update_array[$i][0][$matching_tables_keys[$i][0]])) {
274 if (isset($update_array[$i])) {
275 $num_of_updates = sizeof($update_array[$i]);
276 } else {
277 $num_of_updates = 0;
279 } else {
280 $num_of_updates = 0;
284 * Calculating the number of insertions for each matching table
286 if (isset($insert_array[$i])) {
287 if (isset($insert_array[$i][0][$matching_tables_keys[$i][0]])) {
288 if (isset($insert_array[$i])) {
289 $num_of_insertions = sizeof($insert_array[$i]);
290 } else {
291 $num_of_insertions = 0;
293 } else {
294 $num_of_insertions = 0;
298 * Displays the name of the matching table
300 $odd_row = !$odd_row;
301 echo '<tr height="32" class=" ';
302 echo $odd_row ? 'odd' : 'even';
303 echo '">
304 <td>' . $matching_tables[$i]. "\n" . '</td>
305 <td align="center">';
307 * Calculating the number of alter columns, number of columns to be added, number of columns to be removed,
308 * number of index to added and renmoved.
310 $num_alter_cols = 0;
311 $num_insert_cols = 0;
312 $num_remove_cols = 0;
313 $num_add_index = 0;
314 $num_remove_index = 0;
316 if (isset($alter_str_array[$i])) {
317 $num_alter_cols = sizeof($alter_str_array[$i]);
319 if (isset($add_column_array[$i])) {
320 $num_insert_cols = sizeof($add_column_array[$i]);
322 if (isset($uncommon_columns[$i])) {
323 $num_remove_cols = sizeof($uncommon_columns[$i]);
325 if (isset($add_indexes_array[$i])) {
326 $num_add_index = sizeof($add_indexes_array[$i]);
328 if (isset($remove_indexes_array[$i])) {
329 $num_remove_index = sizeof($remove_indexes_array[$i]);
332 * Display the red button of structure synchronization if there exists any structure difference or index difference.
334 if (($num_alter_cols > 0) || ($num_insert_cols > 0) || ($num_remove_cols > 0) || ($num_add_index > 0) ||($num_remove_index > 0)) {
336 echo '<img class="icon" src="' . $pmaThemeImage . 'new_struct.jpg" width="29" height="29"
337 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
338 onClick="showDetails('."'MS".$i."'".','."'".$num_alter_cols."'".','."'".$num_insert_cols.
339 "'".','."'".$num_remove_cols."'".','."'".$num_add_index."'".','."'".$num_remove_index."'"
340 .', this ,'."'". $matching_tables[$i] ."'".')"/>'. "\n" ;
344 * Display the green button of data synchronization if there exists any data difference.
346 if (isset($update_array[$i]) || isset($insert_array[$i])) {
347 if (isset($update_array[$i][0][$matching_tables_keys[$i][0]]) || isset($insert_array[$i][0][$matching_tables_keys[$i][0]])) {
349 echo '<img class="icon" src="' . $pmaThemeImage . 'new_data.jpg" width="29" height="29"
350 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
351 onClick="showDetails('."'MD".$i."'".','."'".$num_of_updates."'".','."'".$num_of_insertions.
352 "'".','."'".null."'".','."'".null."'".','."'".null."'".', this ,'."'". $matching_tables[$i] ."'".')" />'. "\n";
355 echo '</td>
356 </tr>';
359 * Displays the tables' names present in source but missing from target
361 for ($j = 0; $j < count($source_tables_uncommon); $j++)
363 $odd_row = !$odd_row;
364 echo '<tr height="32" class=" ';
365 echo $odd_row ? 'odd' : 'even';
366 echo '">
367 <td> + ' .$source_tables_uncommon[$j]. "\n" . '</td> ';
369 echo '<td align="center"><img class="icon" src="' . $pmaThemeImage . 'new_struct.jpg" width="29" height="29"
370 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
371 onClick="showDetails('."'US".$j."'".','."'".null."'".','."'".null."'".','."'".null."'".','."'".null."'".','."'".null."'".', this ,'
372 ."'". $source_tables_uncommon[$j] ."'".')"/>'. "\n" ;
374 if($row_count[$j]>0)
376 echo '<img class="icon" src="' . $pmaThemeImage . 'new_data.jpg" width="29"'.' height="29"
377 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
378 onClick="showDetails('."'UD".$j."'".','."'".null."'".','."'".$row_count[$j]."'".','."'".null.
379 "'".','."'".null."'".','."'".null."'".', this ,'."'". $source_tables_uncommon[$j] ."'".')" />'. "\n";
381 echo '</td>
382 </tr>';
384 foreach ($target_tables_uncommon as $tbl_nc_name)
386 $odd_row = !$odd_row;
387 echo '<tr height="32" class=" ';
388 echo $odd_row ? 'odd' : 'even';
389 echo '">
390 <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td><td></td>';
391 echo '</tr>';
394 * Displays the target tables names
396 echo '</table>';
397 echo '<table id="serverstatusconnections" class="data" width="43%" >
398 <tr>
399 <th>Target Database: ' . $trg_db . '</th>
400 </tr>';
401 $odd_row = false;
402 foreach ($matching_tables as $tbl_name)
404 $odd_row = !$odd_row;
405 echo '<tr height="32" class=" ';
406 echo $odd_row ? 'odd' : 'even';
407 echo '">
408 <td> ' .$tbl_name . '</td>';
409 echo '</tr>';
411 foreach ($source_tables_uncommon as $tbl_nc_name)
413 $odd_row = !$odd_row;
414 echo '<tr height="32" class=" ';
415 echo $odd_row ? 'odd' : 'even';
416 echo '">
417 <td>' .$tbl_nc_name . "\n" . ' (Not present)</td>
418 </tr>';
420 foreach ($target_tables_uncommon as $tbl_nc_name)
422 $odd_row = !$odd_row;
423 echo '<tr height="32" class=" ';
424 echo $odd_row ? 'odd' : 'even';
425 echo '">
426 <td> - ' .$tbl_nc_name . '</td>';
427 echo '</tr>';
429 echo '</table>';
430 echo '</div>';
433 * This "list" div will contain a table and each row will depict information about structure/data diffrence in tables.
434 * Rows will be generated dynamically as soon as the colored buttons "D" or "S" are clicked.
437 echo '<div id="list" style = "overflow: auto; width: 1020px; height: 140px;
438 border-left: 1px gray solid; border-bottom: 1px gray solid;
439 padding:0px; margin: 0px">
441 <table>
442 <thead>
443 <tr style="width: 100%;">
444 <th id="table_name" style="width: 10%;" colspan="1">'. $strTable .' </th>
445 <th id="str_diff" style="width: 65%;" colspan="6">'. $strStructureDiff .' </th>
446 <th id="data_diff" style="width: 20%;" colspan="2">'. $strDataDiff .'</th>
447 </tr>
448 <tr style="width: 100%;">
449 <th style="width: 10%; background-color:#CCCCCC">'. $strTableName .'</th>
450 <th style="width: 10%; background-color:#CCCCCC">'. $strTableCreate .'</th>
451 <th style="width: 11%; background-color:#CCCCCC">'. $strTableAddColumn .'</th>
452 <th style="width: 13%; background-color:#CCCCCC">'. $strTableRemoveColumn .'</th>
453 <th style="width: 11%; background-color:#CCCCCC">'. $strTableAlterColumn .'</th>
454 <th style="width: 12%; background-color:#CCCCCC">'. $strTableRemoveIndex .'</th>
455 <th style="width: 11%; background-color:#CCCCCC">'. $strTableApplyIndex .'</th>
456 <th style="width: 10%; background-color:#CCCCCC">'. $strTableUpdateRow .'</th>
457 <th style="width: 10%; background-color:#CCCCCC">'. $strTableInsertRow .'</th>
458 </tr>
459 </thead>
460 <tbody></tbody>
461 </table>
462 </div>';
464 * This fieldset displays the checkbox to confirm deletion of previous rows from target tables
466 echo '<fieldset>
467 <p><input type= "checkbox" name="delete_rows" id ="delete_rows" />' . $strTableDeleteRows . ' </p>
468 </fieldset>
469 <fieldset class="tblFooters">' . "\n";
470 echo '<input type="button" name="apply_changes" value="' . $GLOBALS['strApplyChanges']
471 .'" onClick ="ApplySelectedChanges('."'". $_SESSION['token'] ."'".')" />';
472 echo '<input type="submit" name="synchronize_db" value="'. $GLOBALS['strSynchronizeDb'] .'" />'
473 . "\n" . '</fieldset>' . "\n";
474 echo '</form>';
480 * Display the page when 'Apply Selected Changes' is pressed
482 if (isset($_REQUEST['Table_ids'])) {
484 * Displays success message
486 echo '<div class="success">Selected target tables have been synchronized with source tables. </div>';
488 $src_db = $_SESSION['src_db'];
489 $trg_db = $_SESSION['trg_db'];
490 $update_array = $_SESSION['update_array'];
491 $insert_array = $_SESSION['insert_array'];
492 $src_username = $_SESSION['src_username'];
493 $trg_username = $_SESSION['trg_username'];
494 $src_password = $_SESSION['src_password'];
495 $trg_password = $_SESSION['trg_password'];
496 $uncommon_tables = $_SESSION['uncommon_tables'];
497 $matching_tables = $_SESSION['matching_tables'];
498 $matching_tables_keys = $_SESSION['matching_tables_keys'];
499 $matching_tables_fields = $_SESSION['matching_fields'];
500 $source_tables_uncommon = $_SESSION['src_uncommon_tables'];
501 $uncommon_tables_fields = $_SESSION['uncommon_tables_fields'];
502 $target_tables_uncommon = $_SESSION['target_tables_uncommon'];
503 $row_count = $_SESSION['uncommon_tables_row_count'];
504 $target_tables = $_SESSION['target_tables'];
506 $delete_array = $_SESSION['delete_array'];
507 $uncommon_columns = $_SESSION['uncommon_columns'];
508 $source_columns = $_SESSION['source_columns'];
509 $alter_str_array = $_SESSION['alter_str_array'];
510 $criteria = $_SESSION['criteria'];
511 $target_tables_keys = $_SESSION['target_tables_keys'];
512 $add_column_array = $_SESSION['add_column_array'];
513 $add_indexes_array = $_SESSION['add_indexes_array'];
514 $alter_indexes_array = $_SESSION['alter_indexes_array'];
515 $remove_indexes_array = $_SESSION['remove_indexes_array'];
516 $source_indexes = $_SESSION['source_indexes'];
517 $target_indexes = $_SESSION['target_indexes'];
518 $uncommon_cols = $uncommon_columns;
521 * Creating link object for source and target databases
523 $src_link = PMA_DBI_connect($src_username, $src_password, $is_controluser = false);
524 $trg_link = PMA_DBI_connect($trg_username, $trg_password, $is_controluser = false);
527 * Initializing arrays to save the table ids whose data and structure difference is to be applied
529 $matching_table_data_diff = array(); //stores id of matching table having data difference
530 $matching_table_structure_diff = array(); //stores id of matching tables having structure difference
531 $uncommon_table_structure_diff = array(); //stores id of uncommon tables having structure difference
532 $uncommon_table_data_diff = array(); //stores id of uncommon tables having data difference
534 for ($i=0; isset($_REQUEST[$i]); $i++ )
536 if (isset($_REQUEST[$i])) {
537 $table_id = split("US", $_REQUEST[$i]);
538 if (isset($table_id[1])) {
539 $uncommon_table_structure_diff[] = $table_id[1];
541 $table_id = split("UD", $_REQUEST[$i]);
542 if (isset($table_id[1])) {
543 $uncommon_table_data_diff[] = $table_id[1];
545 $table_id = split("MS", $_REQUEST[$i]);
546 if (isset($table_id[1])) {
547 $matching_table_structure_diff[] = $table_id[1];
550 $table_id = split("MD", $_REQUEST[$i]);
551 if (isset($table_id[1])) {
552 $matching_table_data_diff[] = $table_id[1];
557 * Applying the structure difference on selected matching tables
559 for($q=0 ; $q < sizeof($matching_table_structure_diff); $q++)
561 if (isset($alter_str_array[$matching_table_structure_diff[$q]])) {
563 PMA_alterTargetTableStructure($trg_db, $trg_link, $matching_tables, $source_columns, $alter_str_array, $matching_tables_fields,
564 $criteria, $matching_tables_keys, $target_tables_keys, $matching_table_structure_diff[$q], false);
566 unset($alter_str_array[$matching_table_structure_diff[$q]]);
568 if (isset($add_column_array[$matching_table_structure_diff[$q]])) {
570 PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $matching_table_structure_diff[$q], $target_tables_keys,
571 $matching_tables_keys, $trg_db, $trg_link, $src_db, $src_link);
573 if (isset($delete_array[$matching_table_structure_diff[$q]])) {
575 PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $matching_table_structure_diff[$q], $target_tables_keys, $delete_array, false);
577 unset($delete_array[$matching_table_structure_diff[$q]]);
579 PMA_addColumnsInTargetTable($src_db, $trg_db,$src_link, $trg_link, $matching_tables, $source_columns, $add_column_array, $matching_tables_fields,
580 $criteria, $matching_tables_keys, $target_tables_keys, $uncommon_tables,$uncommon_tables_fields, $matching_table_structure_diff[$q], $uncommon_cols, false);
582 unset($add_column_array[$matching_table_structure_diff[$q]]);
584 if (isset($uncommon_columns[$matching_table_structure_diff[$q]])) {
586 PMA_removeColumnsFromTargetTable($trg_db, $trg_link, $matching_tables, $uncommon_columns, $matching_table_structure_diff[$q], false);
588 unset($uncommon_columns[$matching_table_structure_diff[$q]]);
590 if (isset($add_indexes_array[$matching_table_structure_diff[$q]]) || isset($remove_indexes_array[$matching_table_structure_diff[$q]])
591 || isset($alter_indexes_array[$matching_table_structure_diff[$q]])) {
593 PMA_applyIndexesDiff ($trg_db, $trg_link, $matching_tables, $source_indexes, $target_indexes, $add_indexes_array, $alter_indexes_array,
594 $remove_indexes_array, $matching_table_structure_diff[$q], false);
596 unset($add_indexes_array[$matching_table_structure_diff[$q]]);
597 unset($alter_indexes_array[$matching_table_structure_diff[$q]]);
598 unset($remove_indexes_array[$matching_table_structure_diff[$q]]);
602 * Applying the data difference. First checks if structure diff is applied or not.
603 * If not, then apply structure difference first then apply data difference.
605 for($p=0; $p < sizeof($matching_table_data_diff); $p++)
607 if ($_REQUEST['checked'] == 'true') {
609 PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $matching_table_data_diff[$p], $target_tables_keys,
610 $matching_tables_keys, $trg_db, $trg_link, $src_db, $src_link);
612 if (isset($delete_array[$matching_table_data_diff[$p]])) {
614 PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $matching_table_data_diff[$p], $target_tables_keys, $delete_array, false);
616 unset($delete_array[$matching_table_data_diff[$p]]);
619 if (isset($alter_str_array[$matching_table_data_diff[$p]])) {
621 PMA_alterTargetTableStructure($trg_db, $trg_link, $matching_tables, $source_columns, $alter_str_array, $matching_tables_fields,
622 $criteria, $matching_tables_keys, $target_tables_keys, $matching_table_data_diff[$p], false);
624 unset($alter_str_array[$matching_table_data_diff[$p]]);
626 if (isset($add_column_array[$matching_table_data_diff[$p]])) {
628 PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $matching_table_data_diff[$p], $target_tables_keys,
629 $matching_tables_keys, $trg_db, $trg_link, $src_db, $src_link);
631 if (isset($delete_array[$matching_table_data_diff[$p]])) {
633 PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $matching_table_data_diff[$p], $target_tables_keys, $delete_array, false);
635 unset($delete_array[$matching_table_data_diff[$p]]);
637 PMA_addColumnsInTargetTable($src_db, $trg_db,$src_link, $trg_link, $matching_tables, $source_columns, $add_column_array, $matching_tables_fields,
638 criteria, $matching_tables_keys, $target_tables_keys, $uncommon_tables, $uncommon_tables_fields, $matching_table_data_diff[$p], $uncommon_cols, false);
640 unset($add_column_array[$matching_table_data_diff[$p]]);
642 if (isset($uncommon_columns[$matching_table_data_diff[$p]])) {
644 PMA_removeColumnsFromTargetTable($trg_db, $trg_link, $matching_tables, $uncommon_columns, $matching_table_data_diff[$p], false);
646 unset($uncommon_columns[$matching_table_data_diff[$p]]);
648 if (isset($add_indexes_array[$matching_table_structure_diff[$q]]) || isset($remove_indexes_array[$matching_table_structure_diff[$q]])
649 || isset($alter_indexes_array[$matching_table_structure_diff[$q]])) {
651 PMA_applyIndexesDiff ($trg_db, $trg_link, $matching_tables, $source_indexes, $target_indexes, $add_indexes_array, $alter_indexes_array,
652 $remove_indexes_array, $matching_table_structure_diff[$q], false);
654 unset($add_indexes_array[$matching_table_structure_diff[$q]]);
655 unset($alter_indexes_array[$matching_table_structure_diff[$q]]);
656 unset($remove_indexes_array[$matching_table_structure_diff[$q]]);
659 * Applying the data difference.
661 PMA_updateTargetTables($matching_tables, $update_array, $src_db, $trg_db, $trg_link, $matching_table_data_diff[$p], $matching_tables_keys, false);
663 PMA_insertIntoTargetTable($matching_tables, $src_db, $trg_db, $src_link, $trg_link , $matching_tables_fields, $insert_array,
664 $matching_table_data_diff[$p], $matching_tables_keys, $source_columns, $add_column_array, $criteria, $target_tables_keys,
665 $uncommon_tables, $uncommon_tables_fields, $uncommon_cols, $alter_str_array, $source_indexes, $target_indexes, $add_indexes_array,
666 $alter_indexes_array, $delete_array, $update_array, false);
669 * Updating the session variables to the latest values of the arrays.
671 $_SESSION['delete_array'] = $delete_array;
672 $_SESSION['uncommon_columns'] = $uncommon_columns;
673 $_SESSION['alter_str_array'] = $alter_str_array;
674 $_SESSION['add_column_array'] = $add_column_array;
675 $_SESSION['add_indexes_array'] = $add_indexes_array;
676 $_SESSION['remove_indexes_array'] = $remove_indexes_array;
677 $_SESSION['insert_array'] = $insert_array;
678 $_SESSION['update_array'] = $update_array;
681 * Applying structure difference to selected non-matching tables (present in Source but absent from Target).
683 for($s=0; $s < sizeof($uncommon_table_structure_diff); $s++)
685 PMA_createTargetTables ($src_db, $trg_db, $src_link, $trg_link, $uncommon_tables, $uncommon_table_structure_diff[$s], $uncommon_tables_fields, false);
686 $_SESSION['uncommon_tables_fields'] = $uncommon_tables_fields;
688 unset($uncommon_tables[$uncommon_table_structure_diff[$s]]);
691 * Applying data difference to selected non-matching tables (present in Source but absent from Target).
692 * Before data synchronization, structure synchronization is confirmed.
694 for($r=0; $r < sizeof($uncommon_table_data_diff); $r++)
696 if (!(in_array($uncommon_table_data_diff[$r], $uncommon_table_structure_diff))) {
697 if (isset($uncommon_tables[$uncommon_table_data_diff[$r]])) {
699 PMA_createTargetTables($src_db, $trg_db, $src_link, $trg_link, $uncommon_tables, $uncommon_table_data_diff[$r], $uncommon_tables_fields, false);
700 $_SESSION['uncommon_tables_fields'] = $uncommon_tables_fields;
702 unset($uncommon_tables[$uncommon_table_data_diff[$r]]);
705 PMA_populateTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $uncommon_table_data_diff[$r],
706 $_SESSION['uncommon_tables_fields'], false);
708 unset($row_count[$uncommon_table_data_diff[$r]]);
711 * Again all the tables from source and target database are displayed with their differences.
712 * The differences have been removed from tables that have been synchronized
714 echo '<form name="applied_difference" id="synchronize_form" method="POST" action="server_synchronize.php">'
715 . PMA_generate_common_hidden_inputs('', '');
717 echo '<div id="serverstatus" style = "overflow: auto; width: 1020px; height: 220px;
718 border-left: 1px gray solid; border-bottom: 1px gray solid;
719 padding:0px; margin-bottom: 1em"> ';
721 echo '<table id="serverstatustraffic" class="data" width= "55%">
722 <tr>
723 <th> Source Database: '. $src_db .'</th>
724 <th> Difference </th>
725 </tr>';
726 $odd_row = false;
727 for($i = 0; $i < count($matching_tables); $i++)
729 $odd_row = !$odd_row;
730 echo '<tr height="32" class=" ';
731 echo $odd_row ? 'odd' : 'even';
732 echo '">
733 <td align="center">' . $matching_tables[$i]. "\n" . '</td>
734 <td align="center">';
736 $num_alter_cols = 0;
737 $num_insert_cols = 0;
738 $num_remove_cols = 0;
739 $num_add_index = 0;
740 $num_remove_index = 0;
742 if (isset($alter_str_array[$i])) {
743 $num_alter_cols = sizeof($alter_str_array[$i]);
745 if (isset($add_column_array[$i])) {
746 $num_insert_cols = sizeof($add_column_array[$i]);
748 if (isset($uncommon_columns[$i])) {
749 $num_remove_cols = sizeof($uncommon_columns[$i]);
751 if (isset($add_indexes_array[$i])) {
752 $num_add_index = sizeof($add_indexes_array[$i]);
754 if (isset($remove_indexes_array[$i])) {
755 $num_remove_index = sizeof($remove_indexes_array[$i]);
758 if (($num_alter_cols > 0) || ($num_insert_cols > 0) || ($num_remove_cols > 0) || ($num_add_index > 0) ||($num_remove_index > 0)) {
759 echo '<img class="icon" src="' . $pmaThemeImage . 'new_struct.jpg" width="29" height="29"
760 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
761 onClick="showDetails('."'MS".$i."'".','."'".$num_alter_cols."'".','."'".$num_insert_cols."'"
762 .','."'".$num_remove_cols."'".','."'".$num_add_index."'".','."'".$num_remove_index."'".',
763 this ,'."'". $matching_tables[$i] ."'".')"/>'. "\n" ;
765 if (!(in_array($i, $matching_table_data_diff))) {
767 if (isset($update_array[$i][0][$matching_tables_keys[$i][0]])) {
768 if (isset($update_array[$i])) {
769 $num_of_updates = sizeof($update_array[$i]);
770 } else {
771 $num_of_updates = 0;
773 } else {
774 $num_of_updates = 0;
776 if (isset($insert_array[$i][0][$matching_tables_keys[$i][0]])) {
777 if (isset($insert_array[$i])) {
778 $num_of_insertions = sizeof($insert_array[$i]);
779 } else {
780 $num_of_insertions = 0;
782 } else {
783 $num_of_insertions = 0;
786 if (isset($update_array[$i][0][$matching_tables_keys[$i][0]]) || isset($insert_array[$i][0][$matching_tables_keys[$i][0]])) {
787 echo '<img class="icon" src="' . $pmaThemeImage . 'new_data.jpg" width="29" height="29"
788 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
789 onClick="showDetails('."'MD".$i."'".','."'".$num_of_updates."'".','."'".$num_of_insertions.
790 "'".','."'".null."'".','."'".null."'".','."'".null."'".', this ,'."'". $matching_tables[$i] ."'".')" />';
792 } else {
793 unset($update_array[$i]);
794 unset($insert_array[$i]);
796 echo '</td>
797 </tr>';
800 * placing updated value of arrays in session
803 $_SESSION['update_array'] = $update_array;
804 $_SESSION['insert_array'] = $insert_array;
806 for ($j = 0; $j < count($source_tables_uncommon); $j++)
808 $odd_row = !$odd_row;
809 echo '<tr height="32" class=" ';
810 echo $odd_row ? 'odd' : 'even';
811 echo '">
812 <td align="center"> + ' .$source_tables_uncommon[$j]. "\n" . '</td>
813 <td align="center">';
815 * Display the difference only when it has not been applied
817 if (!(in_array($j, $uncommon_table_structure_diff))) {
818 if (isset($uncommon_tables[$j])) {
819 echo '<img class="icon" src="' . $pmaThemeImage .'new_struct.jpg" width="29" height="29"
820 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
821 onClick="showDetails('."'US".$j."'".','."'".null."'".','."'".null."'".','."'".null."'"
822 .','."'".null."'".','."'".null."'".', this ,'."'". $source_tables_uncommon[$j] ."'".')"/>' . "\n" .' ';
824 } else {
825 unset($uncommon_tables[$j]);
828 * Display the difference only when it has not been applied
830 if (!(in_array($j, $uncommon_table_data_diff))) {
831 if (isset($row_count[$j]) && ($row_count > 0))
833 echo '<img class="icon" src="' . $pmaThemeImage . 'new_data.jpg" width="29"'.' height="29"
834 alt="Click to Select" onmouseover="change_Image(this);" onmouseout="change_Image(this);"
835 onClick="showDetails('."'UD".$j."'".','."'".null."'".','."'".$row_count[$j]."'".','."'"
836 .null."'".','."'".null."'".','."'".null."'".', this ,'."'". $source_tables_uncommon[$j] ."'".')" />'. "\n";
838 } else {
839 unset($row_count[$j]);
842 echo '</td>
843 </tr>';
846 * placing the latest values of arrays in session
849 $_SESSION['uncommon_tables'] = $uncommon_tables;
850 $_SESSION['uncommon_tables_row_count'] = $row_count;
854 * Dispalying the target database tables
856 foreach ($target_tables_uncommon as $tbl_nc_name)
858 $odd_row = !$odd_row;
859 echo '<tr height="32" class=" ';
860 echo $odd_row ? 'odd' : 'even';
861 echo '">
862 <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td><td></td>';
863 echo '</tr>';
865 echo '</table>';
866 echo '<table id="serverstatusconnections" class="data" width="42%" >
867 <tr>
868 <th>Target Database: ' . $trg_db . '</th>
869 </tr>';
870 $odd_row = false;
871 foreach ($matching_tables as $tbl_name)
873 $odd_row = !$odd_row;
874 echo '<tr height="32" class=" ';
875 echo $odd_row ? 'odd' : 'even';
876 echo '">
877 <td> ' .$tbl_name . '</td>';
878 echo '</tr>';
880 foreach ($source_tables_uncommon as $tbl_nc_name)
882 $odd_row = !$odd_row;
883 echo '<tr height="32" class=" ';
884 echo $odd_row ? 'odd' : 'even';
885 echo '">';
886 if (in_array($tbl_nc_name, $uncommon_tables)) {
887 echo '<td>' .$tbl_nc_name . "\n" . '(Not present) </td>';
888 } else {
889 echo '<td>' .$tbl_nc_name . "\n" . '</td>';
891 echo '
892 </tr>';
894 foreach ($target_tables_uncommon as $tbl_nc_name)
896 $odd_row = !$odd_row;
897 echo '<tr height="32" class=" ';
898 echo $odd_row ? 'odd' : 'even';
899 echo '">
900 <td> - ' .$tbl_nc_name . '</td>';
901 echo '</tr>';
903 echo '</table>
904 </div>';
907 * This "list" div will contain a table and each row will depict information about structure/data diffrence in tables.
908 * Rows will be generated dynamically as soon as the colored buttons "D" or "S" are clicked.
911 echo '<div id="list" style = "overflow: auto; width: 1020px; height: 140px;
912 border-left: 1px gray solid; border-bottom: 1px gray solid;
913 padding:0px; margin: 0px">';
915 echo '<table>
916 <thead>
917 <tr style="width: 100%;">
918 <th id="table_name" style="width: 10%;" colspan="1">'. $strTable .' </th>
919 <th id="str_diff" style="width: 65%;" colspan="6">'. $strStructureDiff .' </th>
920 <th id="data_diff" style="width: 20%;" colspan="2">'. $strDataDiff .'</th>
921 </tr>
922 <tr style="width: 100%;">
923 <th style="width: 10%; background-color:#CCCCCC">'. $strTableName .'</th>
924 <th style="width: 10%; background-color:#CCCCCC">'. $strTableCreate .'</th>
925 <th style="width: 11%; background-color:#CCCCCC">'. $strTableAddColumn .'</th>
926 <th style="width: 13%; background-color:#CCCCCC">'. $strTableRemoveColumn .'</th>
927 <th style="width: 11%; background-color:#CCCCCC">'. $strTableAlterColumn .'</th>
928 <th style="width: 12%; background-color:#CCCCCC">'. $strTableRemoveIndex .'</th>
929 <th style="width: 11%; background-color:#CCCCCC">'. $strTableApplyIndex .'</th>
930 <th style="width: 10%; background-color:#CCCCCC">'. $strTableUpdateRow .'</th>
931 <th style="width: 10%; background-color:#CCCCCC">'. $strTableInsertRow .'</th>
932 </tr>
933 </thead>
934 <tbody></tbody>
935 </table>
936 </div>';
939 * This fieldset displays the checkbox to confirm deletion of previous rows from target tables
941 echo '<fieldset>
942 <p><input type= "checkbox" name="delete_rows" id ="delete_rows" />' . $strTableDeleteRows . ' </p>
943 </fieldset>';
945 echo '<fieldset class="tblFooters">' . "\n";
946 echo '<input type="button" name="apply_changes" value="' . $GLOBALS['strApplyChanges'].'"
947 onClick ="ApplySelectedChanges('."'". $_SESSION['token'] ."'".')" />';
948 echo '<input type="submit" name="synchronize_db" value="'. $GLOBALS['strSynchronizeDb'] .'" />'
949 . "\n" . '</fieldset>' . "\n";
950 echo '</form>';
954 * Dispalys the page when 'Synchronize Databases' is pressed.
957 if (isset($_REQUEST['synchronize_db'])) {
959 $src_db = $_SESSION['src_db'];
960 $trg_db = $_SESSION['trg_db'];
961 $update_array = $_SESSION['update_array'];
962 $insert_array = $_SESSION['insert_array'];
963 $src_username = $_SESSION['src_username'];
964 $trg_username = $_SESSION['trg_username'];
965 $src_password = $_SESSION['src_password'];
966 $trg_password = $_SESSION['trg_password'];
967 $matching_tables = $_SESSION['matching_tables'];
968 $matching_tables_keys = $_SESSION['matching_tables_keys'];
969 $matching_tables_fields = $_SESSION['matching_fields'];
970 $source_tables_uncommon = $_SESSION['src_uncommon_tables'];
971 $uncommon_tables_fields = $_SESSION['uncommon_tables_fields'];
972 $target_tables_uncommon = $_SESSION['target_tables_uncommon'];
973 $row_count = $_SESSION['uncommon_tables_row_count'];
974 $uncommon_tables = $_SESSION['uncommon_tables'];
975 $target_tables = $_SESSION['target_tables'];
977 $delete_array = $_SESSION['delete_array'];
978 $uncommon_columns = $_SESSION['uncommon_columns'];
979 $source_columns = $_SESSION['source_columns'];
980 $alter_str_array = $_SESSION['alter_str_array'];
981 $criteria = $_SESSION['criteria'];
982 $target_tables_keys = $_SESSION['target_tables_keys'];
983 $add_column_array = $_SESSION['add_column_array'];
984 $add_indexes_array = $_SESSION['add_indexes_array'];
985 $alter_indexes_array = $_SESSION['alter_indexes_array'];
986 $remove_indexes_array = $_SESSION['remove_indexes_array'];
987 $source_indexes = $_SESSION['source_indexes'];
988 $target_indexes = $_SESSION['target_indexes'];
989 $uncommon_cols = $uncommon_columns;
992 * Display success message.
994 echo '<div class="success">Target database has been synchronized with source database. </div>';
996 * Dispalying all the tables of source and target database and now no difference is there.
998 echo '<div id="serverstatus" style = "overflow: auto; width: 1050px; height: 250px;
999 border-left: 1px gray solid; border-bottom: 1px gray solid;
1000 padding:0px; margin: 0px"> ';
1002 echo '<table id="serverstatustraffic" class="data" width ="55%">
1003 <tr>
1004 <th> Source Database: '. $src_db .'</th>
1005 <th> Difference </th>
1006 </tr>';
1007 $odd_row = false;
1008 for($i = 0; $i < count($matching_tables); $i++)
1010 $odd_row = !$odd_row;
1011 echo '<tr height="32" class=" ';
1012 echo $odd_row ? 'odd' : 'even';
1013 echo '">
1014 <td>' . $matching_tables[$i]. "\n" . '</td>
1015 <td></td>
1016 </tr>';
1018 for ($j = 0; $j < count($source_tables_uncommon); $j++)
1020 $odd_row = !$odd_row;
1021 echo '<tr height="32" class=" ';
1022 echo $odd_row ? 'odd' : 'even';
1023 echo '">
1024 <td> + ' .$source_tables_uncommon[$j]. "\n" . '</td> ';
1025 echo '<td></td>
1026 </tr>';
1028 foreach ($target_tables_uncommon as $tbl_nc_name)
1030 $odd_row = !$odd_row;
1031 echo '<tr height="32" class=" ';
1032 echo $odd_row ? 'odd' : 'even';
1033 echo '">
1034 <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td><td></td>';
1035 echo '</tr>';
1037 echo '</table>';
1038 echo '<table id="serverstatusconnections" class="data" width="42%" >
1039 <tr>
1040 <th>Target Database: ' . $trg_db . '</th>
1041 </tr>';
1042 $odd_row = false;
1043 foreach ($matching_tables as $tbl_name)
1045 $odd_row = !$odd_row;
1046 echo '<tr height="32" class=" ';
1047 echo $odd_row ? 'odd' : 'even';
1048 echo '">
1049 <td> ' .$tbl_name . '</td>';
1050 echo '</tr>';
1052 foreach ($source_tables_uncommon as $tbl_nc_name)
1054 $odd_row = !$odd_row;
1055 echo '<tr height="32" class=" ';
1056 echo $odd_row ? 'odd' : 'even';
1057 echo '">
1058 <td>' .$tbl_nc_name . "\n" . ' </td>
1059 </tr>';
1061 foreach ($target_tables_uncommon as $tbl_nc_name)
1063 $odd_row = !$odd_row;
1064 echo '<tr height="32" class=" ';
1065 echo $odd_row ? 'odd' : 'even';
1066 echo '">
1067 <td> ' .$tbl_nc_name . '</td>';
1068 echo '</tr>';
1070 echo '</table> </div>';
1073 * connecting the source and target servers
1075 $src_link = PMA_DBI_connect($src_username, $src_password, $is_controluser = false);
1076 $trg_link = PMA_DBI_connect($trg_username, $trg_password, $is_controluser = false);
1079 * Displaying the queries.
1081 echo '<h5>Following queries have been executed: </h5>';
1082 echo '<div id="serverstatus" style = "overflow: auto; width: 1050px; height: 180px;
1083 border-left: 1px gray solid; border-bottom: 1px gray solid; padding: 0px; margin: 0px"> ';
1085 * Applying all sorts of differences for each matching table
1087 for($p=0; $p <sizeof($matching_tables);$p++)
1090 * If the check box is checked for deleting previous rows from the target database tables then
1091 * first find out rows to be deleted and then delete the rows.
1093 if (isset($_REQUEST['delete_rows'])) {
1095 PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $p, $target_tables_keys, $matching_tables_keys,
1096 $trg_db, $trg_link, $src_db, $src_link);
1098 if (isset($delete_array[$p])) {
1100 PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $p, $target_tables_keys, $delete_array, true);
1101 unset($delete_array[$p]);
1104 if (isset($alter_str_array[$p])) {
1106 PMA_alterTargetTableStructure($trg_db, $trg_link, $matching_tables, $source_columns, $alter_str_array, $matching_tables_fields,
1107 $criteria, $matching_tables_keys, $target_tables_keys, $p, true);
1108 unset($alter_str_array[$p]);
1110 if (isset($add_column_array[$p])) {
1112 PMA_findDeleteRowsFromTargetTables($delete_array, $matching_tables, $p, $target_tables_keys, $matching_tables_keys,
1113 $trg_db, $trg_link, $src_db, $src_link);
1115 if (isset($delete_array[$p])) {
1116 PMA_deleteFromTargetTable($trg_db, $trg_link, $matching_tables, $p, $target_tables_keys, $delete_array, true);
1117 unset($delete_array[$p]);
1119 PMA_addColumnsInTargetTable($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_columns, $add_column_array, $matching_tables_fields,
1120 $criteria, $matching_tables_keys, $target_tables_keys, $uncommon_tables,$uncommon_tables_fields, $p, $uncommon_cols, true);
1121 unset($add_column_array[$p]);
1123 if (isset($uncommon_columns[$p])) {
1125 PMA_removeColumnsFromTargetTable($trg_db, $trg_link, $matching_tables, $uncommon_columns, $p, true);
1126 unset($uncommon_columns[$p]);
1128 if (isset($add_indexes_array[$matching_table_structure_diff[$q]]) || isset($remove_indexes_array[$matching_table_structure_diff[$q]])
1129 || isset($alter_indexes_array[$matching_table_structure_diff[$q]])) {
1131 PMA_applyIndexesDiff ($trg_db, $trg_link, $matching_tables, $source_indexes, $target_indexes, $add_indexes_array, $alter_indexes_array,
1132 $remove_indexes_array, $matching_table_structure_diff[$q], true);
1134 unset($add_indexes_array[$matching_table_structure_diff[$q]]);
1135 unset($alter_indexes_array[$matching_table_structure_diff[$q]]);
1136 unset($remove_indexes_array[$matching_table_structure_diff[$q]]);
1139 PMA_updateTargetTables($matching_tables, $update_array, $src_db, $trg_db, $trg_link, $p, $matching_tables_keys, true);
1141 PMA_insertIntoTargetTable($matching_tables, $src_db, $trg_db, $src_link, $trg_link , $matching_tables_fields, $insert_array,$p, $matching_tables_keys,
1142 $matching_tables_keys,$source_columns, $add_column_array, $criteria, $target_tables_keys,$uncommon_tables, $uncommon_tables_fields,$uncommon_cols,
1143 $alter_str_array,$source_indexes, $target_indexes, $add_indexes_array, $alter_indexes_array, $delete_array, $update_array, true);
1147 * Creating and populating tables present in source but absent from target database.
1149 for($q=0; $q < sizeof($source_tables_uncommon) ;$q++)
1151 if (isset($uncommon_tables[$q])) {
1152 PMA_createTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $q, $uncommon_tables_fields, true);
1154 if (isset($row_count[$q])) {
1155 PMA_populateTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $q, $uncommon_tables_fields, true);
1158 echo "</div>";
1162 * Displays the main page when none of the following buttons is pressed
1165 if (!isset($_REQUEST['submit_connect']) && !isset($_REQUEST['synchronize_db']) && !isset($_REQUEST['Table_ids']) )
1167 /**
1168 * Displays the sub-page heading
1170 echo '<h2>' . "\n"
1171 . ($GLOBALS['cfg']['MainPageIconic']
1172 ? '<img class="icon" src="' . $pmaThemeImage . 's_sync.png" width="18"'
1173 .' height="18" alt="" />'
1174 : '')
1175 . $strSynchronize . "\n"
1176 .'</h2>' . "\n";
1178 echo '<div id="serverstatus">
1179 <form name="connection_form" id="connection_form" method="POST" action="server_synchronize.php"
1180 onsubmit="return validateConnection(connection_form,this)">'
1181 . PMA_generate_common_hidden_inputs('', '');
1183 * Displays the form for source server
1185 echo '<table id="serverstatustraffic" class="data" >
1186 <tr>
1187 <th>Source Database</th>
1188 </tr>
1189 <tr class="odd">
1190 <td>Host: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="src_host"></td>
1191 </tr>
1192 <tr class="even">
1193 <td>Username: <input type="text" name="src_username"/></td>
1194 </tr>
1195 <tr class="odd">
1196 <td>Password: <input type="password" name="src_pass" /> </td>
1197 </tr>
1198 <tr class="even">
1199 <td>Port: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="src_port" value="3306"></td>
1200 </tr>
1201 <tr class="odd">
1202 <td>Database: <input type="text" name="src_db"></td>
1203 </tr>
1204 </table>';
1207 * Displays the form for target server
1209 echo '<table id="serverstatusconnection" class="data">
1210 <tr>
1211 <th>Target Database</th>
1212 </tr>
1213 <tr class="odd">
1214 <td>Host: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="trg_host"></td>
1215 </tr>
1216 <tr class="even">
1217 <td>Username: <input type="text" name="trg_username"></td>
1218 </tr>
1219 <tr class="odd">
1220 <td>Password: <input type="password" name="trg_pass"></td>
1221 </tr>
1222 <tr class="even">
1223 <td>Port: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="trg_port" value="3306"></td>
1224 </tr>
1225 <tr class="odd">
1226 <td>Database: <input type="text" name="trg_db"></td>
1227 </tr>
1228 </table>
1230 <fieldset class="tblFooters">
1231 <input type="submit" name="submit_connect" value="' .$GLOBALS['strGo'] .'" id="buttonGo" />
1232 </fieldset>
1233 </form>
1234 </div>
1235 <div class="notice">' . $strSynchronizationNote . '</div>';
1239 * Displays the footer
1241 require_once './libraries/footer.inc.php';