-
Notifications
You must be signed in to change notification settings - Fork 17
/
index.php
243 lines (203 loc) · 8.54 KB
/
index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<?php
/**
* This provides a user-interface for using the DbDiff class.
*/
error_reporting(E_ALL);
require_once('DbDiff.php');
require('config.php');
/**
* Display options and instructions.
*
* @return void
*/
function show_options($dbs_config)
{
echo '<h3>Step 1: Export database schemas</h3>';
if (count($dbs_config) > 0) {
echo '<p class="info">Select a database configuration from the list below, or select \'Enter details...\'</p>';
echo '<ul id="db-list">';
foreach ($dbs_config as $key => $db_config) {
echo '<li><a href="?a=export_schema&db=' . $key . '">' . $db_config['name'] . '</a></li>';
}
echo '<li><em><a href="#" onclick="document.getElementById(\'db-config\').style.display=\'block\';return false;">Enter details...</a></em></li>';
echo '</ul>';
} else {
echo '<p class="info">Enter connection details in the form below, or setup a database connection in the <code>config.php</code> file.</p>';
}
echo '<form action="?a=export_schema" method="post" id="db-config"' . (count($dbs_config) > 0 ? ' style="display:none;"' : '' ) . '>';
echo '<div class="field"><label for="db-host">Host</label><input type="text" name="db-host" id="db-host" value="localhost" /></div>';
echo '<div class="field"><label for="db-user">User</label><input type="text" name="db-user" id="db-user" /></div>';
echo '<div class="field"><label for="db-password">Password</label><input type="password" name="db-password" id="db-password" /></div>';
echo '<div class="field"><label for="db-name">Database</label><input type="text" name="db-name" id="db-name" /></div>';
echo '<div class="submit"><input type="submit" value="Export" /></div><div class="clearer"></div>';
echo '</form>';
echo '<h3>Step 2: Compare schemas</h3>';
echo '<p class="info">Once two database schemas have been exported, paste them here to be compared.</p>';
echo '<form action="?a=compare" method="post" id="compare">';
if (count($dbs_config) < 2) {
echo '<div class="field"><label for="schema1">First schema</label><textarea name="schema1" id="schema1" cols="100" rows="5"></textarea></div>';
echo '<div class="field"><label for="schema2">Second schema</label><textarea name="schema2" id="schema2" cols="100" rows="5"></textarea></div>';
} else {
echo '<div class=""><label for="schema1">First schema</label><select name="schema1">';
foreach ($dbs_config as $key => $db_config) {
echo '<option value=' . $key . '>' . $db_config['name'] . '</option>';
}
echo '</select></div>';
echo '<div class=""><label for="schema2">Second schema</label><select name="schema2">';
foreach ($dbs_config as $key => $db_config) {
echo '<option value=' . $key . '>' . $db_config['name'] . '</option>';
}
echo '</select></div>';
}
echo '<div class="submit"><input type="submit" value="Compare" /></div>';
echo '</form>';
}
/**
* Convenience method for outputting errors.
*
* @return void
* */
function echo_error($error)
{
echo '<p class="error">', $error, '</p>';
}
/**
* Export the schema from the database specified and echo the results.
*
* @param string $db The key of the config to be extracted from $dbs_config.
* @return void
*/
function export_schema($config)
{
$result = DbDiff::export($config['config'], $config['name']);
if ($result == null) {
echo_error('Couldn\'t connect to database: ' . mysql_error());
return;
}
$serialized_schema = serialize($result);
echo '<h3>Exported \'' . $config['name'] . '\'</h3>';
echo '<p>Copy the following schema information and then proceed to <a href="?">step 2</a>.</p>';
echo '<textarea cols="100" rows="20" onclick="this.focus();this.select();">';
echo chunk_split($serialized_schema, 100);
echo '</textarea>';
}
/**
* Strips new line characters (CR and LF) from a string.
*
* @param string $str The string to process.
* @return string The string without CRs or LFs.
*/
function strip_nl($str)
{
return str_replace(array("\n", "\r"), '', $str);
}
/**
* Returns an 's' character if the count is not 1.
*
* This is useful for adding plurals.
*
* @return string An 's' character or an empty string
* */
function s($count)
{
return $count != 1 ? 's' : '';
}
/**
* Compare the two schemas and echo the results.
*
* @param string $schema1 The first schema (serialized).
* @param string $schema2 The second schema (serialized).
* @return void
*/
function do_compare($schema1, $schema2)
{
if (empty($schema1) || empty($schema2)) {
echo_error('Both schemas must be given.');
return;
}
$unserialized_schema1 = unserialize(strip_nl($schema1));
$unserialized_schema2 = unserialize(strip_nl($schema2));
$results = DbDiff::compare($unserialized_schema1, $unserialized_schema2);
if (count($results) > 0) {
echo '<h3>Found differences in ' . count($results) . ' table' . s(count($results)) . ':</h3>';
echo '<ul id="differences">';
foreach ($results as $table_name => $differences) {
echo '<li><strong>' . $table_name . '</strong><ul>';
foreach ($differences as $difference) {
echo '<li>' . $difference . '</li>';
}
echo '</ul></li>';
}
echo '</ul>';
} else {
echo '<p>No differences found.</p>';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DbDiff</title>
<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
</head>
<body>
<div id="canvas">
<h1><a href="?">DbDiff</a></h1>
<h2>Tool for comparing database schemas.</h2>
<?php
$action = @$_GET['a'];
switch ($action) {
case 'export_schema':
if (isset($_GET['db'])) {
$db = $_GET['db'];
if (!isset($dbs_config[$db])) {
echo_error('No database configuration selected.');
break;
}
$config = $dbs_config[$db];
} else {
if (!isset($_POST['db-host']) || !isset($_POST['db-user']) || !isset($_POST['db-password']) || !isset($_POST['db-name'])) {
echo_error('No database configuration entered.');
break;
}
$config = array(
'name' => $_POST['db-name'] . ' (' . $_POST['db-host'] . ')',
'config' => array(
'host' => $_POST['db-host'],
'user' => $_POST['db-user'],
'password' => $_POST['db-password'],
'name' => $_POST['db-name']
)
);
}
export_schema($config);
echo '<p><a href="?">« Back to main page</a></p>';
break;
case 'compare':
if (count($dbs_config) < 2) {
$schema1 = @$_POST['schema1'];
$schema2 = @$_POST['schema2'];
if (get_magic_quotes_gpc()) { // sigh...
$schema1 = stripslashes($schema1);
$schema2 = stripslashes($schema2);
}
} else {
$schema1 = $dbs_config[@$_POST['schema1']];
$schema2 = $dbs_config[@$_POST['schema2']];
$schema1 = serialize(DbDiff::export($schema1['config'], $schema1['name']));
$schema2 = serialize(DbDiff::export($schema2['config'], $schema2['name']));
}
do_compare($schema1, $schema2);
echo '<p><a href="?">« Back to main page</a></p>';
break;
default:
show_options($dbs_config);
}
?>
<div id="footer">
<p>More information on this tool is available from the corresponding <a href="http://joefreeman.co.uk/blog/2009/07/php-script-to-compare-mysql-database-schemas/">blog post</a>.</p>
</div>
</div>
</body>
</html>