wordmove 0.0.8 → 0.1.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $:.unshift File.join(File.dirname(__FILE__), "../lib")
4
+
3
5
  require 'wordmove/cli'
4
6
  Wordmove::CLI.start
@@ -0,0 +1,182 @@
1
+ <?php
2
+
3
+ /**
4
+ * MySQL database dump.
5
+ *
6
+ * @author David Grudl
7
+ * @copyright Copyright (c) 2008 David Grudl
8
+ * @license New BSD License
9
+ * @link http://phpfashion.com/
10
+ * @version 0.9
11
+ */
12
+
13
+ class MySQLDump
14
+ {
15
+ const MAX_SQL_SIZE = 1e6;
16
+
17
+ /** @var mysqli */
18
+ private $connection;
19
+
20
+ /**
21
+ * Connects to database.
22
+ * @param mysqli connection
23
+ */
24
+ public function __construct(mysqli $connection)
25
+ {
26
+ $this->connection = $connection;
27
+
28
+ if ($this->connection->connect_errno) {
29
+ throw new Exception($this->connection->connect_error);
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Sends dump to browser.
35
+ * @param string filename
36
+ * @return void
37
+ */
38
+ public function send($file)
39
+ {
40
+ $this->write(fopen('php://output', 'wb'));
41
+ }
42
+
43
+ /**
44
+ * Writes dump to logical file.
45
+ * @param resource
46
+ * @return void
47
+ */
48
+ public function write($handle)
49
+ {
50
+ if (!is_resource($handle) || get_resource_type($handle) !== 'stream') {
51
+ throw new Exception('Argument must be stream resource.');
52
+ }
53
+
54
+ if (!$this->connection->set_charset('utf8')) { // was added in MySQL 5.0.7 and PHP 5.0.5, fixed in PHP 5.1.5)
55
+ throw new Exception($this->connection->error);
56
+ }
57
+
58
+ $views = $tables = array();
59
+
60
+ $res = $this->connection->query('SHOW TABLES');
61
+ while ($row = $res->fetch_row()) {
62
+ $tables[] = $row[0];
63
+ }
64
+ $res->close();
65
+
66
+ $db = $this->connection->query('SELECT DATABASE()')->fetch_row();
67
+ fwrite($handle, "-- David Grudl MySQL Dump Utility\n"
68
+ . "-- Created at " . date('j.n.Y G:i') . "\n"
69
+ . (isset($_SERVER['HTTP_HOST']) ? "-- Host: $_SERVER[HTTP_HOST]\n" : '')
70
+ . "-- Server: " . $this->connection->server_info . "\n"
71
+ . "-- Codepage: " . $this->connection->character_set_name() . "\n"
72
+ . "-- Database: " . $db[0] . "\n"
73
+ . "-- Tables: " . implode(', ', $tables) . "\n"
74
+ . "\n"
75
+ . "SET NAMES utf8;\n"
76
+ . "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO';\n"
77
+ . "SET FOREIGN_KEY_CHECKS=0;\n");
78
+
79
+ foreach ($tables as $table)
80
+ {
81
+ $res = $this->connection->query("SHOW CREATE TABLE `$table`");
82
+ $row = $res->fetch_assoc();
83
+ $res->close();
84
+
85
+ if (isset($row['Create View'])) {
86
+ $views[$table] = $row['Create View'];
87
+ continue;
88
+ }
89
+
90
+ fwrite($handle, "-- --------------------------------------------------------\n\n");
91
+ fwrite($handle, "DROP TABLE IF EXISTS `$table`;\n\n");
92
+ fwrite($handle, $row['Create Table'] . ";\n\n");
93
+
94
+ $numeric = array();
95
+ $res = $this->connection->query("SHOW COLUMNS FROM `$table`");
96
+ $cols = array();
97
+ while ($row = $res->fetch_assoc()) {
98
+ $col = $row['Field'];
99
+ $cols[] = '`' . str_replace('`', '``', $col) . '`';
100
+ preg_match('/^([a-z]+)/', $row['Type'], $matches);
101
+ $type = strtolower($matches[1]);
102
+ $numeric[$col] = in_array($type, array('byte','counter','serial','int','long','currency','real','money','float','double','decimal','numeric','number'));
103
+ }
104
+ $cols = '(' . implode(', ', $cols) . ')';
105
+ $res->close();
106
+
107
+
108
+ $size = 0;
109
+ $res = $this->connection->query("SELECT * FROM `$table`", MYSQLI_USE_RESULT);
110
+ while ($row = $res->fetch_assoc()) {
111
+ $s = '(';
112
+ foreach ($row as $key => $value) {
113
+ if ($value === NULL) {
114
+ $s .= "NULL,\t";
115
+ } elseif ($numeric[$key]) {
116
+ $s .= $value . ",\t";
117
+ } else {
118
+ $s .= "'" . $this->connection->real_escape_string($value) . "',\t";
119
+ }
120
+ }
121
+
122
+ if ($size == 0) {
123
+ $s = "INSERT INTO `$table` $cols VALUES\n$s";
124
+ } else {
125
+ $s = ",\n$s";
126
+ }
127
+
128
+ $len = strlen($s) - 1;
129
+ $s[$len - 1] = ')';
130
+ fwrite($handle, $s, $len);
131
+
132
+ $size += $len;
133
+ if ($size > self::MAX_SQL_SIZE) {
134
+ fwrite($handle, ";\n");
135
+ $size = 0;
136
+ }
137
+ }
138
+
139
+ if ($size) fwrite($handle, ";\n");
140
+ $res->close();
141
+
142
+ fwrite($handle, "\n\n");
143
+ }
144
+
145
+ foreach ($views as $view => $sql)
146
+ {
147
+ fwrite($handle, "-- --------------------------------------------------------\n\n");
148
+ fwrite($handle, "DROP VIEW IF EXISTS `$view`;\n\n$sql;\n\n");
149
+ }
150
+
151
+ fwrite($handle, "-- THE END\n");
152
+ fclose($handle);
153
+ }
154
+ }
155
+
156
+ function get_connection($db_host, $db_username, $db_password, $db_name, $error = NULL) {
157
+ $db_connection = new mysqli($db_host, $db_username, $db_password);
158
+ if (!$db_connection || !$db_connection->select_db($db_name)) {
159
+ if ($db_connection) {
160
+ $error = mysqli_connect_error();
161
+ } else {
162
+ $error = "Unable to connect to mysql database";
163
+ }
164
+ return NULL;
165
+ }
166
+ return $db_connection;
167
+ }
168
+
169
+ $db_host = '<%= escape_php db[:host] %>';
170
+ $db_username = '<%= escape_php db[:user] %>';
171
+ $db_password = '<%= escape_php db[:password] %>';
172
+ $db_name = '<%= escape_php_literal db[:name] %>';
173
+ $shared_key = '<%= password %>';
174
+
175
+ $mysql_error = '';
176
+
177
+ if ($_GET['shared_key'] == $shared_key) {
178
+ $connection = get_connection($db_host, $db_username, $db_password, $db_name, &$mysql_error);
179
+ $dump = new MySQLDump($connection);
180
+ $dump->send('dump.mysql');
181
+ }
182
+
@@ -0,0 +1,1076 @@
1
+ <?php
2
+
3
+ $shared_key = '<%= password %>';
4
+ if ($_GET['shared_key'] != $shared_key) {
5
+ die();
6
+ }
7
+
8
+ // BigDump ver. 0.34b from 2011-09-04
9
+
10
+ // Database configuration
11
+
12
+ $db_server = '<%= escape_php db[:host] %>';
13
+ $db_username = '<%= escape_php db[:user] %>';
14
+ $db_password = '<%= escape_php db[:password] %>';
15
+ $db_name = '<%= escape_php db[:name] %>';
16
+
17
+ // Other settings (optional)
18
+
19
+ $filename = ''; // Specify the dump filename to suppress the file selection dialog
20
+ $ajax = true; // AJAX mode: import will be done without refreshing the website
21
+ $linespersession = 3000; // Lines to be executed per one import session
22
+ $delaypersession = 0; // You can specify a sleep time in milliseconds after each session
23
+ // Works only if JavaScript is activated. Use to reduce server overrun
24
+
25
+ // CSV related settings (only if you use a CSV dump)
26
+
27
+ $csv_insert_table = ''; // Destination table for CSV files
28
+ $csv_preempty_table = false; // true: delete all entries from table specified in $csv_insert_table before processing
29
+ $csv_delimiter = ','; // Field delimiter in CSV file
30
+ $csv_add_quotes = true; // If your CSV data already have quotes around each field set it to false
31
+ $csv_add_slashes = true; // If your CSV data already have slashes in front of ' and " set it to false
32
+
33
+ // Allowed comment markers: lines starting with these strings will be ignored by BigDump
34
+
35
+ $comment[]='#'; // Standard comment lines are dropped by default
36
+ $comment[]='-- ';
37
+ $comment[]='DELIMITER'; // Ignore DELIMITER switch as it's not a valid SQL statement
38
+ // $comment[]='---'; // Uncomment this line if using proprietary dump created by outdated mysqldump
39
+ // $comment[]='CREATE DATABASE'; // Uncomment this line if your dump contains create database queries in order to ignore them
40
+ $comment[]='/*!'; // Or add your own string to leave out other proprietary things
41
+
42
+ // Pre-queries: SQL queries to be executed at the beginning of each import session
43
+
44
+ // $pre_query[]='SET foreign_key_checks = 0';
45
+ // $pre_query[]='Add additional queries if you want here';
46
+
47
+ // Connection charset should be the same as the dump file charset (utf8, latin1, cp1251, koi8r etc.)
48
+ // See http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html for the full list
49
+ // Change this if you have problems with non-latin letters
50
+
51
+ $db_connection_charset = '<%= db[:charset] || utf8';
52
+
53
+ // Default query delimiter: this character at the line end tells Bigdump where a SQL statement ends
54
+ // Can be changed by DELIMITER statement in the dump file (normally used when defining procedures/functions)
55
+
56
+ $delimiter = ';';
57
+
58
+ // String quotes character
59
+
60
+ $string_quotes = '\''; // Change to '"' if your dump file uses double qoutes for strings
61
+
62
+
63
+ // *******************************************************************************************
64
+ // If not familiar with PHP please don't change anything below this line
65
+ // *******************************************************************************************
66
+
67
+ if ($ajax)
68
+ ob_start();
69
+
70
+ define ('VERSION','0.34b');
71
+ define ('DATA_CHUNK_LENGTH',16384); // How many chars are read per time
72
+ define ('MAX_QUERY_LINES',300); // How many lines may be considered to be one query (except text lines)
73
+ define ('TESTMODE',false); // Set to true to process the file without actually accessing the database
74
+
75
+ header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
76
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
77
+ header("Cache-Control: no-store, no-cache, must-revalidate");
78
+ header("Cache-Control: post-check=0, pre-check=0", false);
79
+ header("Pragma: no-cache");
80
+
81
+ @ini_set('auto_detect_line_endings', true);
82
+ @set_time_limit(0);
83
+
84
+ if (function_exists("date_default_timezone_set") && function_exists("date_default_timezone_get"))
85
+ @date_default_timezone_set(@date_default_timezone_get());
86
+
87
+ // Clean and strip anything we don't want from user's input [0.27b]
88
+
89
+ foreach ($_REQUEST as $key => $val)
90
+ {
91
+ $val = preg_replace("/[^_A-Za-z0-9-\.&= ;\$]/i",'', $val);
92
+ $_REQUEST[$key] = $val;
93
+ }
94
+
95
+ ?>
96
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
97
+ <html>
98
+ <head>
99
+ <title>BigDump ver. <?php echo (VERSION); ?></title>
100
+ <meta http-equiv="CONTENT-TYPE" content="text/html; charset=iso-8859-1"/>
101
+ <meta http-equiv="CONTENT-LANGUAGE" content="EN"/>
102
+
103
+ <meta http-equiv="Cache-Control" content="no-cache/"/>
104
+ <meta http-equiv="Pragma" content="no-cache"/>
105
+ <meta http-equiv="Expires" content="-1"/>
106
+ <meta name="robots" content="noindex, nofollow">
107
+
108
+ <style type="text/css">
109
+ <!--
110
+
111
+ body
112
+ { background-color:#FFFFF0;
113
+ }
114
+
115
+ h1
116
+ { font-size:20px;
117
+ line-height:24px;
118
+ font-family:Arial,Helvetica,sans-serif;
119
+ margin-top:5px;
120
+ margin-bottom:5px;
121
+ }
122
+
123
+ p,td,th
124
+ { font-size:14px;
125
+ line-height:18px;
126
+ font-family:Arial,Helvetica,sans-serif;
127
+ margin-top:5px;
128
+ margin-bottom:5px;
129
+ text-align:justify;
130
+ vertical-align:top;
131
+ }
132
+
133
+ p.centr
134
+ {
135
+ text-align:center;
136
+ }
137
+
138
+ p.smlcentr
139
+ { font-size:10px;
140
+ line-height:14px;
141
+ text-align:center;
142
+ }
143
+
144
+ p.error
145
+ { color:#FF0000;
146
+ font-weight:bold;
147
+ }
148
+
149
+ p.success
150
+ { color:#00DD00;
151
+ font-weight:bold;
152
+ }
153
+
154
+ p.successcentr
155
+ { color:#00DD00;
156
+ background-color:#DDDDFF;
157
+ font-weight:bold;
158
+ text-align:center;
159
+ }
160
+
161
+ td
162
+ { background-color:#F8F8F8;
163
+ text-align:left;
164
+ }
165
+
166
+ td.transparent
167
+ { background-color:#FFFFF0;
168
+ }
169
+
170
+ th
171
+ { font-weight:bold;
172
+ color:#FFFFFF;
173
+ background-color:#AAAAEE;
174
+ text-align:left;
175
+ }
176
+
177
+ td.right
178
+ { text-align:right;
179
+ }
180
+
181
+ form
182
+ { margin-top:5px;
183
+ margin-bottom:5px;
184
+ }
185
+
186
+ div.skin1
187
+ {
188
+ border-color:#3333EE;
189
+ border-width:5px;
190
+ border-style:solid;
191
+ background-color:#AAAAEE;
192
+ text-align:center;
193
+ vertical-align:middle;
194
+ padding:3px;
195
+ margin:1px;
196
+ }
197
+
198
+ td.bg3
199
+ { background-color:#EEEE99;
200
+ text-align:left;
201
+ vertical-align:top;
202
+ width:20%;
203
+ }
204
+
205
+ th.bg4
206
+ { background-color:#EEAA55;
207
+ text-align:left;
208
+ vertical-align:top;
209
+ width:20%;
210
+ }
211
+
212
+ td.bgpctbar
213
+ { background-color:#EEEEAA;
214
+ text-align:left;
215
+ vertical-align:middle;
216
+ width:80%;
217
+ }
218
+
219
+ -->
220
+ </style>
221
+
222
+ </head>
223
+
224
+ <body>
225
+
226
+ <center>
227
+
228
+ <table width="780" cellspacing="0" cellpadding="0">
229
+ <tr><td class="transparent">
230
+
231
+ <!-- <h1>BigDump: Staggered MySQL Dump Importer ver. <?php echo (VERSION); ?></h1> -->
232
+
233
+ <?php
234
+
235
+ function skin_open() {
236
+ echo ('<div class="skin1">');
237
+ }
238
+
239
+ function skin_close() {
240
+ echo ('</div>');
241
+ }
242
+
243
+ skin_open();
244
+ echo ('<h1>BigDump: Staggered MySQL Dump Importer v'.VERSION.'</h1>');
245
+ skin_close();
246
+
247
+ $error = false;
248
+ $file = false;
249
+
250
+ // Check PHP version
251
+
252
+ if (!$error && !function_exists('version_compare'))
253
+ { echo ("<p class=\"error\">PHP version 4.1.0 is required for BigDump to proceed. You have PHP ".phpversion()." installed. Sorry!</p>\n");
254
+ $error=true;
255
+ }
256
+
257
+ // Check if mysql extension is available
258
+
259
+ if (!$error && !function_exists('mysql_connect'))
260
+ { echo ("<p class=\"error\">There is no mySQL extension available in your PHP installation. Sorry!</p>\n");
261
+ $error=true;
262
+ }
263
+
264
+ // Calculate PHP max upload size (handle settings like 10M or 100K)
265
+
266
+ if (!$error)
267
+ { $upload_max_filesize=ini_get("upload_max_filesize");
268
+ if (preg_match("/([0-9]+)K/i",$upload_max_filesize,$tempregs)) $upload_max_filesize=$tempregs[1]*1024;
269
+ if (preg_match("/([0-9]+)M/i",$upload_max_filesize,$tempregs)) $upload_max_filesize=$tempregs[1]*1024*1024;
270
+ if (preg_match("/([0-9]+)G/i",$upload_max_filesize,$tempregs)) $upload_max_filesize=$tempregs[1]*1024*1024*1024;
271
+ }
272
+
273
+ // Get the current directory
274
+
275
+ if (isset($_SERVER["CGIA"]))
276
+ $upload_dir=dirname($_SERVER["CGIA"]);
277
+ else if (isset($_SERVER["ORIG_PATH_TRANSLATED"]))
278
+ $upload_dir=dirname($_SERVER["ORIG_PATH_TRANSLATED"]);
279
+ else if (isset($_SERVER["ORIG_SCRIPT_FILENAME"]))
280
+ $upload_dir=dirname($_SERVER["ORIG_SCRIPT_FILENAME"]);
281
+ else if (isset($_SERVER["PATH_TRANSLATED"]))
282
+ $upload_dir=dirname($_SERVER["PATH_TRANSLATED"]);
283
+ else
284
+ $upload_dir=dirname($_SERVER["SCRIPT_FILENAME"]);
285
+
286
+ // Handle file upload
287
+
288
+ if (!$error && isset($_REQUEST["uploadbutton"]))
289
+ { if (is_uploaded_file($_FILES["dumpfile"]["tmp_name"]) && ($_FILES["dumpfile"]["error"])==0)
290
+ {
291
+ $uploaded_filename=str_replace(" ","_",$_FILES["dumpfile"]["name"]);
292
+ $uploaded_filename=preg_replace("/[^_A-Za-z0-9-\.]/i",'',$uploaded_filename);
293
+ $uploaded_filepath=str_replace("\\","/",$upload_dir."/".$uploaded_filename);
294
+
295
+ if (file_exists($uploaded_filename))
296
+ { echo ("<p class=\"error\">File $uploaded_filename already exist! Delete and upload again!</p>\n");
297
+ }
298
+ else if (!preg_match("/(\.(sql|gz|csv))$/i",$uploaded_filename))
299
+ { echo ("<p class=\"error\">You may only upload .sql .gz or .csv files.</p>\n");
300
+ }
301
+ else if (!@move_uploaded_file($_FILES["dumpfile"]["tmp_name"],$uploaded_filepath))
302
+ { echo ("<p class=\"error\">Error moving uploaded file ".$_FILES["dumpfile"]["tmp_name"]." to the $uploaded_filepath</p>\n");
303
+ echo ("<p>Check the directory permissions for $upload_dir (must be 777)!</p>\n");
304
+ }
305
+ else
306
+ { echo ("<p class=\"success\">Uploaded file saved as $uploaded_filename</p>\n");
307
+ }
308
+ }
309
+ else
310
+ { echo ("<p class=\"error\">Error uploading file ".$_FILES["dumpfile"]["name"]."</p>\n");
311
+ }
312
+ }
313
+
314
+
315
+ // Handle file deletion (delete only in the current directory for security reasons)
316
+
317
+ if (!$error && isset($_REQUEST["delete"]) && $_REQUEST["delete"]!=basename($_SERVER["SCRIPT_FILENAME"]))
318
+ { if (preg_match("/(\.(sql|gz|csv))$/i",$_REQUEST["delete"]) && @unlink(basename($_REQUEST["delete"])))
319
+ echo ("<p class=\"success\">".$_REQUEST["delete"]." was removed successfully</p>\n");
320
+ else
321
+ echo ("<p class=\"error\">Can't remove ".$_REQUEST["delete"]."</p>\n");
322
+ }
323
+
324
+ // Connect to the database, set charset and execute pre-queries
325
+
326
+ if (!$error && !TESTMODE)
327
+ { $dbconnection = @mysql_connect($db_server,$db_username,$db_password);
328
+ if ($dbconnection)
329
+ $db = mysql_select_db($db_name);
330
+ if (!$dbconnection || !$db)
331
+ { echo ("<p class=\"error\">Database connection failed due to ".mysql_error()."</p>\n");
332
+ echo ("<p>Edit the database settings in ".$_SERVER["SCRIPT_FILENAME"]." or contact your database provider.</p>\n");
333
+ $error=true;
334
+ }
335
+ if (!$error && $db_connection_charset!=='')
336
+ @mysql_query("SET NAMES $db_connection_charset", $dbconnection);
337
+
338
+ if (!$error && isset ($pre_query) && sizeof ($pre_query)>0)
339
+ { reset($pre_query);
340
+ foreach ($pre_query as $pre_query_value)
341
+ { if (!@mysql_query($pre_query_value, $dbconnection))
342
+ { echo ("<p class=\"error\">Error with pre-query.</p>\n");
343
+ echo ("<p>Query: ".trim(nl2br(htmlentities($pre_query_value)))."</p>\n");
344
+ echo ("<p>MySQL: ".mysql_error()."</p>\n");
345
+ $error=true;
346
+ break;
347
+ }
348
+ }
349
+ }
350
+ }
351
+ else
352
+ { $dbconnection = false;
353
+ }
354
+
355
+
356
+ // DIAGNOSTIC
357
+ // echo("<h1>Checkpoint!</h1>");
358
+
359
+ // List uploaded files in multifile mode
360
+
361
+ if (!$error && !isset($_REQUEST["fn"]) && $filename=="")
362
+ { if ($dirhandle = opendir($upload_dir))
363
+ {
364
+ $files=array();
365
+ while (false !== ($files[] = readdir($dirhandle)));
366
+ closedir($dirhandle);
367
+ $dirhead=false;
368
+
369
+ if (sizeof($files)>0)
370
+ {
371
+ sort($files);
372
+ foreach ($files as $dirfile)
373
+ {
374
+ if ($dirfile != "." && $dirfile != ".." && $dirfile!=basename($_SERVER["SCRIPT_FILENAME"]) && preg_match("/\.(sql|gz|csv)$/i",$dirfile))
375
+ { if (!$dirhead)
376
+ { echo ("<table width=\"100%\" cellspacing=\"2\" cellpadding=\"2\">\n");
377
+ echo ("<tr><th>Filename</th><th>Size</th><th>Date&amp;Time</th><th>Type</th><th>&nbsp;</th><th>&nbsp;</th>\n");
378
+ $dirhead=true;
379
+ }
380
+ echo ("<tr><td>$dirfile</td><td class=\"right\">".filesize($dirfile)."</td><td>".date ("Y-m-d H:i:s", filemtime($dirfile))."</td>");
381
+
382
+ if (preg_match("/\.sql$/i",$dirfile))
383
+ echo ("<td>SQL</td>");
384
+ elseif (preg_match("/\.gz$/i",$dirfile))
385
+ echo ("<td>GZip</td>");
386
+ elseif (preg_match("/\.csv$/i",$dirfile))
387
+ echo ("<td>CSV</td>");
388
+ else
389
+ echo ("<td>Misc</td>");
390
+
391
+ if ((preg_match("/\.gz$/i",$dirfile) && function_exists("gzopen")) || preg_match("/\.sql$/i",$dirfile) || preg_match("/\.csv$/i",$dirfile))
392
+ echo ("<td><a href=\"".$_SERVER["PHP_SELF"]."?start=1&amp;fn=".urlencode($dirfile)."&amp;foffset=0&amp;totalqueries=0&amp;delimiter=".urlencode($delimiter)."\">Start Import</a> into $db_name at $db_server</td>\n <td><a href=\"".$_SERVER["PHP_SELF"]."?delete=".urlencode($dirfile)."\">Delete file</a></td></tr>\n");
393
+ else
394
+ echo ("<td>&nbsp;</td>\n <td>&nbsp;</td></tr>\n");
395
+ }
396
+ }
397
+ }
398
+
399
+ if ($dirhead)
400
+ echo ("</table>\n");
401
+ else
402
+ echo ("<p>No uploaded SQL, GZ or CSV files found in the working directory</p>\n");
403
+ }
404
+ else
405
+ { echo ("<p class=\"error\">Error listing directory $upload_dir</p>\n");
406
+ $error=true;
407
+ }
408
+ }
409
+
410
+
411
+ // Single file mode
412
+
413
+ if (!$error && !isset ($_REQUEST["fn"]) && $filename!="")
414
+ { echo ("<p><a href=\"".$_SERVER["PHP_SELF"]."?start=1&amp;fn=".urlencode($filename)."&amp;foffset=0&amp;totalqueries=0\">Start Import</a> from $filename into $db_name at $db_server</p>\n");
415
+ }
416
+
417
+
418
+ // File Upload Form
419
+
420
+ if (!$error && !isset($_REQUEST["fn"]) && $filename=="")
421
+ {
422
+
423
+ // Test permissions on working directory
424
+
425
+ do { $tempfilename=time().".tmp"; } while (file_exists($tempfilename));
426
+ if (!($tempfile=@fopen($tempfilename,"w")))
427
+ { echo ("<p>Upload form disabled. Permissions for the working directory <i>$upload_dir</i> <b>must be set writable for the webserver</b> in order ");
428
+ echo ("to upload files here. Alternatively you can upload your dump files via FTP.</p>\n");
429
+ }
430
+ else
431
+ { fclose($tempfile);
432
+ unlink ($tempfilename);
433
+
434
+ echo ("<p>You can now upload your dump file up to $upload_max_filesize bytes (".round ($upload_max_filesize/1024/1024)." Mbytes) ");
435
+ echo ("directly from your browser to the server. Alternatively you can upload your dump files of any size via FTP.</p>\n");
436
+ ?>
437
+ <form method="POST" action="<?php echo ($_SERVER["PHP_SELF"]); ?>" enctype="multipart/form-data">
438
+ <input type="hidden" name="MAX_FILE_SIZE" value="$upload_max_filesize">
439
+ <p>Dump file: <input type="file" name="dumpfile" accept="*/*" size=60"></p>
440
+ <p><input type="submit" name="uploadbutton" value="Upload"></p>
441
+ </form>
442
+ <?php
443
+ }
444
+ }
445
+
446
+ // Print the current mySQL connection charset
447
+
448
+ if (!$error && !TESTMODE && !isset($_REQUEST["fn"]))
449
+ {
450
+ $result = mysql_query("SHOW VARIABLES LIKE 'character_set_connection';");
451
+ $row = mysql_fetch_assoc($result);
452
+ if ($row)
453
+ { $charset = $row['Value'];
454
+ echo ("<p>Note: The current mySQL connection charset is <i>$charset</i>. Your dump file must be encoded in <i>$charset</i> in order to avoid problems with non-latin characters. You can change the connection charset using the \$db_connection_charset variable in bigdump.php</p>\n");
455
+ }
456
+ }
457
+
458
+ // Open the file
459
+
460
+ if (!$error && isset($_REQUEST["start"]))
461
+ {
462
+
463
+ // Set current filename ($filename overrides $_REQUEST["fn"] if set)
464
+
465
+ if ($filename!="")
466
+ $curfilename=$filename;
467
+ else if (isset($_REQUEST["fn"]))
468
+ $curfilename=urldecode($_REQUEST["fn"]);
469
+ else
470
+ $curfilename="";
471
+
472
+ // Recognize GZip filename
473
+
474
+ if (preg_match("/\.gz$/i",$curfilename))
475
+ $gzipmode=true;
476
+ else
477
+ $gzipmode=false;
478
+
479
+ if ((!$gzipmode && !$file=@fopen($curfilename,"r")) || ($gzipmode && !$file=@gzopen($curfilename,"r")))
480
+ { echo ("<p class=\"error\">Can't open ".$curfilename." for import</p>\n");
481
+ echo ("<p>Please, check that your dump file name contains only alphanumerical characters, and rename it accordingly, for example: $curfilename.".
482
+ "<br>Or, specify \$filename in bigdump.php with the full filename. ".
483
+ "<br>Or, you have to upload the $curfilename to the server first.</p>\n");
484
+ $error=true;
485
+ }
486
+
487
+ // Get the file size (can't do it fast on gzipped files, no idea how)
488
+
489
+ else if ((!$gzipmode && @fseek($file, 0, SEEK_END)==0) || ($gzipmode && @gzseek($file, 0)==0))
490
+ { if (!$gzipmode) $filesize = ftell($file);
491
+ else $filesize = gztell($file); // Always zero, ignore
492
+ }
493
+ else
494
+ { echo ("<p class=\"error\">I can't seek into $curfilename</p>\n");
495
+ $error=true;
496
+ }
497
+ }
498
+
499
+ // Stop if csv file is used, but $csv_insert_table is not set
500
+
501
+ if (($csv_insert_table == "") && (preg_match("/(\.csv)$/i",$curfilename)))
502
+ { echo ("<p class=\"error\">You have to specify \$csv_insert_table when using a CSV file. </p>\n");
503
+ $error=true;
504
+ }
505
+
506
+
507
+ // *******************************************************************************************
508
+ // START IMPORT SESSION HERE
509
+ // *******************************************************************************************
510
+
511
+ if (!$error && isset($_REQUEST["start"]) && isset($_REQUEST["foffset"]) && preg_match("/(\.(sql|gz|csv))$/i",$curfilename))
512
+ {
513
+
514
+ // Check start and foffset are numeric values
515
+
516
+ if (!is_numeric($_REQUEST["start"]) || !is_numeric($_REQUEST["foffset"]))
517
+ { echo ("<p class=\"error\">UNEXPECTED: Non-numeric values for start and foffset</p>\n");
518
+ $error=true;
519
+ }
520
+ else
521
+ { $_REQUEST["start"] = floor($_REQUEST["start"]);
522
+ $_REQUEST["foffset"] = floor($_REQUEST["foffset"]);
523
+ }
524
+
525
+ // Set the current delimiter if defined
526
+
527
+ if (isset($_REQUEST["delimiter"]))
528
+ $delimiter = $_REQUEST["delimiter"];
529
+
530
+ // Empty CSV table if requested
531
+
532
+ if (!$error && $_REQUEST["start"]==1 && $csv_insert_table != "" && $csv_preempty_table)
533
+ {
534
+ $query = "DELETE FROM $csv_insert_table";
535
+ if (!TESTMODE && !mysql_query(trim($query), $dbconnection))
536
+ { echo ("<p class=\"error\">Error when deleting entries from $csv_insert_table.</p>\n");
537
+ echo ("<p>Query: ".trim(nl2br(htmlentities($query)))."</p>\n");
538
+ echo ("<p>MySQL: ".mysql_error()."</p>\n");
539
+ $error=true;
540
+ }
541
+ }
542
+
543
+ // Print start message
544
+
545
+ if (!$error)
546
+ { skin_open();
547
+ if (TESTMODE)
548
+ echo ("<p class=\"centr\">TEST MODE ENABLED</p>\n");
549
+ echo ("<p class=\"centr\">Processing file: <b>".$curfilename."</b></p>\n");
550
+ echo ("<p class=\"smlcentr\">Starting from line: ".$_REQUEST["start"]."</p>\n");
551
+ skin_close();
552
+ }
553
+
554
+ // Check $_REQUEST["foffset"] upon $filesize (can't do it on gzipped files)
555
+
556
+ if (!$error && !$gzipmode && $_REQUEST["foffset"]>$filesize)
557
+ { echo ("<p class=\"error\">UNEXPECTED: Can't set file pointer behind the end of file</p>\n");
558
+ $error=true;
559
+ }
560
+
561
+ // Set file pointer to $_REQUEST["foffset"]
562
+
563
+ if (!$error && ((!$gzipmode && fseek($file, $_REQUEST["foffset"])!=0) || ($gzipmode && gzseek($file, $_REQUEST["foffset"])!=0)))
564
+ { echo ("<p class=\"error\">UNEXPECTED: Can't set file pointer to offset: ".$_REQUEST["foffset"]."</p>\n");
565
+ $error=true;
566
+ }
567
+
568
+ // Start processing queries from $file
569
+
570
+ if (!$error)
571
+ { $query="";
572
+ $queries=0;
573
+ $totalqueries=$_REQUEST["totalqueries"];
574
+ $linenumber=$_REQUEST["start"];
575
+ $querylines=0;
576
+ $inparents=false;
577
+
578
+ // Stay processing as long as the $linespersession is not reached or the query is still incomplete
579
+
580
+ while ($linenumber<$_REQUEST["start"]+$linespersession || $query!="")
581
+ {
582
+
583
+ // Read the whole next line
584
+
585
+ $dumpline = "";
586
+ while (!feof($file) && substr ($dumpline, -1) != "\n" && substr ($dumpline, -1) != "\r")
587
+ { if (!$gzipmode)
588
+ $dumpline .= fgets($file, DATA_CHUNK_LENGTH);
589
+ else
590
+ $dumpline .= gzgets($file, DATA_CHUNK_LENGTH);
591
+ }
592
+ if ($dumpline==="") break;
593
+
594
+ // Remove UTF8 Byte Order Mark at the file beginning if any
595
+
596
+ if ($_REQUEST["foffset"]==0)
597
+ $dumpline=preg_replace('|^\xEF\xBB\xBF|','',$dumpline);
598
+
599
+ // Create an SQL query from CSV line
600
+
601
+ if (($csv_insert_table != "") && (preg_match("/(\.csv)$/i",$curfilename)))
602
+ {
603
+ if ($csv_add_slashes)
604
+ $dumpline = addslashes($dumpline);
605
+ $dumpline = explode($csv_delimiter,$dumpline);
606
+ if ($csv_add_quotes)
607
+ $dumpline = "'".implode("','",$dumpline)."'";
608
+ else
609
+ $dumpline = implode(",",$dumpline);
610
+ $dumpline = 'INSERT INTO '.$csv_insert_table.' VALUES ('.$dumpline.');';
611
+ }
612
+
613
+ // Handle DOS and Mac encoded linebreaks (I don't know if it really works on Win32 or Mac Servers)
614
+
615
+ $dumpline=str_replace("\r\n", "\n", $dumpline);
616
+ $dumpline=str_replace("\r", "\n", $dumpline);
617
+
618
+ // DIAGNOSTIC
619
+ // echo ("<p>Line $linenumber: $dumpline</p>\n");
620
+
621
+ // Recognize delimiter statement
622
+
623
+ if (!$inparents && strpos ($dumpline, "DELIMITER ") === 0)
624
+ $delimiter = str_replace ("DELIMITER ","",trim($dumpline));
625
+
626
+ // Skip comments and blank lines only if NOT in parents
627
+
628
+ if (!$inparents)
629
+ { $skipline=false;
630
+ reset($comment);
631
+ foreach ($comment as $comment_value)
632
+ {
633
+
634
+ // DIAGNOSTIC
635
+ // echo ($comment_value);
636
+ if (trim($dumpline)=="" || strpos (trim($dumpline), $comment_value) === 0)
637
+ { $skipline=true;
638
+ break;
639
+ }
640
+ }
641
+ if ($skipline)
642
+ { $linenumber++;
643
+
644
+ // DIAGNOSTIC
645
+ // echo ("<p>Comment line skipped</p>\n");
646
+
647
+ continue;
648
+ }
649
+ }
650
+
651
+ // Remove double back-slashes from the dumpline prior to count the quotes ('\\' can only be within strings)
652
+
653
+ $dumpline_deslashed = str_replace ("\\\\","",$dumpline);
654
+
655
+ // Count ' and \' (or " and \") in the dumpline to avoid query break within a text field ending by $delimiter
656
+
657
+ $parents=substr_count ($dumpline_deslashed, $string_quotes)-substr_count ($dumpline_deslashed, "\\$string_quotes");
658
+ if ($parents % 2 != 0)
659
+ $inparents=!$inparents;
660
+
661
+ // Add the line to query
662
+
663
+ $query .= $dumpline;
664
+
665
+ // Don't count the line if in parents (text fields may include unlimited linebreaks)
666
+
667
+ if (!$inparents)
668
+ $querylines++;
669
+
670
+ // Stop if query contains more lines as defined by MAX_QUERY_LINES
671
+
672
+ if ($querylines>MAX_QUERY_LINES)
673
+ {
674
+ echo ("<p class=\"error\">Stopped at the line $linenumber. </p>");
675
+ echo ("<p>At this place the current query includes more than ".MAX_QUERY_LINES." dump lines. That can happen if your dump file was ");
676
+ echo ("created by some tool which doesn't place a semicolon followed by a linebreak at the end of each query, or if your dump contains ");
677
+ echo ("extended inserts or very long procedure definitions. Please read the <a href=\"http://www.ozerov.de/bigdump/usage/\">BigDump usage notes</a> ");
678
+ echo ("for more infos. Ask for our support services ");
679
+ echo ("in order to handle dump files containing extended inserts.</p>\n");
680
+ $error=true;
681
+ break;
682
+ }
683
+
684
+ // Execute query if end of query detected ($delimiter as last character) AND NOT in parents
685
+
686
+ // DIAGNOSTIC
687
+ // echo ("<p>Regex: ".'/'.preg_quote($delimiter).'$/'."</p>\n");
688
+ // echo ("<p>In Parents: ".($inparents?"true":"false")."</p>\n");
689
+ // echo ("<p>Line: $dumpline</p>\n");
690
+
691
+ if (preg_match('/'.preg_quote($delimiter).'$/',trim($dumpline)) && !$inparents)
692
+ {
693
+
694
+ // Cut off delimiter of the end of the query
695
+
696
+ $query = substr(trim($query),0,-1*strlen($delimiter));
697
+
698
+ // DIAGNOSTIC
699
+ // echo ("<p>Query: ".trim(nl2br(htmlentities($query)))."</p>\n");
700
+
701
+ if (!TESTMODE && !mysql_query($query, $dbconnection))
702
+ { echo ("<p class=\"error\">Error at the line $linenumber: ". trim($dumpline)."</p>\n");
703
+ echo ("<p>Query: ".trim(nl2br(htmlentities($query)))."</p>\n");
704
+ echo ("<p>MySQL: ".mysql_error()."</p>\n");
705
+ $error=true;
706
+ break;
707
+ }
708
+ $totalqueries++;
709
+ $queries++;
710
+ $query="";
711
+ $querylines=0;
712
+ }
713
+ $linenumber++;
714
+ }
715
+ }
716
+
717
+ // Get the current file position
718
+
719
+ if (!$error)
720
+ { if (!$gzipmode)
721
+ $foffset = ftell($file);
722
+ else
723
+ $foffset = gztell($file);
724
+ if (!$foffset)
725
+ { echo ("<p class=\"error\">UNEXPECTED: Can't read the file pointer offset</p>\n");
726
+ $error=true;
727
+ }
728
+ }
729
+
730
+ // Print statistics
731
+
732
+ skin_open();
733
+
734
+ // echo ("<p class=\"centr\"><b>Statistics</b></p>\n");
735
+
736
+ if (!$error)
737
+ {
738
+ $lines_this = $linenumber-$_REQUEST["start"];
739
+ $lines_done = $linenumber-1;
740
+ $lines_togo = ' ? ';
741
+ $lines_tota = ' ? ';
742
+
743
+ $queries_this = $queries;
744
+ $queries_done = $totalqueries;
745
+ $queries_togo = ' ? ';
746
+ $queries_tota = ' ? ';
747
+
748
+ $bytes_this = $foffset-$_REQUEST["foffset"];
749
+ $bytes_done = $foffset;
750
+ $kbytes_this = round($bytes_this/1024,2);
751
+ $kbytes_done = round($bytes_done/1024,2);
752
+ $mbytes_this = round($kbytes_this/1024,2);
753
+ $mbytes_done = round($kbytes_done/1024,2);
754
+
755
+ if (!$gzipmode)
756
+ {
757
+ $bytes_togo = $filesize-$foffset;
758
+ $bytes_tota = $filesize;
759
+ $kbytes_togo = round($bytes_togo/1024,2);
760
+ $kbytes_tota = round($bytes_tota/1024,2);
761
+ $mbytes_togo = round($kbytes_togo/1024,2);
762
+ $mbytes_tota = round($kbytes_tota/1024,2);
763
+
764
+ $pct_this = ceil($bytes_this/$filesize*100);
765
+ $pct_done = ceil($foffset/$filesize*100);
766
+ $pct_togo = 100 - $pct_done;
767
+ $pct_tota = 100;
768
+
769
+ if ($bytes_togo==0)
770
+ { $lines_togo = '0';
771
+ $lines_tota = $linenumber-1;
772
+ $queries_togo = '0';
773
+ $queries_tota = $totalqueries;
774
+ }
775
+
776
+ $pct_bar = "<div style=\"height:15px;width:$pct_done%;background-color:#000080;margin:0px;\"></div>";
777
+ }
778
+ else
779
+ {
780
+ $bytes_togo = ' ? ';
781
+ $bytes_tota = ' ? ';
782
+ $kbytes_togo = ' ? ';
783
+ $kbytes_tota = ' ? ';
784
+ $mbytes_togo = ' ? ';
785
+ $mbytes_tota = ' ? ';
786
+
787
+ $pct_this = ' ? ';
788
+ $pct_done = ' ? ';
789
+ $pct_togo = ' ? ';
790
+ $pct_tota = 100;
791
+ $pct_bar = str_replace(' ','&nbsp;','<tt>[ Not available for gzipped files ]</tt>');
792
+ }
793
+
794
+ echo ("
795
+ <center>
796
+ <table width=\"520\" border=\"0\" cellpadding=\"3\" cellspacing=\"1\">
797
+ <tr><th class=\"bg4\"> </th><th class=\"bg4\">Session</th><th class=\"bg4\">Done</th><th class=\"bg4\">To go</th><th class=\"bg4\">Total</th></tr>
798
+ <tr><th class=\"bg4\">Lines</th><td class=\"bg3\">$lines_this</td><td class=\"bg3\">$lines_done</td><td class=\"bg3\">$lines_togo</td><td class=\"bg3\">$lines_tota</td></tr>
799
+ <tr><th class=\"bg4\">Queries</th><td class=\"bg3\">$queries_this</td><td class=\"bg3\">$queries_done</td><td class=\"bg3\">$queries_togo</td><td class=\"bg3\">$queries_tota</td></tr>
800
+ <tr><th class=\"bg4\">Bytes</th><td class=\"bg3\">$bytes_this</td><td class=\"bg3\">$bytes_done</td><td class=\"bg3\">$bytes_togo</td><td class=\"bg3\">$bytes_tota</td></tr>
801
+ <tr><th class=\"bg4\">KB</th><td class=\"bg3\">$kbytes_this</td><td class=\"bg3\">$kbytes_done</td><td class=\"bg3\">$kbytes_togo</td><td class=\"bg3\">$kbytes_tota</td></tr>
802
+ <tr><th class=\"bg4\">MB</th><td class=\"bg3\">$mbytes_this</td><td class=\"bg3\">$mbytes_done</td><td class=\"bg3\">$mbytes_togo</td><td class=\"bg3\">$mbytes_tota</td></tr>
803
+ <tr><th class=\"bg4\">%</th><td class=\"bg3\">$pct_this</td><td class=\"bg3\">$pct_done</td><td class=\"bg3\">$pct_togo</td><td class=\"bg3\">$pct_tota</td></tr>
804
+ <tr><th class=\"bg4\">% bar</th><td class=\"bgpctbar\" colspan=\"4\">$pct_bar</td></tr>
805
+ </table>
806
+ </center>
807
+ \n");
808
+
809
+ // Finish message and restart the script
810
+
811
+ if ($linenumber<$_REQUEST["start"]+$linespersession)
812
+ { echo ("<p class=\"successcentr\">Congratulations: End of file reached, assuming OK</p>\n");
813
+ echo ("<p class=\"successcentr\">IMPORTANT: REMOVE YOUR DUMP FILE and BIGDUMP SCRIPT FROM SERVER NOW!</p>\n");
814
+ echo ("<p class=\"centr\">Thank you for using this tool! Please rate <a href=\"http://www.hotscripts.com/listing/bigdump/?RID=403\" target=\"_blank\">Bigdump at Hotscripts.com</a></p>\n");
815
+ echo ("<p class=\"centr\">You can send me some bucks or euros as appreciation via PayPal. Thank you!</p>\n");
816
+ ?>
817
+
818
+ <!-- Start Paypal donation code -->
819
+ <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
820
+ <input type="hidden" name="cmd" value="_xclick" />
821
+ <input type="hidden" name="business" value="alexey@ozerov.de" />
822
+ <input type="hidden" name="item_name" value="BigDump Donation" />
823
+ <input type="hidden" name="no_shipping" value="1" />
824
+ <input type="hidden" name="no_note" value="0" />
825
+ <input type="hidden" name="tax" value="0" />
826
+ <input type="hidden" name="bn" value="PP-DonationsBF" />
827
+ <input type="hidden" name="lc" value="US" />
828
+ <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but04.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!" />
829
+ <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" />
830
+ </form>
831
+ <!-- End Paypal donation code -->
832
+
833
+ <?php
834
+
835
+ $error=true; // This is a semi-error telling the script is finished
836
+ }
837
+ else
838
+ { if ($delaypersession!=0)
839
+ echo ("<p class=\"centr\">Now I'm <b>waiting $delaypersession milliseconds</b> before starting next session...</p>\n");
840
+ if (!$ajax)
841
+ echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".$_SERVER["PHP_SELF"]."?start=$linenumber&fn=".urlencode($curfilename)."&foffset=$foffset&totalqueries=$totalqueries&delimiter=".urlencode($delimiter)."\";',500+$delaypersession);</script>\n");
842
+
843
+ echo ("<noscript>\n");
844
+ echo ("<p class=\"centr\"><a href=\"".$_SERVER["PHP_SELF"]."?start=$linenumber&amp;fn=".urlencode($curfilename)."&amp;foffset=$foffset&amp;totalqueries=$totalqueries&amp;delimiter=".urlencode($delimiter)."\">Continue from the line $linenumber</a> (Enable JavaScript to do it automatically)</p>\n");
845
+ echo ("</noscript>\n");
846
+
847
+ echo ("<p class=\"centr\">Press <b><a href=\"".$_SERVER["PHP_SELF"]."\">STOP</a></b> to abort the import <b>OR WAIT!</b></p>\n");
848
+ }
849
+ }
850
+ else
851
+ echo ("<p class=\"error\">Stopped on error</p>\n");
852
+
853
+ skin_close();
854
+
855
+ }
856
+
857
+ if ($error)
858
+ echo ("<p class=\"centr\"><a href=\"".$_SERVER["PHP_SELF"]."\">Start from the beginning</a> (DROP the old tables before restarting)</p>\n");
859
+
860
+ if ($dbconnection) mysql_close($dbconnection);
861
+ if ($file && !$gzipmode) fclose($file);
862
+ else if ($file && $gzipmode) gzclose($file);
863
+
864
+ ?>
865
+
866
+ <p class="centr">&copy; 2003-2011 <a href="mailto:alexey@ozerov.de">Alexey Ozerov</a></p>
867
+
868
+ </td></tr></table>
869
+
870
+ </center>
871
+
872
+ </body>
873
+ </html>
874
+
875
+ <?php
876
+
877
+ // If error or finished put out the whole output from above and stop
878
+
879
+ if ($error)
880
+ {
881
+ $out1 = ob_get_contents();
882
+ ob_end_clean();
883
+ echo $out1;
884
+ die;
885
+ }
886
+
887
+ // If Ajax enabled and in import progress creates responses (XML response or script for the initial page)
888
+
889
+ if ($ajax && isset($_REQUEST['start']))
890
+ {
891
+ if (isset($_REQUEST['ajaxrequest']))
892
+ { ob_end_clean();
893
+ create_xml_response();
894
+ die;
895
+ }
896
+ else
897
+ create_ajax_script();
898
+ }
899
+
900
+ // Anyway put out the output from above
901
+
902
+ ob_flush();
903
+
904
+ // THE MAIN SCRIPT ENDS HERE
905
+
906
+
907
+ // *******************************************************************************************
908
+ // AJAX utilities
909
+ // *******************************************************************************************
910
+
911
+ function create_xml_response()
912
+ {
913
+ global $linenumber, $foffset, $totalqueries, $curfilename, $delimiter,
914
+ $lines_this, $lines_done, $lines_togo, $lines_tota,
915
+ $queries_this, $queries_done, $queries_togo, $queries_tota,
916
+ $bytes_this, $bytes_done, $bytes_togo, $bytes_tota,
917
+ $kbytes_this, $kbytes_done, $kbytes_togo, $kbytes_tota,
918
+ $mbytes_this, $mbytes_done, $mbytes_togo, $mbytes_tota,
919
+ $pct_this, $pct_done, $pct_togo, $pct_tota,$pct_bar;
920
+
921
+ header('Content-Type: application/xml');
922
+ header('Cache-Control: no-cache');
923
+
924
+ echo '<?xml version="1.0" encoding="ISO-8859-1"?>';
925
+ echo "<root>";
926
+
927
+ // data - for calculations
928
+
929
+ echo "<linenumber>$linenumber</linenumber>";
930
+ echo "<foffset>$foffset</foffset>";
931
+ echo "<fn>$curfilename</fn>";
932
+ echo "<totalqueries>$totalqueries</totalqueries>";
933
+ echo "<delimiter>$delimiter</delimiter>";
934
+
935
+ // results - for page update
936
+
937
+ echo "<elem1>$lines_this</elem1>";
938
+ echo "<elem2>$lines_done</elem2>";
939
+ echo "<elem3>$lines_togo</elem3>";
940
+ echo "<elem4>$lines_tota</elem4>";
941
+
942
+ echo "<elem5>$queries_this</elem5>";
943
+ echo "<elem6>$queries_done</elem6>";
944
+ echo "<elem7>$queries_togo</elem7>";
945
+ echo "<elem8>$queries_tota</elem8>";
946
+
947
+ echo "<elem9>$bytes_this</elem9>";
948
+ echo "<elem10>$bytes_done</elem10>";
949
+ echo "<elem11>$bytes_togo</elem11>";
950
+ echo "<elem12>$bytes_tota</elem12>";
951
+
952
+ echo "<elem13>$kbytes_this</elem13>";
953
+ echo "<elem14>$kbytes_done</elem14>";
954
+ echo "<elem15>$kbytes_togo</elem15>";
955
+ echo "<elem16>$kbytes_tota</elem16>";
956
+
957
+ echo "<elem17>$mbytes_this</elem17>";
958
+ echo "<elem18>$mbytes_done</elem18>";
959
+ echo "<elem19>$mbytes_togo</elem19>";
960
+ echo "<elem20>$mbytes_tota</elem20>";
961
+
962
+ echo "<elem21>$pct_this</elem21>";
963
+ echo "<elem22>$pct_done</elem22>";
964
+ echo "<elem23>$pct_togo</elem23>";
965
+ echo "<elem24>$pct_tota</elem24>";
966
+ echo "<elem_bar>".htmlentities($pct_bar)."</elem_bar>";
967
+
968
+ echo "</root>";
969
+ }
970
+
971
+
972
+ function create_ajax_script()
973
+ {
974
+ global $linenumber, $foffset, $totalqueries, $delaypersession, $curfilename, $delimiter;
975
+ ?>
976
+
977
+ <script type="text/javascript" language="javascript">
978
+
979
+ // creates next action url (upload page, or XML response)
980
+ function get_url(linenumber,fn,foffset,totalqueries,delimiter) {
981
+ return "<?php echo $_SERVER['PHP_SELF'] ?>?start="+linenumber+"&fn="+fn+"&foffset="+foffset+"&totalqueries="+totalqueries+"&delimiter="+delimiter+"&ajaxrequest=true";
982
+ }
983
+
984
+ // extracts text from XML element (itemname must be unique)
985
+ function get_xml_data(itemname,xmld) {
986
+ return xmld.getElementsByTagName(itemname).item(0).firstChild.data;
987
+ }
988
+
989
+ function makeRequest(url) {
990
+ http_request = false;
991
+ if (window.XMLHttpRequest) {
992
+ // Mozilla etc.
993
+ http_request = new XMLHttpRequest();
994
+ if (http_request.overrideMimeType) {
995
+ http_request.overrideMimeType("text/xml");
996
+ }
997
+ } else if (window.ActiveXObject) {
998
+ // IE
999
+ try {
1000
+ http_request = new ActiveXObject("Msxml2.XMLHTTP");
1001
+ } catch(e) {
1002
+ try {
1003
+ http_request = new ActiveXObject("Microsoft.XMLHTTP");
1004
+ } catch(e) {}
1005
+ }
1006
+ }
1007
+ if (!http_request) {
1008
+ alert("Cannot create an XMLHTTP instance");
1009
+ return false;
1010
+ }
1011
+ http_request.onreadystatechange = server_response;
1012
+ http_request.open("GET", url, true);
1013
+ http_request.send(null);
1014
+ }
1015
+
1016
+ function server_response()
1017
+ {
1018
+
1019
+ // waiting for correct response
1020
+ if (http_request.readyState != 4)
1021
+ return;
1022
+
1023
+ if (http_request.status != 200)
1024
+ {
1025
+ alert("Page unavailable, or wrong url!")
1026
+ return;
1027
+ }
1028
+
1029
+ // r = xml response
1030
+ var r = http_request.responseXML;
1031
+
1032
+ //if received not XML but HTML with new page to show
1033
+ if (!r || r.getElementsByTagName('root').length == 0)
1034
+ { var text = http_request.responseText;
1035
+ document.open();
1036
+ document.write(text);
1037
+ document.close();
1038
+ return;
1039
+ }
1040
+
1041
+ // update "Starting from line: "
1042
+ document.getElementsByTagName('p').item(1).innerHTML =
1043
+ "Starting from line: " +
1044
+ r.getElementsByTagName('linenumber').item(0).firstChild.nodeValue;
1045
+
1046
+ // update table with new values
1047
+ for(i = 1; i <= 24; i++)
1048
+ document.getElementsByTagName('td').item(i).firstChild.data = get_xml_data('elem'+i,r);
1049
+
1050
+ // update color bar
1051
+ document.getElementsByTagName('td').item(25).innerHTML =
1052
+ r.getElementsByTagName('elem_bar').item(0).firstChild.nodeValue;
1053
+
1054
+ // action url (XML response)
1055
+ url_request = get_url(
1056
+ get_xml_data('linenumber',r),
1057
+ get_xml_data('fn',r),
1058
+ get_xml_data('foffset',r),
1059
+ get_xml_data('totalqueries',r),
1060
+ get_xml_data('delimiter',r));
1061
+
1062
+ // ask for XML response
1063
+ window.setTimeout("makeRequest(url_request)",500+<?php echo $delaypersession; ?>);
1064
+ }
1065
+
1066
+ // First Ajax request from initial page
1067
+
1068
+ var http_request = false;
1069
+ var url_request = get_url(<?php echo ($linenumber.',"'.urlencode($curfilename).'",'.$foffset.','.$totalqueries.',"'.urlencode($delimiter).'"') ;?>);
1070
+ window.setTimeout("makeRequest(url_request)",500+<?php echo $delaypersession; ?>);
1071
+ </script>
1072
+
1073
+ <?php
1074
+ }
1075
+
1076
+ ?>