root/dev/install/install_step4.php

Revision 473, 10.1 KB (checked in by kovell, 11 years ago)

Add transactions to installation to speed up InnoDB. Transaction log is written after each transaction instead of each insert. Warnings are reduced to help installation with overly strict error reporting.

Line 
1<?php
2if(!$installrunning) {header('Location: index.php');die();}
3if (file_exists('../config.php'))
4{
5        echo 'Redirecting you to the Update page, please wait.<br/>';
6        echo '<meta http-equiv="refresh" content="1; URL=?step=40&action=drop" />';
7        return;
8}
9
10$stoppage = true;
11include('../common/includes/php_compat.php');
12include('../common/includes/class.xml.php');
13
14echo 'Reading packages...';
15$xml = new sxml();
16$kb = $xml->parse(file_get_contents('../packages/database/contents.xml'));
17
18$struct = $opt = $data = array();
19$structc = $dcnt = $optcnt = $datacnt = 0;
20$tables = array();
21foreach($kb['kb3']['table'] as $idx => $tbl)
22{
23        $table = $tbl['name'];
24        $files = array();
25        $dir = opendir('../packages/database/'.$table);
26
27        $xml = new sxml();
28        $st = $xml->parse(file_get_contents('../packages/database/'.$table.'/table.xml'));
29        $struct[$table] = $st['kb3']['structure'];
30        $kb['kb3']['table'][$idx]['rows'] = $st['kb3']['rows'];
31        $structc++;
32
33        while ($file = readdir($dir))
34        {
35                if ($file == '.' || $file == '..' || $file == '.svn')
36                {
37                        continue;
38                }
39                if (strpos($file, '_opt_'))
40                {
41                        $dcnt++;
42                        $optcnt++;
43                        $opt[$table][] = '../packages/database/'.$table.'/'.$file;
44                        asort($opt[$table]);
45                }
46                elseif (!strpos($file, 'xml'))
47                {
48                        $dcnt++;
49                        $datacnt++;
50                        $data[$table][] = '../packages/database/'.$table.'/'.$file;
51                        asort($data[$table]);
52                }
53        }
54}
55
56$db = mysql_connect($_SESSION['sql']['host'], $_SESSION['sql']['user'], $_SESSION['sql']['pass']);
57mysql_select_db($_SESSION['sql']['db']);
58$result = mysql_query('show tables');
59while ($row = mysql_fetch_row($result))
60{
61        $table = $row[0];
62        unset($struct[$table]);
63}
64
65if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'struct')
66{
67        foreach ($struct as $table => $structure)
68        {
69                echo 'Creating table '.$table.'...';
70                $query = $struct[$table];
71                if ($_SESSION['sql']['engine'] == "InnoDB")
72                {
73                        $query = preg_replace('/MyISAM/', 'InnoDB', $query);
74                }
75                #echo $query;
76                $id = mysql_query($query);
77                if ($id)
78                {
79                        echo 'done<br/>';
80                }
81                else
82                {
83                        echo 'error: '.mysql_error().'<br/>';
84                }
85                unset($struct[$table]);
86        }
87}
88if (!empty($_REQUEST['do']) && $_REQUEST['do'] == 'reset')
89{
90        unset($_SESSION['sqlinsert']);
91        unset($_SESSION['doopt']);
92}
93
94if (!empty($_REQUEST['sub']) && $_REQUEST['sub'] == 'data')
95{
96        if (!isset($_SESSION['sqlinsert']))
97        {
98                $_SESSION['sqlinsert'] = 1;
99                if (isset($_POST['opt']))
100                {
101                        $_SESSION['useopt'] = array();
102                        foreach ($_POST['opt'] as $table => $value)
103                        {
104                                $_SESSION['useopt'][] = $table;
105                        }
106                }
107        }
108
109        $i = 0;
110        $did = false;
111        $errors = false;
112        if (!isset($_SESSION['doopt']))
113        {
114                foreach ($data as $table => $files)
115                {
116                        foreach ($files as $file)
117                        {
118                                $i++;
119                                if ($_SESSION['sqlinsert'] > $i)
120                                {
121                                        continue;
122                                }
123                                echo 'Inserting data ('.$i.'/'.$datacnt.') into '.$table.'<br/> using file '.$file.'...<br/>';
124
125                                $error = '';
126                                $fp = gzopen($file, 'r');
127                                $lines = 0;
128                                $errors = 0;
129                                $text = '';
130                                $query_count = 0;
131                                mysql_query("START TRANSACTION");
132                                while ($query = gzgets($fp, 4000))
133                                {
134                                        $text .= $query;
135                                        if (substr(trim($query), -1, 1) != ';')
136                                        {
137                                                continue;
138                                        }
139                                        $query = $text;
140                                        $text = '';
141                                        $lines++;
142                                        if (trim($query))
143                                        {
144                                                $query = trim($query);
145                                                if (substr($query, -1, 1) == ';')
146                                                {
147                                                        $query = substr($query, 0, -1);
148                                                }
149                                                if (strpos($query, 'TRUNCATE') !== FALSE)
150                                                {
151                                                        mysql_query("COMMIT");
152                                                }
153                                                $query_count++;
154                                                $id = mysql_query($query);
155                                                if (strpos($query, 'TRUNCATE') !== FALSE)
156                                                {
157                                                        mysql_query("START TRANSACTION");
158                                                }
159                                                #echo $query;
160                                                if (!$id)
161                                                {
162                                                        $error .= 'error: '.mysql_error().'<br/>';
163                                                        $errors++;
164                                                }
165                                        }
166                                }
167                                mysql_query("COMMIT");
168                                echo '<br/>File '.$file.' had '.$lines.' lines with '.$query_count.' queries.<br/> '.$errors.' Queries failed.<br/>';
169                                if (!$error)
170                                {
171                                        echo '<br/>Finished importing of this file.<br/>';
172                                        echo '<meta http-equiv="refresh" content="1; URL=?step=4&sub=data" />';
173                                        echo 'Automatic reload in 1s for next chunk. <a href="?step=4&sub=data">Manual Link</a><br/>';
174                                }
175                                else
176                                {
177                                        echo $error;
178                                        echo '<meta http-equiv="refresh" content="20; URL=?step=4&sub=data" />';
179                                        echo 'Automatic reload in 20s for next chunk because an error occurred. <a href="?step=4&sub=data">Manual Link</a><br/>';
180                                }
181                                $_SESSION['sqlinsert']++;
182
183                                $did = true;
184                                break 2;
185                        }
186                }
187        }
188
189        if (isset($_SESSION['useopt']) && !$did)
190        {
191                $i = 0;
192                if (!isset($_SESSION['doopt']))
193                {
194                        $_SESSION['doopt'] = true;
195                        $_SESSION['sqlinsert'] = 1;
196                }
197                $optsel = 0;
198                foreach ($opt as $table => $files)
199                {
200                        if (!in_array($table, $_SESSION['useopt']))
201                        {
202                                continue;
203                        }
204                        foreach ($files as $file)
205                        {
206                                $optsel++;
207                        }
208                }
209                foreach ($opt as $table => $files)
210                {
211                        if (!in_array($table, $_SESSION['useopt']))
212                        {
213                                continue;
214                        }
215                        foreach ($files as $file)
216                        {
217                                $i++;
218                                if ($_SESSION['sqlinsert'] > $i)
219                                {
220                                        continue;
221                                }
222                                echo '<br/>Inserting optional data ('.$i.'/'.$optsel.') into '.$table.'<br/> using file '.$file.'...';
223                                $fp = gzopen($file, 'r');
224                                $text = '';
225                                mysql_query("START TRANSACTION");
226                                while ($query = gzgets($fp, 4000))
227                                {
228                                        $text .= $query;
229                                        if (substr(trim($query), -1, 1) != ';')
230                                        {
231                                                continue;
232                                        }
233                                        $query = $text;
234                                        $text = '';
235                                        $query = trim($query);
236                                        if ($query)
237                                        {
238                                                if (substr($query, -1, 1) == ';')
239                                                {
240                                                        $query = substr($query, 0, -1);
241                                                }
242                                                if (strpos($query, 'TRUNCATE') !== FALSE)
243                                                {
244                                                        mysql_query("COMMIT");
245                                                }
246                                                $id = mysql_query($query);
247                                                if (strpos($query, 'TRUNCATE') !== FALSE)
248                                                {
249                                                        mysql_query("START TRANSACTION");
250                                                }
251                                        #echo $query;
252                                        }
253                                }
254                                mysql_query("COMMIT");
255                                if ($id)
256                                {
257                                        echo 'done<br/>';
258                                }
259                                else
260                                {
261                                        echo 'error: '.mysql_error().'<br/>';
262                                }
263                                $_SESSION['sqlinsert']++;
264                                echo '<meta http-equiv="refresh" content="1; URL=?step=4&sub=data" />';
265                                echo 'Automatic reload in 1s for next chunk. <a href="?step=4&sub=data">Manual Reload</a><br/>';
266                                $did = true;
267                                break 2;
268                        }
269                }
270        }
271        if (!$did)
272        {
273                $stoppage = false;
274                $failed = 0;
275                echo 'All tables imported. Checking tables for correct data...<br/>';
276                foreach ($kb['kb3']['table'] as $line)
277                {
278                        $table = $line['name'];
279                        $count = $line['rows'];
280                        echo 'Checking table '.$table.': ';
281                        $result = mysql_query('SELECT count(*) as cnt FROM '.$table);
282                        $test = mysql_fetch_array($result);
283                        if ($test['cnt'] != $count && $count != 0)
284                        {
285                                echo $test['cnt'].'/'.$count.' - <font color="red"><b>FAILED</b></font>';
286                                $failed++;
287                        }
288                        else
289                        {
290                                echo $test['cnt'].'/'.$count.' - <font color="green"><b>PASSED</b></font>';
291                        }
292                        echo '<br/>';
293                }
294                if ($stoppage)
295                {
296                        echo 'There has been an error with one of the tables, please <a href="?step=4&do=reset">Reset</a> and try again.<br/>';
297                }
298                else
299                {
300                        echo '<br/>All tables passed.<br/>';
301                        echo 'You can now create or search your corporation/alliance: <a href="?step=5">Next Step</a><br/>';
302                }
303        }
304        echo '<br/>Use <a href="?step=4&sub=datasel&do=reset">Reset</a> to step back to the sql-opt select.<br/>';
305}
306?>
307<div class="block-header2">MySQL Data Import</div>
308Found <?php echo $structc; ?> table structures and <?php echo $dcnt; ?> data files for <?php echo count($opt)+count($data); ?> tables.<br/>
309<?php
310
311$structadd = 0;
312$failed = 0;
313foreach ($struct as $table => $file)
314{
315        echo 'Table struct has to be added: '.$table.'<br/>';
316        $structadd++;
317}
318if (!$structadd && (empty($_REQUEST['sub']) || ($_REQUEST['sub'] != 'datasel' && $_REQUEST['sub'] != 'data')))
319//if (!$structadd && $_REQUEST['sub'] != 'datasel' && $_REQUEST['sub'] != 'data')
320{
321        echo 'All table structures seem to be in the database.<br/>';
322        #    echo 'I will now check some table structures in case you are upgrading from a previous version... ';
323        #    include('install_step4_tblchk.php');
324        echo 'Please continue with <a href="?step=4&sub=datasel">Importing Data</a><br/>';
325
326        echo '<br/><br/>If you have aborted the install and you already have the data in those tables, you can bypass the import now with <a href="?step=5">this link</a><br/>';
327        echo 'To be sure, I will check some table data for you now:<br/><br/>';
328        foreach ($kb['kb3']['table'] as $line)
329        {
330                $table = $line['name'];
331                $count = $line['rows'];
332                echo 'Checking table '.$table.': ';
333                $result = mysql_query('SELECT count(*) as cnt FROM '.$table);
334                $test = mysql_fetch_array($result);
335
336                if ($test['cnt'] != $count && $count != 0)
337                {
338                        echo $test['cnt'].'/'.$count.' - <font color="red"><b>FAILED</b></font>';
339                        $failed++;
340                }
341                else
342                {
343                        echo $test['cnt'].'/'.$count.' - <font color="green"><b>PASSED</b></font>';
344                }
345                echo '<br/>';
346        }
347        if ($failed == 0)
348        {
349                echo '<br/>All important table data seems to be there. You are safe to bypass the import.<br/>';
350        }
351        else
352        {
353                echo '<br/>There was an error in one of the important tables. Please run the import.<br/>';
354        }
355}
356elseif ($structadd)
357{
358        echo 'Some table structures have to be added. Please continue with <a href="?step=4&sub=struct">Creating Tables</a><br/>';
359}
360
361if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'datasel')
362{
363?>
364<p>Please select optional SQL data to be inserted into the database:<br/></p>
365<form id="options" name="options" method="post" action="?step=4">
366<input type="hidden" name="step" value="4">
367<input type="hidden" name="sub" value="data">
368<table class="kb-subtable">
369<?php
370    foreach ($opt as $table => $files)
371    {
372?>
373<tr><td width="120"><b><?php echo $table; ?></b></td><td><input type="checkbox" name="opt[<?php echo $table; ?>]"></td></tr>
374<?php
375    }
376    ?>
377<tr><td width="120"></td><td><input type=submit name=submit value="Ok"></td></tr>
378</table>
379<?php
380}
381?>
382<?php if ($stoppage)
383{
384    return;
385}?>
386<p><a href="?step=<?php echo ($_SESSION['state']+1); ?>">Next Step</a></p>
Note: See TracBrowser for help on using the browser.