source: forum/install_fdsflsdhflůsdjld/upgrade.php@ 5

Last change on this file since 5 was 5, checked in by george, 18 years ago

import

File size: 56.1 KB
Line 
1<?php
2/***************************************************************************
3* upgrade.php
4* -------------------
5* begin : Wed Sep 05 2001
6* copyright : (C) 2001 The phpBB Group
7* email : support@phpbb.com
8*
9* $Id: upgrade.php,v 1.1.2.10 2003/03/18 23:24:01 acydburn Exp $
10*
11****************************************************************************/
12
13/***************************************************************************
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 ***************************************************************************/
21
22define('IN_PHPBB', true);
23
24$phpbb_root_path = './../';
25
26if ( !defined('INSTALLING') )
27{
28 error_reporting (E_ERROR | E_WARNING | E_PARSE); // This will NOT report uninitialized variables
29 set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
30
31 //
32 // If we are being called from the install script then we don't need these
33 // as they are already included.
34 //
35 include($phpbb_root_path . 'extension.inc');
36 include($phpbb_root_path . 'config.'.$phpEx);
37 include($phpbb_root_path . 'includes/constants.'.$phpEx);
38 include($phpbb_root_path . 'includes/functions.'.$phpEx);
39
40 if( defined("PHPBB_INSTALLED") )
41 {
42 redirect("../index.$phpEx");
43 }
44}
45
46//
47// Force the DB type to be MySQL
48//
49$dbms = 'mysql';
50
51include($phpbb_root_path . 'includes/db.'.$phpEx);
52include($phpbb_root_path . 'includes/bbcode.'.$phpEx);
53include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
54
55set_time_limit(0); // Unlimited execution time
56
57$months = array(
58 'Jan' => 1,
59 'Feb' => 2,
60 'Mar' => 3,
61 'Apr' => 4,
62 'May' => 5,
63 'Jun' => 6,
64 'Jul' => 7,
65 'Aug' => 8,
66 'Sep' => 9,
67 'Sept' => 9,
68 'Oct' => 10,
69 'Nov' => 11,
70 'Dec' => 12
71);
72
73// ---------------
74// Begin functions
75//
76function common_header()
77{
78?>
79<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
80<html>
81<head>
82<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
83<meta http-equiv="Content-Style-Type" content="text/css">
84<style type="text/css">
85<!--
86/* Specifiy background images for selected styles
87 This can't be done within the external style sheet as NS4 sees image paths relative to
88 the page which called the style sheet (i.e. this page in the root phpBB directory)
89 whereas all other browsers see image paths relative to the style sheet. Stupid NS again!
90*/
91th { background-image: url('../templates/subSilver/images/cellpic3.gif') }
92td.cat { background-image: url('../templates/subSilver/images/cellpic1.gif') }
93td.rowpic { background-image: url('../templates/subSilver/images/cellpic2.jpg'); background-repeat: repeat-y }
94td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom { background-image: url('../templates/subSilver/images/cellpic1.gif') }
95
96font,th,td,p,body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11pt }
97a:link,a:active,a:visited { font-family: Verdana, Arial, Helvetica, sans-serif; color : #006699; font-size:11pt }
98a:hover { font-family: Verdana, Arial, Helvetica, sans-serif; text-decoration: underline; color : #DD6900; font-size:11pt }
99hr { height: 0px; border: solid #D1D7DC 0px; border-top-width: 1px;}
100
101.maintitle,h1,h2 {font-weight: bold; font-size: 22px; font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif; text-decoration: none; line-height : 120%; color : #000000;}
102
103.ok {color:green}
104
105/* Import the fancy styles for IE only (NS4.x doesn't use the @import function) */
106@import url("../templates/subSilver/formIE.css");
107-->
108</style>
109</head>
110<body bgcolor="#FFFFFF" text="#000000" link="#006699" vlink="#5584AA">
111
112<table width="100%" border="0" cellspacing="0" cellpadding="10" align="center">
113 <tr>
114 <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
115 <tr>
116 <td><img src="../templates/subSilver/images/logo_phpBB.gif" border="0" alt="Forum Home" vspace="1" /></td>
117 <td align="center" width="100%" valign="middle"><span class="maintitle">Upgrading to phpBB 2.0</span></td>
118 </tr>
119 </table></td>
120 </tr>
121</table>
122
123<br clear="all" />
124
125<?
126 return;
127}
128
129function common_footer()
130{
131?>
132
133<br clear="all" />
134
135</body>
136</html>
137<?
138 return;
139}
140
141function query($sql, $errormsg)
142{
143 global $db;
144
145 if ( !($result = $db->sql_query($sql)) )
146 {
147 print "<br><font color=\"red\">\n";
148 print "$errormsg<br>";
149
150 $sql_error = $db->sql_error();
151 print $sql_error['code'] .": ". $sql_error['message']. "<br>\n";
152
153 print "<pre>$sql</pre>";
154 print "</font>\n";
155
156 return FALSE;
157 }
158 else
159 {
160 return $result;
161 }
162}
163
164function smiley_replace($text = '')
165{
166 global $db;
167
168 static $search, $replace;
169
170 // Did we get the smiley info in a previous call?
171 if ( !is_array($search) )
172 {
173 $sql = "SELECT code, smile_url
174 FROM smiles";
175 $result = query($sql, "Unable to get list of smilies from the DB");
176
177 $smilies = $db->sql_fetchrowset($result);
178 @usort($smilies, 'smiley_sort');
179
180 $search = array();
181 $replace = array();
182 for($i = 0; $i < count($smilies); $i++)
183 {
184 $search[] = '/<IMG SRC=".*?\/' . phpbb_preg_quote($smilies[$i]['smile_url'], '/') .'">/i';
185 $replace[] = $smilies[$i]['code'];
186 }
187 }
188
189 return ( $text != '' ) ? preg_replace($search, $replace, $text) : '';
190
191}
192
193function get_schema()
194{
195 global $table_prefix;
196
197 $schemafile = file('schemas/mysql_schema.sql');
198 $tabledata = 0;
199
200 for($i=0; $i < count($schemafile); $i++)
201 {
202 $line = $schemafile[$i];
203
204 if ( preg_match('/^CREATE TABLE (\w+)/i', $line, $matches) )
205 {
206 // Start of a new table definition, set some variables and go to the next line.
207 $tabledata = 1;
208 // Replace the 'phpbb_' prefix by the user defined prefix.
209 $table = str_replace('phpbb_', $table_prefix, $matches[1]);
210 $table_def[$table] = "CREATE TABLE $table (\n";
211 continue;
212 }
213
214 if ( preg_match('/^\);/', $line) )
215 {
216 // End of the table definition
217 // After this we will skip everything until the next 'CREATE' line
218 $tabledata = 0;
219 $table_def[$table] .= ')'; // We don't need the closing semicolon
220 }
221
222 if ( $tabledata == 1 )
223 {
224 // We are inside a table definition, parse this line.
225 // Add the current line to the complete table definition:
226 $table_def[$table] .= $line;
227 if ( preg_match('/^\s*(\w+)\s+(\w+)\(([\d,]+)\)(.*)$/', $line, $matches) )
228 {
229 // This is a column definition
230 $field = $matches[1];
231 $type = $matches[2];
232 $size = $matches[3];
233
234 preg_match('/DEFAULT (NULL|\'.*?\')[,\s](.*)$/i', $matches[4], $match);
235 $default = $match[1];
236
237 $notnull = ( preg_match('/NOT NULL/i', $matches[4]) ) ? 1 : 0;
238 $auto_increment = ( preg_match('/auto_increment/i', $matches[4]) ) ? 1 : 0;
239
240 $field_def[$table][$field] = array(
241 'type' => $type,
242 'size' => $size,
243 'default' => $default,
244 'notnull' => $notnull,
245 'auto_increment' => $auto_increment
246 );
247 }
248
249 if ( preg_match('/\s*PRIMARY\s+KEY\s*\((.*)\).*/', $line, $matches) )
250 {
251 // Primary key
252 $key_def[$table]['PRIMARY'] = $matches[1];
253 }
254 else if ( preg_match('/\s*KEY\s+(\w+)\s*\((.*)\)/', $line, $matches) )
255 {
256 // Normal key
257 $key_def[$table][$matches[1]] = $matches[2];
258 }
259 else if ( preg_match('/^\s*(\w+)\s*(.*?),?\s*$/', $line, $matches) )
260 {
261 // Column definition
262 $create_def[$table][$matches[1]] = $matches[2];
263 }
264 else
265 {
266 // It's a bird! It's a plane! It's something we didn't expect ;(
267 }
268 }
269 }
270
271 $schema['field_def'] = $field_def;
272 $schema['table_def'] = $table_def;
273 $schema['create_def'] = $create_def;
274 $schema['key_def'] = $key_def;
275
276 return $schema;
277}
278
279function get_inserts()
280{
281 global $table_prefix;
282
283 $insertfile = file('schemas/mysql_basic.sql');
284
285 for($i = 0; $i < count($insertfile); $i++)
286 {
287 if ( preg_match('/(INSERT INTO (\w+)\s.*);/i', str_replace('phpbb_', $table_prefix, $insertfile[$i]), $matches) )
288 {
289 $returnvalue[$matches[2]][] = $matches[1];
290 }
291 }
292
293 return $returnvalue;
294}
295
296function lock_tables($state, $tables= '')
297{
298 if ( $state == 1 )
299 {
300 if ( is_array($tables) )
301 {
302 $tables = join(' WRITE, ', $tables);
303 }
304
305 query("LOCK TABLES $tables WRITE", "Couldn't do: $sql");
306 }
307 else
308 {
309 query("UNLOCK TABLES", "Couldn't unlock all tables");
310 }
311}
312
313function output_table_content($content)
314{
315 echo $content . "\n";
316
317 return;
318}
319
320//
321// Nathan's bbcode2 conversion routines
322//
323function bbdecode($message)
324{
325 // Undo [code]
326 $code_start_html = '<!-- BBCode Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Code:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><PRE>';
327 $code_end_html = '</PRE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode End -->';
328 $message = str_replace($code_start_html, '[code]', $message);
329 $message = str_replace($code_end_html, '[/code]', $message);
330
331 // Undo [quote]
332 $quote_start_html = '<!-- BBCode Quote Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Quote:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>';
333 $quote_end_html = '</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode Quote End -->';
334 $message = str_replace($quote_start_html, '[quote]', $message);
335 $message = str_replace($quote_end_html, '[/quote]', $message);
336
337 // Undo [b] and [i]
338 $message = preg_replace("#<!-- BBCode Start --><B>(.*?)</B><!-- BBCode End -->#s", "[b]\\1[/b]", $message);
339 $message = preg_replace("#<!-- BBCode Start --><I>(.*?)</I><!-- BBCode End -->#s", "[i]\\1[/i]", $message);
340
341 // Undo [url] (long form)
342 $message = preg_replace("#<!-- BBCode u2 Start --><A HREF=\"([a-z]+?://)(.*?)\" TARGET=\"_blank\">(.*?)</A><!-- BBCode u2 End -->#s", "[url=\\1\\2]\\3[/url]", $message);
343
344 // Undo [url] (short form)
345 $message = preg_replace("#<!-- BBCode u1 Start --><A HREF=\"([a-z]+?://)(.*?)\" TARGET=\"_blank\">(.*?)</A><!-- BBCode u1 End -->#s", "[url]\\3[/url]", $message);
346
347 // Undo [email]
348 $message = preg_replace("#<!-- BBCode Start --><A HREF=\"mailto:(.*?)\">(.*?)</A><!-- BBCode End -->#s", "[email]\\1[/email]", $message);
349
350 // Undo [img]
351 $message = preg_replace("#<!-- BBCode Start --><IMG SRC=\"(.*?)\" BORDER=\"0\"><!-- BBCode End -->#s", "[img]\\1[/img]", $message);
352
353 // Undo lists (unordered/ordered)
354
355 // <li> tags:
356 $message = str_replace('<!-- BBCode --><LI>', '[*]', $message);
357
358 // [list] tags:
359 $message = str_replace('<!-- BBCode ulist Start --><UL>', '[list]', $message);
360
361 // [list=x] tags:
362 $message = preg_replace('#<!-- BBCode olist Start --><OL TYPE=([A1])>#si', "[list=\\1]", $message);
363
364 // [/list] tags:
365 $message = str_replace('</UL><!-- BBCode ulist End -->', '[/list]', $message);
366 $message = str_replace('</OL><!-- BBCode olist End -->', '[/list]', $message);
367
368 return $message;
369}
370
371//
372// Alternative for in_array() which is only available in PHP4
373//
374function inarray($needle, $haystack)
375{
376 for( $i = 0 ; $i < sizeof($haystack) ; $i++ )
377 {
378 if ( $haystack[$i] == $needle )
379 {
380 return true;
381 }
382 }
383
384 return false;
385}
386
387function end_step($next)
388{
389 print "<hr /><a href=\"$PHP_SELF?next=$next\">Next step: <b>$next</b></a><br /><br />\n";
390 exit;
391}
392//
393// End functions
394// -------------
395
396
397//
398// Start at the beginning if the user hasn't specified a specific starting point.
399//
400$next = ( isset($HTTP_GET_VARS['next']) ) ? $HTTP_GET_VARS['next'] : 'start';
401
402// If debug is set we'll do all steps in one go.
403$debug = 1;
404
405// Parse the MySQL schema file into some arrays.
406$schema = get_schema();
407
408$table_def = $schema['table_def'];
409$field_def = $schema['field_def'];
410$key_def = $schema['key_def'];
411$create_def = $schema['create_def'];
412
413//
414// Get mysql_basic data
415//
416$inserts = get_inserts();
417
418//
419// Get smiley data
420//
421smiley_replace();
422
423common_header();
424
425if ( !empty($next) )
426{
427 switch($next)
428 {
429 case 'start':
430 end_step('initial_drops');
431
432 case 'initial_drops':
433 print " * Dropping sessions and themes tables :: ";
434 flush();
435
436 query("DROP TABLE sessions", "Couldn't drop table 'sessions'");
437 query("DROP TABLE themes", "Couldn't drop table 'themes'");
438
439 print "<span class=\"ok\"><b>OK</b></span><br />\n";
440
441 end_step('mod_old_tables');
442
443 case 'mod_old_tables':
444 $modtables = array(
445 "banlist" => "banlist",
446 "catagories" => "categories",
447 "config" => "old_config",
448 "forums" => "forums",
449 "disallow" => "disallow",
450 "posts" => "posts",
451 "posts_text" => "posts_text",
452 "priv_msgs" => "privmsgs",
453 "ranks" => "ranks",
454 "smiles" => "smilies",
455 "topics" => "topics",
456 "users" => "users",
457 "words" => "words"
458 );
459
460 while( list($old, $new) = each($modtables) )
461 {
462 $result = query("SHOW INDEX FROM $old", "Couldn't get list of indices for table $old");
463
464 while( $row = $db->sql_fetchrow($result) )
465 {
466 $index = $row['Key_name'];
467 if ( $index != 'PRIMARY' )
468 {
469 query("ALTER TABLE $old DROP INDEX $index", "Couldn't DROP INDEX $old.$index");
470 }
471 }
472
473 // Rename table
474 $new = $table_prefix . $new;
475
476 print " * Renaming '$old' to '$new' :: ";
477 flush();
478 query("ALTER TABLE $old RENAME $new", "Failed to rename $old to $new");
479 print "<span class=\"ok\"><b>OK</b></span><br />\n";
480
481 }
482 end_step('create_tables');
483
484 case 'create_tables':
485 // Create array with tables in 'old' database
486 $result = query('SHOW TABLES', "Couldn't get list of current tables");
487
488 while( $table = $db->sql_fetchrow($result) )
489 {
490 $currenttables[] = $table[0];
491 }
492
493 // Check what tables we need to CREATE
494 while( list($table, $definition) = each($table_def) )
495 {
496 if ( !inarray($table, $currenttables) )
497 {
498 print " * Creating $table :: ";
499
500 query($definition, "Couldn't create table $table");
501
502 print "<span class=\"ok\"><b>OK</b></span><br />\n";
503 }
504 }
505
506 end_step('create_config');
507
508 case 'create_config':
509 print " * Inserting new values into new layout config table :: ";
510
511 @reset($inserts);
512 while( list($table, $inserts_table) = each($inserts) )
513 {
514 if ( $table == CONFIG_TABLE )
515 {
516 $per_pct = ceil( count($inserts_table) / 40 );
517 $inc = 0;
518
519 while( list($nr, $insert) = each($inserts_table) )
520 {
521 query($insert, "Couldn't insert value into config table");
522
523 $inc++;
524 if ( $inc == $per_pct )
525 {
526 print ".";
527 flush();
528 $inc = 0;
529 }
530 }
531 }
532 }
533
534 print " <span class=\"ok\"><b>OK</b></span><br />\n";
535
536 end_step('convert_config');
537
538 case 'convert_config':
539 print " * Converting configuration table :: ";
540
541 $sql = "SELECT *
542 FROM $table_prefix" . "old_config";
543 $result = query($sql, "Couldn't get info from old config table");
544
545 $oldconfig = $db->sql_fetchrow($result);
546
547 //
548 // We don't need several original config types and two others
549 // have changed name ... so take account of this.
550 //
551 $ignore_configs = array("selected", "admin_passwd", "override_themes", "allow_sig");
552 $rename_configs = array(
553 "email_from" => "board_email",
554 "email_sig" => "board_email_sig"
555 );
556
557 while( list($name, $value) = each($oldconfig) )
558 {
559 if ( is_int($name) )
560 {
561 continue;
562 }
563
564 if ( !inarray($name, $ignore_configs) )
565 {
566 $name = ( !empty($rename_configs[$name]) ) ? $rename_configs[$name] : $name;
567
568 // phpBB 1.x has some problems with escaping strings in the database. Try to correct for
569 // this by removing all slashes and then escaping once.
570 $sql = "REPLACE INTO " . CONFIG_TABLE . " (config_name, config_value)
571 VALUES ('$name', '".addslashes(stripslashes(stripslashes($value)))."')";
572 query($sql, "Couldn't update config table with values from old config table");
573 }
574 }
575
576 $sql = "UPDATE " . CONFIG_TABLE . "
577 SET config_value = 'dutch'
578 WHERE config_name = 'default_lang' && config_value = 'nederlands'";
579 query($sql, "Couldn't rename 'nederlands' to 'dutch' in config table");
580
581 print "<span class=\"ok\"><b>OK</b></span><br />\n";
582 end_step('convert_ips');
583
584 case 'convert_ips':
585 $names = array(
586 POSTS_TABLE => array(
587 'id' => 'post_id',
588 'field' => 'poster_ip'
589 ),
590 PRIVMSGS_TABLE => array(
591 'id' => 'msg_id',
592 'field' => 'poster_ip'
593 ),
594 BANLIST_TABLE => array(
595 'id' => 'ban_id',
596 'field' => 'ban_ip'
597 )
598 );
599
600 lock_tables(1, array(POSTS_TABLE, PRIVMSGS_TABLE, BANLIST_TABLE));
601
602 $batchsize = 2000;
603 while( list($table, $data_array) = each($names) )
604 {
605 $sql = "SELECT MAX(" . $data_array['id'] . ") AS max_id
606 FROM $table";
607 $result = query($sql, "Couldn't obtain ip data from $table (" . $fields . ")");
608
609 $row = $db->sql_fetchrow($result);
610
611 $maxid = $row['max_id'];
612
613 for($i = 0; $i <= $maxid; $i += $batchsize)
614 {
615 $batchstart = $i;
616 $batchend = $i + $batchsize;
617
618 $field_id = $data_array['id'];
619 $field = $data_array['field'];
620
621 print " * Converting IP format '" . $field . "' / '$table' ( $batchstart to $batchend ) :: ";
622 flush();
623
624 $sql = "SELECT $field_id, $field
625 FROM $table
626 WHERE $field_id
627 BETWEEN $batchstart
628 AND $batchend";
629 $result = query($sql, "Couldn't obtain ip data from $table (" . $fields . ")");
630
631 $per_pct = ceil( $db->sql_numrows($result) / 40 );
632 $inc = 0;
633
634 while( $row = $db->sql_fetchrow($result) )
635 {
636 $sql = "UPDATE $table
637 SET $field = '" . encode_ip($row[$field]) . "'
638 WHERE $field_id = " . $row[$field_id];
639 query($sql, "Couldn't convert IP format of $field in $table with $field_id of " . $rowset[$field_id]);
640
641 $inc++;
642 if ( $inc == $per_pct )
643 {
644 print ".";
645 flush();
646 $inc = 0;
647 }
648 }
649
650 print " <span class=\"ok\"><b>OK</b></span><br />\n";
651 }
652 }
653
654 lock_tables(0);
655 end_step('convert_dates');
656
657 case 'convert_dates':
658 $names = array(
659 POSTS_TABLE => array('post_time'),
660 TOPICS_TABLE => array('topic_time'),
661 PRIVMSGS_TABLE => array('msg_time')
662 );
663
664 lock_tables(1, array(POSTS_TABLE, TOPICS_TABLE, PRIVMSGS_TABLE));
665
666 while( list($table, $fields) = each($names) )
667 {
668 print " * Converting date format of $fields[$i] in $table :: ";
669 flush();
670
671 for($i = 0; $i < count($fields); $i++)
672 {
673 $sql = "UPDATE $table
674 SET " . $fields[$i] . " = UNIX_TIMESTAMP(" . $fields[$i] . ")";
675 query($sql, "Couldn't convert date format of $table(" . $fields[$i] . ")");
676 }
677
678 print "<span class=\"ok\"><b>OK</b></span><br />\n";
679 }
680
681 lock_tables(0);
682 end_step('fix_addslashes');
683
684 case 'fix_addslashes':
685 $slashfields[TOPICS_TABLE] = array('topic_title');
686 $slashfields[FORUMS_TABLE] = array('forum_desc', 'forum_name');
687 $slashfields[CATEGORIES_TABLE] = array('cat_title');
688 $slashfields[WORDS_TABLE] = array('word', 'replacement');
689 $slashfields[RANKS_TABLE] = array('rank_title');
690 $slashfields[DISALLOW_TABLE] = array('disallow_username');
691
692 //convert smilies?
693 $slashes = array(
694 "\\'" => "'",
695 "\\\"" => "\"",
696 "\\\\" => "\\");
697 $slashes = array(
698 "\\'" => "'",
699 "\\\"" => "\"",
700 "\\\\" => "\\");
701
702 lock_tables(1, array(TOPICS_TABLE, FORUMS_TABLE, CATEGORIES_TABLE, WORDS_TABLE, RANKS_TABLE, DISALLOW_TABLE, SMILIES_TABLE));
703
704 while( list($table, $fields) = each($slashfields) )
705 {
706 print " * Removing slashes from $table table :: ";
707 flush();
708
709 while( list($nr, $field) = each($fields) )
710 {
711 @reset($slashes);
712 while( list($search, $replace) = each($slashes) )
713 {
714 $sql = "UPDATE $table
715 SET $field = REPLACE($field, '" . addslashes($search) . "', '" . addslashes($replace) . "')";
716 query($sql, "Couldn't remove extraneous slashes from the old data.");
717 }
718 }
719
720 print "<span class=\"ok\"><b>OK</b></span><br />\n";
721 }
722
723 lock_tables(0);
724 end_step('remove_topics');
725
726 case 'remove_topics':
727 print " * Removing posts with no corresponding topics :: ";
728 flush();
729
730 $sql = "SELECT p.post_id
731 FROM " . POSTS_TABLE . " p
732 LEFT JOIN " . TOPICS_TABLE . " t ON p.topic_id = t.topic_id
733 WHERE t.topic_id IS NULL";
734 $result = query($sql, "Couldn't obtain list of deleted topics");
735
736 $post_total = $db->sql_numrows($result);
737
738 if ( $post_total )
739 {
740 $post_id_ary = array();
741 while( $row = $db->sql_fetchrow($result) )
742 {
743 $post_id_ary[] = $row['post_id'];
744 }
745
746 $sql = "DELETE FROM " . POSTS_TABLE . "
747 WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
748 query($sql, "Couldn't update posts to remove deleted user poster_id values");
749
750 $sql = "DELETE FROM " . POSTS_TEXT_TABLE . "
751 WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
752 query($sql, "Couldn't update posts to remove deleted user poster_id values");
753 }
754
755 echo "<span class=\"ok\"><b>OK</b></span> ( Removed $post_total posts )<br />\n";
756 end_step('convert_users');
757
758 case 'convert_users':
759 //
760 // Completely remove old soft-deleted users
761 //
762 $sql = "DELETE FROM " . USERS_TABLE . "
763 WHERE user_level = -1";
764 query($sql, "Couldn't delete old soft-deleted users");
765
766 $sql = "SELECT COUNT(*) AS total, MAX(user_id) AS maxid
767 FROM " . USERS_TABLE;
768 $result = query($sql, "Couldn't get max user_id.");
769
770 $row = $db->sql_fetchrow($result);
771
772 $totalposts = $row['total'];
773 $maxid = $row['maxid'];
774
775 $sql = "ALTER TABLE " . USERS_TABLE . "
776 ADD user_sig_bbcode_uid CHAR(10),
777 MODIFY user_sig text";
778 query($sql, "Couldn't add user_sig_bbcode_uid field to users table");
779
780 $super_mods = array();
781 $first_admin = -2;
782
783 $batchsize = 1000;
784 for($i = -1; $i <= $maxid; $i += $batchsize)
785 {
786 $batchstart = $i;
787 $batchend = $i + $batchsize;
788
789 print " * Converting Users ( $batchstart to $batchend ) :: ";
790 flush();
791
792 $sql = "SELECT *
793 FROM " . USERS_TABLE . "
794 WHERE user_id
795 BETWEEN $batchstart
796 AND $batchend";
797 $result = query($sql, "Couldn't get ". USERS_TABLE .".user_id $batchstart to $batchend");
798
799 // Array with user fields that we want to check for invalid data (to few characters)
800 $checklength = array(
801 'user_occ',
802 'user_website',
803 'user_email',
804 'user_from',
805 'user_intrest',
806 'user_aim',
807 'user_yim',
808 'user_msnm');
809
810 lock_tables(1, array(USERS_TABLE, GROUPS_TABLE, USER_GROUP_TABLE, POSTS_TABLE));
811
812 $per_pct = ceil( $db->sql_numrows($result) / 40 );
813 $inc = 0;
814
815 while( $row = $db->sql_fetchrow($result) )
816 {
817 $sql = "INSERT INTO " . GROUPS_TABLE . " (group_name, group_description, group_single_user)
818 VALUES ('" . addslashes($row['username']) . "', 'Personal User', 1)";
819 query($sql, "Wasn't able to insert user ".$row['user_id']." into table ".GROUPS_TABLE);
820
821 $group_id = $db->sql_nextid();
822
823 $sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
824 VALUES ($group_id, " . $row['user_id'] . ", 0)";
825 query($sql, "Wasn't able to insert user ".$row['user_id']." into table ".USER_GROUP_TABLE);
826
827 if ( is_int($row['user_regdate']) )
828 {
829 // We already converted this post to the new style BBcode, skip this post.
830 continue;
831 }
832
833 //
834 // Nathan's bbcode2 conversion
835 //
836
837 // undo 1.2.x encoding..
838 $row['user_sig'] = bbdecode(stripslashes($row['user_sig']));
839 $row['user_sig'] = undo_make_clickable($row['user_sig']);
840 $row['user_sig'] = str_replace("<BR>", "\n", $row['user_sig']);
841
842 // make a uid
843 $uid = make_bbcode_uid();
844
845 // do 2.x first-pass encoding..
846 $row['user_sig'] = bbencode_first_pass($row['user_sig'], $uid);
847 $row['user_sig'] = addslashes($row['user_sig']);
848
849 // Check for invalid info like '-' and '?' for a lot of fields
850 @reset($checklength);
851 while($field = each($checklength))
852 {
853 $row[$field[1]] = strlen($row[$field[1]]) < 3 ? '' : $row[$field[1]];
854 }
855
856 preg_match('/(.*?) (\d{1,2}), (\d{4})/', $row['user_regdate'], $parts);
857 $row['user_regdate'] = gmmktime(0, 0, 0, $months[$parts[1]], $parts[2], $parts[3]);
858
859 $website = $row['user_website'];
860 if ( substr(strtolower($website), 0, 7) != "http://" )
861 {
862 $website = "http://" . $website;
863 }
864 if( strtolower($website) == 'http://' )
865 {
866 $website = '';
867 }
868 $row['user_website'] = addslashes($website);
869
870 $row['user_icq'] = (ereg("^[0-9]+$", $row['user_icq'])) ? $row['user_icq'] : '';
871 @reset($checklength);
872
873 while($field = each($checklength))
874 {
875 if ( strlen($row[$field[1]]) < 3 )
876 {
877 $row[$field[1]] = '';
878 }
879 $row[$field[1]] = addslashes($row[$field[1]]);
880 }
881
882 //
883 // Is user a super moderator?
884 //
885 if( $row['user_level'] == 3 )
886 {
887 $super_mods[] = $row['user_id'];
888 }
889
890 $row['user_level'] = ( $row['user_level'] == 4 ) ? ADMIN : USER;
891
892 //
893 // Used to define a 'practical' group moderator user_id
894 // for super mods a little latter.
895 //
896 if( $first_admin == -2 && $row['user_level'] == ADMIN )
897 {
898 $first_admin = $row['user_id'];
899 }
900
901 //
902 // Dutch language files have been renamed from 'nederlands' to 'dutch'
903 //
904 if( $row['user_lang'] == 'nederlands' )
905 {
906 $row['user_lang'] = 'dutch';
907 }
908
909 $sql = "UPDATE " . USERS_TABLE . "
910 SET
911 user_sig = '" . $row['user_sig'] . "',
912 user_sig_bbcode_uid = '$uid',
913 user_regdate = '" . $row['user_regdate'] . "',
914 user_website = '" . $row['user_website'] . "',
915 user_occ = '" . $row['user_occ'] . "',
916 user_email = '" . $row['user_email'] . "',
917 user_from = '" . $row['user_from'] . "',
918 user_intrest = '" . $row['user_intrest'] . "',
919 user_aim = '" . $row['user_aim'] . "',
920 user_yim = '" . $row['user_yim'] . "',
921 user_msnm = '" . $row['user_msnm'] . "',
922 user_level = '" . $row['user_level'] . "',
923 user_desmile = NOT(user_desmile),
924 user_bbcode = 1,
925 user_theme = 1
926 WHERE user_id = " . $row['user_id'];
927 query($sql, "Couldn't update ".USERS_TABLE." table with new BBcode and regdate for user_id ".$row['user_id']);
928
929 $inc++;
930 if ( $inc == $per_pct )
931 {
932 print ".";
933 flush();
934 $inc = 0;
935 }
936 }
937
938 // Set any non-standard (like) email addresses to nothing
939 // could do this above as a preg_ but this one query may
940 // be faster
941 $sql = "UPDATE " . USERS_TABLE . "
942 SET user_email = ''
943 WHERE user_email NOT REGEXP '^[a-zA-Z0-9_\+\.\-]+@.*[a-zA-Z0-9\-_]+\.[a-zA-Z]{2,}$'";
944 query($sql, "Couldn't update ".USERS_TABLE." table non-standard user_email entries");
945
946 print " <span class=\"ok\"><b>OK</b></span><br />\n";
947
948 lock_tables(0);
949 }
950
951 //
952 // Handle super-mods, create hidden group for them
953 //
954 // Iterate trough access table
955 if( count($super_mods) && $first_admin != -2 )
956 {
957 print "\n<br />\n * Creating new group for super moderators :: ";
958 flush();
959
960 $sql = "INSERT INTO " . GROUPS_TABLE . " (group_type, group_name, group_description, group_moderator, group_single_user)
961 VALUES (" . GROUP_HIDDEN . ", 'Super Moderators', 'Converted super moderators', $first_admin, 0)";
962 $result = query($sql, "Couldn't create group for ".$row['forum_name']);
963
964 $group_id = $db->sql_nextid();
965
966 if ( $group_id <= 0 )
967 {
968 print "<font color=\"red\">Group creation failed. Aborting creation of groups...<br></font>\n";
969 continue 2;
970 }
971
972 print "<span class=\"ok\"><b>OK</b></span><br />\n";
973
974 print " * Updating auth_access for super moderator group :: ";
975 flush();
976
977 $sql = "SELECT forum_id
978 FROM " . FORUMS_TABLE;
979 $result = query($sql, "Couldn't obtain forum_id list");
980
981 while( $row = $db->sql_fetchrow($result) )
982 {
983 $sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_mod)
984 VALUES ($group_id, " . $row['forum_id'] . ", 1)";
985 $result_insert = query($sql, "Unable to set group auth access for super mods.");
986 }
987
988 for($i = 0; $i < count($super_mods); $i++)
989 {
990 $sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
991 VALUES ($group_id, " . $super_mods[$i] . ", 0)";
992 query($sql, "Unable to add user_id $user_id to group_id $group_id (super mods)<br>\n");
993 }
994
995 print "<span class=\"ok\"><b>OK</b></span><br />\n";
996 }
997
998 end_step('convert_posts');
999
1000 case 'convert_posts':
1001 print " * Adding enable_sig field to " . POSTS_TABLE . " :: ";
1002 flush();
1003 $sql = "ALTER TABLE " . POSTS_TABLE . "
1004 ADD enable_sig tinyint(1) DEFAULT '1' NOT NULL";
1005 $result = query($sql, "Couldn't add enable_sig field to " . POSTS_TABLE . ".");
1006 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1007
1008 print " * Adding enable_bbcode field to " . POSTS_TEXT_TABLE . " :: ";
1009 flush();
1010 $sql = "ALTER TABLE " . POSTS_TEXT_TABLE . "
1011 ADD enable_bbcode tinyint(1) DEFAULT '1' NOT NULL";
1012 $result = query($sql, "Couldn't add enable_bbcode field to " . POSTS_TABLE . ".");
1013 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1014
1015 print " * Adding bbcode_uid field to " . POSTS_TEXT_TABLE . " :: ";
1016 flush();
1017 $sql = "ALTER TABLE " . POSTS_TEXT_TABLE . "
1018 ADD bbcode_uid char(10) NOT NULL";
1019 $result = query($sql, "Couldn't add bbcode_uid field to " . POSTS_TABLE . ".");
1020 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1021
1022 print " * Adding post_edit_time field to " . POSTS_TABLE . " :: ";
1023 flush();
1024 $sql = "ALTER TABLE " . POSTS_TABLE . "
1025 ADD post_edit_time int(11)";
1026 $result = query($sql, "Couldn't add post_edit_time field to " . POSTS_TABLE . ".");
1027 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1028
1029 print " * Adding post_edit_count field to " . POSTS_TABLE . " :: ";
1030 flush();
1031 $sql = "ALTER TABLE " . POSTS_TABLE . "
1032 ADD post_edit_count smallint(5) UNSIGNED DEFAULT '0' NOT NULL";
1033 $result = query($sql, "Couldn't add post_edit_count field to " . POSTS_TABLE . ".");
1034 print "<span class=\"ok\"><b>OK</b></span><br />\n<br />\n";
1035
1036 $sql = "SELECT COUNT(*) as total, MAX(post_id) as maxid
1037 FROM " . POSTS_TEXT_TABLE;
1038 $result = query($sql, "Couldn't get max post_id.");
1039
1040 $maxid = $db->sql_fetchrow($result);
1041
1042 $totalposts = $maxid['total'];
1043 $maxid = $maxid['maxid'];
1044
1045 $batchsize = 2000;
1046 for($i = 0; $i <= $maxid; $i += $batchsize)
1047 {
1048 $batchstart = $i + 1;
1049 $batchend = $i + $batchsize;
1050
1051 print " * Converting BBcode ( $batchstart to $batchend ) :: ";
1052 flush();
1053
1054 $sql = "SELECT *
1055 FROM " . POSTS_TEXT_TABLE . "
1056 WHERE post_id
1057 BETWEEN $batchstart
1058 AND $batchend";
1059 $result = query($sql, "Couldn't get ". POSTS_TEXT_TABLE .".post_id $batchstart to $batchend");
1060
1061 lock_tables(1, array(POSTS_TEXT_TABLE, POSTS_TABLE));
1062
1063 $per_pct = ceil( $db->sql_numrows($result) / 40 );
1064 $inc = 0;
1065
1066 while( $row = $db->sql_fetchrow($result) )
1067 {
1068 if ( $row['bbcode_uid'] != '' )
1069 {
1070 // We already converted this post to the new style BBcode, skip this post.
1071 continue;
1072 }
1073
1074 //
1075 // Nathan's bbcode2 conversion
1076 //
1077 // undo 1.2.x encoding..
1078 $row['post_text'] = bbdecode(stripslashes($row['post_text']));
1079 $row['post_text'] = undo_make_clickable($row['post_text']);
1080 $row['post_text'] = str_replace('<BR>', "\n", $row['post_text']);
1081
1082 // make a uid
1083 $uid = make_bbcode_uid();
1084
1085 // do 2.x first-pass encoding..
1086 $row['post_text'] = smiley_replace($row['post_text']);
1087 $row['post_text'] = bbencode_first_pass($row['post_text'], $uid);
1088 $row['post_text'] = addslashes($row['post_text']);
1089
1090 $edited_sql = "";
1091 if ( preg_match('/^(.*?)([\n]+<font size=\-1>\[ This message was .*?)$/s', $row['post_text'], $matches) )
1092 {
1093 $row['post_text'] = $matches[1];
1094 $edit_info = $matches[2];
1095
1096 $edit_times = count(explode(' message ', $edit_info)) - 1; // Taken from example for substr_count in annotated PHP manual
1097
1098 if ( preg_match('/^.* by: (.*?) on (....)-(..)-(..) (..):(..) \]<\/font>/s', $edit_info, $matches) )
1099 {
1100 $edited_user = $matches[1];
1101 $edited_time = gmmktime($matches[5], $matches[6], 0, $matches[3], $matches[4], $matches[2]);
1102
1103 //
1104 // This isn't strictly correct since 2.0 won't include and edit
1105 // statement if the edit wasn't by the user who posted ...
1106 //
1107 $edited_sql = ", post_edit_time = $edited_time, post_edit_count = $edit_times";
1108 }
1109 }
1110
1111 if ( preg_match("/^(.*?)\n-----------------\n.*$/is", $row['post_text'], $matches) )
1112 {
1113 $row['post_text'] = $matches[1];
1114 $enable_sig = 1;
1115 }
1116 else
1117 {
1118 $checksig = preg_replace('/\[addsig\]$/', '', $row['post_text']);
1119 $enable_sig = ( strlen($checksig) == strlen($row['post_text']) ) ? 0 : 1;
1120 }
1121
1122 $sql = "UPDATE " . POSTS_TEXT_TABLE . "
1123 SET post_text = '$checksig', bbcode_uid = '$uid'
1124 WHERE post_id = " . $row['post_id'];
1125 query($sql, "Couldn't update " . POSTS_TEXT_TABLE . " table with new BBcode for post_id :: " . $row['post_id']);
1126
1127 $sql = "UPDATE " . POSTS_TABLE . "
1128 SET enable_sig = $enable_sig" . $edited_sql . "
1129 WHERE post_id = " . $row['post_id'];
1130 query($sql, "Couldn't update " . POSTS_TABLE . " table with signature status for post with post_id :: " . $row['post_id']);
1131
1132 $inc++;
1133 if ( $inc == $per_pct )
1134 {
1135 print '.';
1136 flush();
1137 $inc = 0;
1138 }
1139 }
1140
1141 print " <span class=\"ok\"><b>OK</b></span><br />\n";
1142
1143 lock_tables(0);
1144 }
1145
1146 print "<br />\n * Updating poster_id for deleted users :: ";
1147 flush();
1148
1149 $sql = "SELECT DISTINCT p.post_id
1150 FROM " . POSTS_TABLE . " p
1151 LEFT JOIN " . USERS_TABLE . " u ON p.poster_id = u.user_id
1152 WHERE u.user_id IS NULL";
1153 $result = query($sql, "Couldn't obtain list of deleted users");
1154
1155 $users_removed = $db->sql_numrows($result);
1156
1157 if ( $users_removed )
1158 {
1159 $post_id_ary = array();
1160 while( $row = $db->sql_fetchrow($result) )
1161 {
1162 $post_id_ary[] = $row['post_id'];
1163 }
1164
1165 $sql = "UPDATE " . POSTS_TABLE . "
1166 SET poster_id = " . ANONYMOUS . ", enable_sig = 0
1167 WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
1168 query($sql, "Couldn't update posts to remove deleted user poster_id values");
1169 }
1170
1171 print "<span class=\"ok\"><b>OK</b></span> ( Removed $users_removed non-existent user references )<br />\n";
1172
1173 end_step('convert_privmsgs');
1174
1175 case 'convert_privmsgs':
1176 $sql = "SELECT COUNT(*) as total, max(msg_id) as maxid
1177 FROM " . PRIVMSGS_TABLE;
1178 $result = query($sql, "Couldn't get max privmsgs_id.");
1179
1180 $maxid = $db->sql_fetchrow($result);
1181
1182 $totalposts = $maxid['total'];
1183 $maxid = $maxid['maxid'];
1184
1185 $sql = "ALTER TABLE " . PRIVMSGS_TABLE . "
1186 ADD privmsgs_subject VARCHAR(255),
1187 ADD privmsgs_attach_sig TINYINT(1) DEFAULT 1";
1188 query($sql, "Couldn't add privmsgs_subject field to " . PRIVMSGS_TABLE . " table");
1189
1190 $batchsize = 2000;
1191 for($i = 0; $i <= $maxid; $i += $batchsize)
1192 {
1193 $batchstart = $i + 1;
1194 $batchend = $i + $batchsize;
1195
1196 print " * Converting Private Message ( $batchstart to $batchend ) :: ";
1197 flush();
1198
1199 $sql = "SELECT *
1200 FROM " . PRIVMSGS_TABLE . "
1201 WHERE msg_id
1202 BETWEEN $batchstart
1203 AND $batchend";
1204 $result = query($sql, "Couldn't get " . POSTS_TEXT_TABLE . " post_id $batchstart to $batchend");
1205
1206 lock_tables(1, array(PRIVMSGS_TABLE, PRIVMSGS_TEXT_TABLE));
1207
1208 $per_pct = ceil( $db->sql_numrows($result) / 40 );
1209 $inc = 0;
1210
1211 while( $row = $db->sql_fetchrow($result) )
1212 {
1213 if ( $row['msg_text'] == NULL )
1214 {
1215 // We already converted this post to the new style BBcode, skip this post.
1216 continue;
1217 }
1218 //
1219 // Nathan's bbcode2 conversion
1220 //
1221 // undo 1.2.x encoding..
1222 $row['msg_text'] = bbdecode(stripslashes($row['msg_text']));
1223 $row['msg_text'] = undo_make_clickable($row['msg_text']);
1224 $row['msg_text'] = str_replace("<BR>", "\n", $row['msg_text']);
1225
1226 // make a uid
1227 $uid = make_bbcode_uid();
1228
1229 // do 2.x first-pass encoding..
1230 $row['msg_text'] = smiley_replace($row['msg_text']);
1231 $row['msg_text'] = bbencode_first_pass($row['msg_text'], $uid);
1232
1233 $checksig = preg_replace('/\[addsig\]$/', '', $row['msg_text']);
1234 $enable_sig = (strlen($checksig) == strlen($row['msg_text'])) ? 0 : 1;
1235
1236 if ( preg_match("/^(.*?)\n-----------------\n.*$/is", $checksig, $matches) )
1237 {
1238 $checksig = $matches[1];
1239 $enable_sig = 1;
1240 }
1241
1242 $row['msg_text'] = $checksig;
1243
1244 $row['msg_status'] = ($row['msg_status'] == 1) ? PRIVMSGS_READ_MAIL : PRIVMSGS_NEW_MAIL;
1245
1246 // Subject contains first 60 characters of msg, remove any BBCode tags
1247 $subject = addslashes(strip_tags(substr($row['msg_text'], 0, 60)));
1248 $subject = preg_replace("/\[.*?\:(([a-z0-9]:)?)$uid.*?\]/si", "", $subject);
1249
1250 $row['msg_text'] = addslashes($row['msg_text']);
1251
1252 $sql = "INSERT INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
1253 VALUES ('" . $row['msg_id'] . "', '$uid', '" . $row['msg_text'] . "')";
1254 query($sql, "Couldn't insert PrivMsg text into " . PRIVMSGS_TEXT_TABLE . " table msg_id " . $row['msg_id']);
1255
1256 $sql = "UPDATE " . PRIVMSGS_TABLE . "
1257 SET msg_text = NULL, msg_status = " . $row['msg_status'] . ", privmsgs_subject = '$subject', privmsgs_attach_sig = $enable_sig
1258 WHERE msg_id = " . $row['msg_id'];
1259 query($sql, "Couldn't update " . PRIVMSGS_TABLE . " table for msg_id " . $row['post_id']);
1260
1261 $inc++;
1262 if ( $inc == $per_pct )
1263 {
1264 print '.';
1265 flush();
1266 $inc = 0;
1267 }
1268 }
1269
1270 print " <span class=\"ok\"><b>OK</b></span><br />\n";
1271 }
1272
1273 lock_tables(0);
1274 end_step('convert_moderators');
1275
1276 case 'convert_moderators';
1277 $sql = "SELECT *
1278 FROM forum_mods";
1279 $result = query($sql, "Couldn't get list with all forum moderators");
1280
1281 while( $row = $db->sql_fetchrow($result) )
1282 {
1283 // Check if this moderator and this forum still exist
1284 $sql = "SELECT user_id
1285 FROM " . USERS_TABLE . ", " . FORUMS_TABLE . "
1286 WHERE user_id = " . $row['user_id'] . "
1287 AND forum_id = " . $row['forum_id'];
1288 $check_data = query($sql, "Couldn't check if user " . $row['user_id'] . " and forum " . $row['forum_id'] . " exist");
1289
1290 if ( !($rowtest = $db->sql_fetchrow($check_data)) )
1291 {
1292 // Either the moderator or the forum have been deleted, this line in forum_mods was redundant, skip it.
1293 continue;
1294 }
1295
1296 $sql = "SELECT g.group_id
1297 FROM " . GROUPS_TABLE . " g, " . USER_GROUP_TABLE . " ug
1298 WHERE g.group_id = ug.group_id
1299 AND ug.user_id = " . $row['user_id'] . "
1300 AND g.group_single_user = 1";
1301 $insert_group = query($sql, "Couldn't get group number for user " . $row['user_id'] . ".");
1302
1303 $group_id = $db->sql_fetchrow($insert_group);
1304 $group_id = $group_id['group_id'];
1305
1306 print " * Adding moderator for forum " . $row['forum_id'] . " :: ";
1307 flush();
1308
1309 $sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_mod) VALUES ($group_id, ".$row['forum_id'].", 1)";
1310 query($sql, "Couldn't set moderator (user_id = " . $row['user_id'] . ") for forum " . $row['forum_id'] . ".");
1311
1312 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1313 }
1314
1315 print " * Setting correct user_level for moderators ::";
1316 flush();
1317
1318 $sql = "SELECT DISTINCT u.user_id
1319 FROM " . USERS_TABLE . " u, " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa
1320 WHERE aa.auth_mod = 1
1321 AND ug.group_id = aa.group_id
1322 AND u.user_id = ug.user_id
1323 AND u.user_level <> " . ADMIN;
1324 $result = query($sql, "Couldn't obtain list of moderators");
1325
1326 if ( $row = $db->sql_fetchrow($result) )
1327 {
1328 $ug_sql = '';
1329
1330 do
1331 {
1332 $ug_sql .= ( ( $ug_sql != '' ) ? ', ' : '' ) . $row['user_id'];
1333 }
1334 while ( $row = $db->sql_fetchrow($result) );
1335
1336 $sql = "UPDATE " . USERS_TABLE . "
1337 SET user_level = " . MOD . "
1338 WHERE user_id IN ($ug_sql)";
1339 query($sql, "Couldn't set moderator status for users");
1340 }
1341
1342 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1343
1344 end_step('convert_privforums');
1345
1346 case 'convert_privforums':
1347 $sql = "SELECT fa.*, f.forum_name
1348 FROM forum_access fa
1349 LEFT JOIN " . FORUMS_TABLE . " f ON fa.forum_id = f.forum_id
1350 ORDER BY fa.forum_id, fa.user_id";
1351 $forum_access = query($sql, "Couldn't get list with special forum access (forum_access)");
1352
1353 $forum_id = -1;
1354 while( $row = $db->sql_fetchrow($forum_access) )
1355 {
1356 // Iterate trough access table
1357 if ( $row['forum_id'] != $forum_id )
1358 {
1359 // This is a new forum, create new group.
1360 $forum_id = $row['forum_id'];
1361
1362 print " * Creating new group for forum $forum_id :: ";
1363 flush();
1364
1365 $sql = "INSERT INTO " . GROUPS_TABLE . " (group_type, group_name, group_description, group_moderator, group_single_user)
1366 VALUES (" . GROUP_HIDDEN . ", '" . addslashes($row['forum_name']) . " Group', 'Converted Private Forum Group', " . $row['user_id'] . ", 0)";
1367 $result = query($sql, "Couldn't create group for ".$row['forum_name']);
1368
1369 $group_id = $db->sql_nextid();
1370
1371 if ( $group_id <= 0 )
1372 {
1373 print "<font color=\"red\">Group creation failed. Aborting creation of groups...<br></font>\n";
1374 continue 2;
1375 }
1376
1377 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1378
1379 print " * Creating auth_access group for forum $forum_id :: ";
1380 flush();
1381
1382 $sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_view, auth_read, auth_post, auth_reply, auth_edit, auth_delete, auth_sticky, auth_announce, auth_vote, auth_pollcreate)
1383 VALUES ($group_id, $forum_id, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1)";
1384 $result = query($sql, "Unable to set group auth access.");
1385
1386 if ( $db->sql_affectedrows($result) <= 0 )
1387 {
1388 print "<font color=\"red\">Group creation failed. Aborting creation of groups...</font><br>\n";
1389 continue 2;
1390 }
1391
1392 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1393 }
1394
1395 // Add user to the group
1396 $user_id = $row['user_id'];
1397
1398 $sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
1399 VALUES ($group_id, $user_id, 0)";
1400 query($sql, "Unable to add user_id $user_id to group_id $group_id <br>\n");
1401 }
1402
1403 end_step('update_schema');
1404
1405 case 'update_schema':
1406 $rename = array(
1407 $table_prefix . "users" => array(
1408 "user_interests" => "user_intrest",
1409 "user_allowsmile" => "user_desmile",
1410 "user_allowhtml" => "user_html",
1411 "user_allowbbcode" => "user_bbcode",
1412 "user_style" => "user_theme"
1413 ),
1414 $table_prefix . "privmsgs" => array(
1415 "privmsgs_id" => "msg_id",
1416 "privmsgs_from_userid" => "from_userid",
1417 "privmsgs_to_userid" => "to_userid",
1418 "privmsgs_date" => "msg_time",
1419 "privmsgs_ip" => "poster_ip",
1420 "privmsgs_type" => "msg_status"
1421 ),
1422 $table_prefix . "smilies" => array(
1423 "smilies_id" => "id"
1424 )
1425 );
1426
1427 $schema = get_schema();
1428
1429 $table_def = $schema['table_def'];
1430 $field_def = $schema['field_def'];
1431
1432 // Loop tables in schema
1433 while (list($table, $table_def) = @each($field_def))
1434 {
1435 // Loop fields in table
1436 print " * Updating table '$table' :: ";
1437 flush();
1438
1439 $sql = "SHOW FIELDS
1440 FROM $table";
1441 $result = query($sql, "Can't get definition of current $table table");
1442
1443 while( $row = $db->sql_fetchrow($result) )
1444 {
1445 $current_fields[] = $row['Field'];
1446 }
1447
1448 $alter_sql = "ALTER TABLE $table ";
1449 while (list($field, $definition) = each($table_def))
1450 {
1451 if ( $field == '' )
1452 {
1453 // Skip empty fields if any (shouldn't be needed)
1454 continue;
1455 }
1456
1457 $type = $definition['type'];
1458 $size = $definition['size'];
1459
1460 $default = isset($definition['default']) ? "DEFAULT " . $definition['default'] : '';
1461
1462 $notnull = $definition['notnull'] == 1 ? 'NOT NULL' : '';
1463
1464 $auto_increment = $definition['auto_increment'] == 1 ? 'auto_increment' : '';
1465
1466 $oldfield = isset($rename[$table][$field]) ? $rename[$table][$field] : $field;
1467
1468 if ( !inarray($field, $current_fields) && $oldfield == $field )
1469 {
1470 // If the current is not a key of $current_def and it is not a field that is
1471 // to be renamed then the field doesn't currently exist.
1472 $changes[] = " ADD $field " . $create_def[$table][$field];
1473 }
1474 else
1475 {
1476 $changes[] = " CHANGE $oldfield $field " . $create_def[$table][$field];
1477 }
1478 }
1479
1480 $alter_sql .= join(',', $changes);
1481 unset($changes);
1482 unset($current_fields);
1483
1484 $sql = "SHOW INDEX
1485 FROM $table";
1486 $result = query($sql, "Couldn't get list of indices for table $table");
1487
1488 unset($indices);
1489
1490 while( $row = $db->sql_fetchrow($result) )
1491 {
1492 $indices[] = $row['Key_name'];
1493 }
1494
1495 while ( list($key_name, $key_field) = each($key_def[$table]) )
1496 {
1497 if ( !inarray($key_name, $indices) )
1498 {
1499 $alter_sql .= ($key_name == 'PRIMARY') ? ", ADD PRIMARY KEY ($key_field)" : ", ADD INDEX $key_name ($key_field)";
1500 }
1501 }
1502 query($alter_sql, "Couldn't alter table $table");
1503
1504 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1505 flush();
1506 }
1507
1508 end_step('convert_forums');
1509
1510 case 'convert_forums':
1511 $sql = "SELECT *
1512 FROM " . FORUMS_TABLE;
1513 $result = query($sql, "Couldn't get list with all forums");
1514
1515 while( $row = $db->sql_fetchrow($result) )
1516 {
1517 print " * Converting forum '" . $row['forum_name'] . "' :: ";
1518 flush();
1519
1520 // forum_access: (only concerns posting)
1521 // 1 = Registered users only
1522 // 2 = Anonymous Posting
1523 // 3 = Moderators/Administrators only
1524 switch( $row['forum_access'] )
1525 {
1526 case 1:
1527 // Public forum, no anonymous posting
1528 $auth_view = AUTH_ALL;
1529 $auth_read = AUTH_ALL;
1530 $auth_post = AUTH_REG;
1531 $auth_reply = AUTH_REG;
1532 $auth_edit = AUTH_REG;
1533 $auth_delete = AUTH_REG;
1534 $auth_vote = AUTH_REG;
1535 $auth_pollcreate = AUTH_REG;
1536 $auth_sticky = AUTH_MOD;
1537 $auth_announce = AUTH_MOD;
1538 break;
1539 case 2:
1540 $auth_post = AUTH_ALL;
1541 $auth_reply = AUTH_ALL;
1542 $auth_edit = AUTH_REG;
1543 $auth_delete = AUTH_REG;
1544 $auth_vote = AUTH_ALL;
1545 $auth_pollcreate = AUTH_ALL;
1546 $auth_sticky = AUTH_MOD;
1547 $auth_announce = AUTH_MOD;
1548 break;
1549 default:
1550 $auth_post = AUTH_MOD;
1551 $auth_reply = AUTH_MOD;
1552 $auth_edit = AUTH_MOD;
1553 $auth_delete = AUTH_MOD;
1554 $auth_vote = AUTH_MOD;
1555 $auth_pollcreate = AUTH_MOD;
1556 $auth_sticky = AUTH_MOD;
1557 $auth_announce = AUTH_MOD;
1558 break;
1559 }
1560
1561 // Old auth structure:
1562 // forum_type: (only concerns viewing)
1563 // 0 = Public
1564 // 1 = Private
1565 switch( $row['forum_type'] )
1566 {
1567 case 0:
1568 $auth_view = AUTH_ALL;
1569 $auth_read = AUTH_ALL;
1570 break;
1571 default:
1572 //
1573 // Make it really private ...
1574 //
1575 $auth_view = AUTH_ACL;
1576 $auth_read = AUTH_ACL;
1577 $auth_post = AUTH_ACL;
1578 $auth_reply = AUTH_ACL;
1579 $auth_edit = AUTH_ACL;
1580 $auth_delete = AUTH_ACL;
1581 $auth_vote = AUTH_ACL;
1582 $auth_pollcreate = AUTH_ACL;
1583 $auth_sticky = AUTH_ACL;
1584 $auth_announce = AUTH_MOD;
1585 break;
1586 }
1587
1588 $sql = "UPDATE " . FORUMS_TABLE . " SET
1589 auth_view = $auth_view,
1590 auth_read = $auth_read,
1591 auth_post = $auth_post,
1592 auth_reply = $auth_reply,
1593 auth_edit = $auth_edit,
1594 auth_delete = $auth_delete,
1595 auth_vote = $auth_vote,
1596 auth_pollcreate = $auth_pollcreate,
1597 auth_sticky = $auth_sticky,
1598 auth_announce = $auth_announce
1599 WHERE forum_id = ". $row['forum_id'];
1600 query($sql, "Was unable to update forum permissions!");
1601
1602 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1603 }
1604
1605 end_step('insert_themes');
1606
1607 case 'insert_themes':
1608 print " * Inserting new values into themes table :: ";
1609
1610 @reset($inserts);
1611 while( list($table, $inserts_table) = each($inserts) )
1612 {
1613 if ( $table == THEMES_TABLE )
1614 {
1615 $per_pct = ceil( count($inserts_table) / 40 );
1616 $inc = 0;
1617
1618 while( list($nr, $insert) = each($inserts_table) )
1619 {
1620 query($insert, "Couldn't insert value into " . THEMES_TABLE);
1621
1622 $inc++;
1623 if ( $inc == $per_pct )
1624 {
1625 print ".";
1626 flush();
1627 $inc = 0;
1628 }
1629 }
1630 }
1631 }
1632
1633 print " <span class=\"ok\"><b>OK</b></span><br />\n";
1634 end_step('update_topics');
1635
1636 case 'update_topics':
1637 $sql = "SELECT MAX(topic_id) AS max_topic
1638 FROM " . TOPICS_TABLE;
1639 $result = query($sql, "Couldn't get max topic id");
1640
1641 $row = $db->sql_fetchrow($result);
1642
1643 $maxid = $row['max_topic'];
1644
1645 lock_tables(1, array(TOPICS_TABLE, POSTS_TABLE));
1646
1647 $batchsize = 1000;
1648 for($i = 0; $i <= $maxid; $i += $batchsize)
1649 {
1650 $batchstart = $i + 1;
1651 $batchend = $i + $batchsize;
1652
1653 print " * Setting topic first post_id ( $batchstart to $batchend ) :: ";
1654 flush();
1655
1656 $sql = "SELECT MIN(post_id) AS first_post_id, topic_id
1657 FROM " . POSTS_TABLE . "
1658 WHERE topic_id
1659 BETWEEN $batchstart
1660 AND $batchend
1661 GROUP BY topic_id
1662 ORDER BY topic_id ASC";
1663 $result = query($sql, "Couldn't get post id data");
1664
1665 $per_pct = ceil( $db->sql_numrows($result) / 40 );
1666 $inc = 0;
1667
1668 if ( $row = $db->sql_fetchrow($result) )
1669 {
1670 do
1671 {
1672 $sql = "UPDATE " . TOPICS_TABLE . "
1673 SET topic_first_post_id = " . $row['first_post_id'] . "
1674 WHERE topic_id = " . $row['topic_id'];
1675 query($sql, "Couldn't update topic first post id in topic :: $topic_id");
1676
1677 $inc++;
1678 if ( $inc == $per_pct )
1679 {
1680 print ".";
1681 flush();
1682 $inc = 0;
1683 }
1684 }
1685 while ( $row = $db->sql_fetchrow($result) );
1686 }
1687
1688 print " <span class=\"ok\"><b>OK</b></span><br />\n";
1689 }
1690
1691 lock_tables(0);
1692 end_step('final_configuration');
1693
1694 case 'final_configuration':
1695 //
1696 // Update forum last post information
1697 //
1698 $sql = "SELECT forum_id, forum_name
1699 FROM " . FORUMS_TABLE;
1700 $f_result = query($sql, "Couldn't obtain forum_ids");
1701
1702 while( $forum_row = $db->sql_fetchrow($f_result) )
1703 {
1704 print " * Updating '" . $forum_row['forum_name'] . "' post info :: ";
1705 flush();
1706
1707 $id = $forum_row['forum_id'];
1708
1709 $sql = "SELECT MIN(p.post_id) AS first_post, MAX(p.post_id) AS last_post
1710 FROM " . POSTS_TABLE . " p, " . TOPICS_TABLE . " t
1711 WHERE p.forum_id = $id
1712 AND p.topic_id = t.topic_id";
1713 $result = query($sql, "Could not get post ID forum post information :: $id");
1714
1715 if ( $row = $db->sql_fetchrow($result) )
1716 {
1717 $first_post = ( $row['first_post'] ) ? $row['first_post'] : 0;
1718 $last_post = ($row['last_post']) ? $row['last_post'] : 0;
1719 }
1720 else
1721 {
1722 $first_post = 0;
1723 $last_post = 0;
1724 }
1725
1726 $sql = "SELECT COUNT(post_id) AS total
1727 FROM " . POSTS_TABLE . "
1728 WHERE forum_id = $id";
1729 $result = query($sql, "Could not get post count forum post information :: $id");
1730
1731 if ( $row = $db->sql_fetchrow($result) )
1732 {
1733 $total_posts = ($row['total']) ? $row['total'] : 0;
1734 }
1735 else
1736 {
1737 $total_posts = 0;
1738 }
1739
1740 $sql = "SELECT COUNT(topic_id) AS total
1741 FROM " . TOPICS_TABLE . "
1742 WHERE forum_id = $id
1743 AND topic_status <> " . TOPIC_MOVED;
1744 $result = query($sql, "Could not get topic count forum post information :: $id");
1745
1746 if ( $row = $db->sql_fetchrow($result) )
1747 {
1748 $total_topics = ($row['total']) ? $row['total'] : 0;
1749 }
1750 else
1751 {
1752 $total_topics = 0;
1753 }
1754
1755 $sql = "UPDATE " . FORUMS_TABLE . "
1756 SET forum_last_post_id = $last_post, forum_posts = $total_posts, forum_topics = $total_topics
1757 WHERE forum_id = $id";
1758 query($sql, "Could not update forum post information :: $id");
1759
1760 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1761 }
1762
1763 print "<br />\n * Update default user and finalise configuration :: ";
1764 flush();
1765
1766 //
1767 // Update the default admin user with their information.
1768 //
1769 $sql = "SELECT MIN(user_regdate) AS oldest_time
1770 FROM " . USERS_TABLE . "
1771 WHERE user_regdate > 0 AND user_id > 0";
1772 $result = query($sql, "Couldn't obtain oldest post time");
1773
1774 $row = $db->sql_fetchrow($result);
1775
1776 $sql = "INSERT INTO " . $table_prefix . "config (config_name, config_value)
1777 VALUES ('board_startdate', " . $row['oldest_time'] . ")";
1778 query($sql, "Couldn't insert board_startdate");
1779
1780 $sql = "UPDATE " . $table_prefix . "config
1781 SET config_value = '" . $server_name . "'
1782 WHERE config_name = 'server_name'
1783 OR config_name = 'cookie_domain'";
1784 query($sql, "Couldn't insert Board Server domain");
1785
1786 $sql = "UPDATE " . $table_prefix . "config
1787 SET config_value = '" . $server_port . "'
1788 WHERE config_name = 'server_port'";
1789 query($sql, "Couldn't insert Board server port");
1790
1791 $sql = "UPDATE " . $table_prefix . "config
1792 SET config_value = '" . $board_email . "'
1793 WHERE config_name = 'board_email'";
1794 query($sql, "Couldn't insert Board admin email");
1795
1796 $sql = "UPDATE " . $table_prefix . "config
1797 SET config_value = '" . $script_path . "'
1798 WHERE config_name = 'script_path'";
1799 query($sql, "Couldn't insert Board script path");
1800
1801 //
1802 // Change session table to HEAP if MySQL version matches
1803 //
1804 $sql = "SELECT VERSION() AS mysql_version";
1805 $result = query($sql, "Couldn't obtain MySQL Version");
1806
1807 $row = $db->sql_fetchrow($result);
1808
1809 $version = $row['mysql_version'];
1810
1811 if ( preg_match("/^(3\.23)|(4\.)/", $version) )
1812 {
1813 $sql = "ALTER TABLE " . $table_prefix . "sessions
1814 TYPE=HEAP MAX_ROWS=500";
1815 $db->sql_query($sql);
1816 }
1817
1818 echo "<span class=\"ok\"><b>OK</b></span><br />\n";
1819 end_step('drop_fields');
1820
1821 case 'drop_fields':
1822 $fields = array(
1823 BANLIST_TABLE => array("ban_start", "ban_end", "ban_time_type"),
1824 FORUMS_TABLE => array("forum_access", "forum_moderator", "forum_type"),
1825 PRIVMSGS_TABLE => array("msg_text"),
1826 RANKS_TABLE => array("rank_max"),
1827 SMILIES_TABLE => array("emotion"),
1828 TOPICS_TABLE => array("topic_notify")
1829 );
1830
1831 while( list($table, $field_data) = each($fields) )
1832 {
1833 for($i = 0; $i < count($field_data); $i++)
1834 {
1835 print " * Drop field '" . $field_data[$i] . "' in '$table' :: ";
1836 flush();
1837
1838 $sql = "ALTER TABLE $table
1839 DROP COLUMN " . $field_data[$i];
1840 query($sql, "Couldn't drop field :: " . $field_data[$i] . " from table :: $table");
1841
1842 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1843
1844 }
1845 }
1846
1847 end_step('drop_tables');
1848
1849 case 'drop_tables':
1850 $drop_tables = array('access', 'forum_access', 'forum_mods', 'headermetafooter', 'whosonline', $table_prefix . 'old_config');
1851
1852 for($i = 0; $i < count($drop_tables); $i++)
1853 {
1854 print " * Dropping table '" . $drop_tables[$i] . "' :: ";
1855 flush();
1856
1857 $sql = "DROP TABLE " . $drop_tables[$i];
1858 query($sql, "Couldn't drop table :: " . $drop_tables[$i]);
1859
1860 print "<span class=\"ok\"><b>OK</b></span><br />\n";
1861 }
1862
1863 end_step('fulltext_search_indexing');
1864
1865 case 'fulltext_search_indexing':
1866 //
1867 // Generate search word list
1868 //
1869 // Fetch a batch of posts_text entries
1870 //
1871 $sql = "SELECT COUNT(*) as total, MAX(post_id) as max_post_id
1872 FROM " . POSTS_TEXT_TABLE;
1873 $result = query($sql, "Couldn't get post count totals");
1874
1875 $max_post_id = $db->sql_fetchrow($result);
1876
1877 $totalposts = $max_post_id['total'];
1878 $max_post_id = $max_post_id['max_post_id'];
1879 $per_percent = round(( $totalposts / 500 ) * 10);
1880
1881 $postcounter = ( !isset($HTTP_GET_VARS['batchstart']) ) ? 0 : $HTTP_GET_VARS['batchstart'];
1882
1883 $batchsize = 150; // Process this many posts per loop
1884 $batchcount = 0;
1885 $total_percent = 0;
1886
1887 for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
1888 {
1889 $batchstart = $postcounter + 1;
1890 $batchend = $postcounter + $batchsize;
1891 $batchcount++;
1892
1893 print " * Fulltext Indexing ( $batchstart to $batchend ) :: ";
1894 flush();
1895
1896 $sql = "SELECT *
1897 FROM " . POSTS_TEXT_TABLE ."
1898 WHERE post_id
1899 BETWEEN $batchstart
1900 AND $batchend";
1901 $posts_result = query($sql, "Couldn't obtain post_text");
1902
1903 $per_pct = ceil( $db->sql_numrows($posts_result) / 40 );
1904 $inc = 0;
1905
1906 if ( $row = $db->sql_fetchrow($posts_result) )
1907 {
1908 do
1909 {
1910 add_search_words('global', $row['post_id'], $row['post_text'], $row['post_subject']);
1911
1912 $inc++;
1913 if ( $inc == $per_pct )
1914 {
1915 print ".";
1916 flush();
1917 $inc = 0;
1918 }
1919 }
1920 while( $row = $db->sql_fetchrow($posts_result) );
1921 }
1922
1923 $db->sql_freeresult($posts_result);
1924
1925 // Remove common words after the first 2 batches and after every 4th batch after that.
1926 if ( $batchcount % 4 == 3 )
1927 {
1928 remove_common('global', 4/10);
1929 }
1930
1931 print " <span class=\"ok\"><b>OK</b></span><br />\n";
1932 }
1933
1934 echo "\n<br /><br />\n\n<font size=\"+3\"><b>UPGRADE COMPLETED</b></font><br />\n";
1935 }
1936}
1937
1938print "<br />If the upgrade completed without error you may click <a href=\"./../index.$phpEx\">Here</a> to proceed to the index<br />";
1939
1940common_footer();
1941
1942?>
Note: See TracBrowser for help on using the repository browser.