]> scripts.mit.edu Git - autoinstalls/phpBB.git/blob - install/update_to_latest.php
phpBB 2.0.19-scripts
[autoinstalls/phpBB.git] / install / update_to_latest.php
1 <?php
2 /***************************************************************************
3  *                             update_to_xxx.php
4  *                            -------------------
5  *   begin                : Wednesday, May 16, 2002
6  *   copyright            : (C) 2001 The phpBB Group
7  *   email                : support@phpbb.com
8  *
9  *   $Id: update_to_latest.php,v 1.1.2.11 2005/12/29 11:51:11 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
22 function _sql($sql, &$errored, &$error_ary, $echo_dot = true)
23 {
24         global $db;
25
26         if (!($result = $db->sql_query($sql)))
27         {
28                 $errored = true;
29                 $error_ary['sql'][] = (is_array($sql)) ? $sql[$i] : $sql;
30                 $error_ary['error_code'][] = $db->sql_error();
31         }
32
33         if ($echo_dot)
34         {
35                 echo ". \n";
36                 flush();
37         }
38
39         return $result;
40 }
41
42 @set_time_limit(120);
43
44 define('IN_PHPBB', 1);
45 $phpbb_root_path = './../';
46 include($phpbb_root_path . 'extension.inc');
47 include($phpbb_root_path . 'config.'.$phpEx);
48 if(!isset($dbms))
49 {
50         die("Please read: <a href='../docs/INSTALL.html'>INSTALL.html</a> before attempting to update.");
51 }
52 include($phpbb_root_path . 'includes/constants.'.$phpEx);
53 include($phpbb_root_path . 'includes/functions.'.$phpEx);
54 include($phpbb_root_path . 'includes/functions_admin.'.$phpEx);
55 include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
56 include($phpbb_root_path . 'includes/db.'.$phpEx);
57
58
59 //
60 //
61 //
62 $updates_to_version = '.0.19';
63 //
64 //
65 //
66
67 ?>
68 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
69 <html>
70 <head>
71 <meta http-equiv="Content-Type" content="text/html;">
72 <meta http-equiv="Content-Style-Type" content="text/css">
73 <style type="text/css">
74 <!--
75
76 font,th,td,p,body { font-family: "Courier New", courier; font-size: 11pt }
77
78 a:link,a:active,a:visited { color : #006699; }
79 a:hover         { text-decoration: underline; color : #DD6900;}
80
81 hr      { height: 0px; border: solid #D1D7DC 0px; border-top-width: 1px;}
82
83 .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;}
84
85 .ok {color:green}
86
87 /* Import the fancy styles for IE only (NS4.x doesn't use the @import function) */
88 @import url("../templates/subSilver/formIE.css");
89 -->
90 </style>
91 </head>
92 <body bgcolor="#FFFFFF" text="#000000" link="#006699" vlink="#5584AA">
93
94 <table width="100%" border="0" cellspacing="0" cellpadding="10" align="center">
95         <tr>
96                 <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
97                         <tr>
98                                 <td><img src="../templates/subSilver/images/logo_phpBB.gif" border="0" alt="Forum Home" vspace="1" /></td>
99                                 <td align="center" width="100%" valign="middle"><span class="maintitle">Updating to latest stable release</span></td>
100                         </tr>
101                 </table></td>
102         </tr>
103 </table>
104
105 <br clear="all" />
106
107 <h2>Information</h2>
108
109 <?php
110
111 echo '<p>Database type &nbsp; &nbsp;:: <b>' . SQL_LAYER . '</b><br />';
112
113 $sql = "SELECT config_value
114         FROM " . CONFIG_TABLE . "
115         WHERE config_name = 'version'";
116 if (!($result = $db->sql_query($sql)))
117 {
118         die("Couldn't obtain version info");
119 }
120
121 $row = $db->sql_fetchrow($result);
122
123 $sql = array();
124
125 switch ($row['config_value'])
126 {
127         case '':
128                 echo 'Previous version :: <b>&lt; RC-3</b></p><br />';
129                 break;
130         case 'RC-3':
131                 echo 'Previous version :: <b>RC-3</b></p><br />';
132                 break;
133         case 'RC-4':
134                 echo 'Previous version :: <b>RC-4</b></p><br />';
135                 break;
136         default:
137                 echo 'Previous version :: <b>2' . $row['config_value'] . '</b><br />';
138                 break;
139 }
140
141 echo 'Updated version &nbsp;:: <b>2' . $updates_to_version . '</b></p>' ."\n";
142
143 //
144 // Schema updates
145 //
146 switch ($row['config_value'])
147 {
148         case '':
149                 switch (SQL_LAYER)
150                 {
151                         case 'mysql':
152                         case 'mysql4':
153                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " DROP
154                                         COLUMN user_autologin_key";
155
156                                 $sql[] = "ALTER TABLE " . RANKS_TABLE . " DROP
157                                         COLUMN rank_max";
158
159                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
160                                         ADD COLUMN user_session_time int(11) DEFAULT '0' NOT NULL,
161                                         ADD COLUMN user_session_page smallint(5) DEFAULT '0' NOT NULL,
162                                         ADD INDEX (user_session_time)";
163                                 $sql[] = "ALTER TABLE " . SEARCH_TABLE . "
164                                         MODIFY search_id int(11) NOT NULL";
165
166                                 $sql[] = "ALTER TABLE " . TOPICS_TABLE . "
167                                         MODIFY topic_moved_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
168                                         ADD COLUMN topic_first_post_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
169                                         ADD INDEX (topic_first_post_id)";
170
171                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
172                                         ADD COLUMN tr_class1_name varchar(50) NULL,
173                                         ADD COLUMN tr_class2_name varchar(50) NULL,
174                                         ADD COLUMN tr_class3_name varchar(50) NULL,
175                                         ADD COLUMN th_class1_name varchar(50) NULL,
176                                         ADD COLUMN th_class2_name varchar(50) NULL,
177                                         ADD COLUMN th_class3_name varchar(50) NULL,
178                                         ADD COLUMN td_class1_name varchar(50) NULL,
179                                         ADD COLUMN td_class2_name varchar(50) NULL,
180                                         ADD COLUMN td_class3_name varchar(50) NULL,
181                                         ADD COLUMN span_class1_name varchar(50) NULL,
182                                         ADD COLUMN span_class2_name varchar(50) NULL,
183                                         ADD COLUMN span_class3_name varchar(50) NULL";
184                                 break;
185                         case 'postgresql':
186                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
187                                         ADD COLUMN user_session_time int4";
188                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
189                                         ADD COLUMN user_session_page int2";
190                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
191                                         ALTER COLUMN user_session_time SET DEFAULT '0'";
192                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
193                                         ALTER COLUMN user_session_page SET DEFAULT '0'";
194                                 $sql[] = "CREATE INDEX user_session_time_" . $table_prefix . "users_index
195                                         ON " . USERS_TABLE . " (user_session_time)";
196
197                                 $sql[] = "ALTER TABLE " . TOPICS_TABLE . "
198                                         ADD COLUMN topic_first_post_id int4";
199                                 $sql[] = "CREATE INDEX topic_first_post_id_" . $table_prefix . "topics_index
200                                         ON " . TOPICS_TABLE . " (topic_first_post_id)";
201
202                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
203                                         ADD COLUMN tr_class1_name varchar(50) NULL";
204                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
205                                         ADD COLUMN tr_class2_name varchar(50) NULL";
206                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
207                                         ADD COLUMN tr_class3_name varchar(50) NULL";
208                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
209                                         ADD COLUMN th_class1_name varchar(50) NULL";
210                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
211                                         ADD COLUMN th_class2_name varchar(50) NULL";
212                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
213                                         ADD COLUMN th_class3_name varchar(50) NULL";
214                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
215                                         ADD COLUMN td_class1_name varchar(50) NULL";
216                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
217                                         ADD COLUMN td_class2_name varchar(50) NULL";
218                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
219                                         ADD COLUMN td_class3_name varchar(50) NULL";
220                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
221                                         ADD COLUMN span_class1_name varchar(50) NULL";
222                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
223                                         ADD COLUMN span_class2_name varchar(50) NULL";
224                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . "
225                                         ADD COLUMN span_class3_name varchar(50) NULL";
226                                 break;
227
228                         case 'mssql-odbc':
229                         case 'mssql':
230                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " DROP
231                                         COLUMN user_autologin_key";
232
233                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
234                                         user_session_time int NOT NULL,
235                                         user_session_page smallint NOT NULL,
236                                         CONSTRAINT [DF_" . $table_prefix . "users_user_session_time] DEFAULT (0) FOR [user_session_time],
237                                         CONSTRAINT [DF_" . $table_prefix . "users_user_session_page] DEFAULT (0) FOR [user_session_page]";
238                                 $sql[] = "CREATE INDEX [IX_" . $table_prefix . "users]
239                                         ON [" . USERS_TABLE . "]([user_session_time]) ON [PRIMARY]";
240
241                                 /* ---------------------------------------------------------------------
242                                         DROP FORUM TABLE -- if this may cause you problems you can safely
243                                         comment it out, remember to manually remove the IDENTITY setting on
244                                         the forum_id column
245                                    --------------------------------------------------------------------- */
246                                 $sql [] = "ALTER TABLE " . FORUMS_TABLE . " DROP
247                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_posts],
248                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_topics],
249                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_last_post_id],
250                                         CONSTRAINT [DF_" . $table_prefix . "forums_prune_enable],
251                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_view],
252                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_read],
253                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_post],
254                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_reply],
255                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_edit],
256                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_delete],
257                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_sticky],
258                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_announce],
259                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_vote],
260                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_pollcreate],
261                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_attachments]";
262                                 $sql[] = "CREATE TABLE Tmp_" . FORUMS_TABLE . "
263                                         (forum_id int NOT NULL, cat_id int NOT NULL, forum_name varchar(100) NOT NULL, forum_desc varchar(255) NULL, forum_status smallint NOT NULL, forum_order int NOT NULL, forum_posts int NOT NULL, forum_topics smallint NOT NULL, forum_last_post_id int NOT NULL, prune_next int NULL, prune_enable smallint NOT NULL, auth_view smallint NOT NULL, auth_read smallint NOT NULL, auth_post smallint NOT NULL, auth_reply smallint NOT NULL, auth_edit smallint NOT NULL, auth_delete smallint NOT NULL, auth_sticky smallint NOT NULL, auth_announce smallint NOT NULL, auth_vote smallint NOT NULL, auth_pollcreate smallint NOT NULL, auth_attachments smallint NOT NULL) ON [PRIMARY]";
264                                 $sql[] = "ALTER TABLE [Tmp_" . FORUMS_TABLE . "] WITH NOCHECK ADD
265                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_posts] DEFAULT (0) FOR [forum_posts],
266                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_topics] DEFAULT (0) FOR [forum_topics],
267                                         CONSTRAINT [DF_" . $table_prefix . "forums_forum_last_post_id] DEFAULT (0) FOR [forum_last_post_id],
268                                         CONSTRAINT [DF_" . $table_prefix . "forums_prune_enable] DEFAULT (0) FOR [prune_enable],
269                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_view] DEFAULT (0) FOR [auth_view],
270                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_read] DEFAULT (0) FOR [auth_read],
271                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_post] DEFAULT (0) FOR [auth_post],
272                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_reply] DEFAULT (0) FOR [auth_reply],
273                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_edit] DEFAULT (0) FOR [auth_edit],
274                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_delete] DEFAULT (0) FOR [auth_delete],
275                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_sticky] DEFAULT (0) FOR [auth_sticky],
276                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_announce] DEFAULT (0) FOR [auth_announce],
277                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_vote] DEFAULT (0) FOR [auth_vote],
278                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_pollcreate] DEFAULT (0) FOR [auth_pollcreate],
279                                         CONSTRAINT [DF_" . $table_prefix . "forums_auth_attachments] DEFAULT (0) FOR [auth_attachments]";
280                                 $sql[] = "INSERT INTO Tmp_" . FORUMS_TABLE . " (forum_id, cat_id, forum_name, forum_desc, forum_status, forum_order, forum_posts, forum_topics, forum_last_post_id, prune_next, prune_enable, auth_view, auth_read, auth_post, auth_reply, auth_edit, auth_delete, auth_sticky, auth_announce, auth_vote, auth_pollcreate, auth_attachments)
281                                                 SELECT forum_id, cat_id, forum_name, forum_desc, forum_status, forum_order, forum_posts, forum_topics, forum_last_post_id, prune_next, prune_enable, auth_view, auth_read, auth_post, auth_reply, auth_edit, auth_delete, auth_sticky, auth_announce, auth_vote, auth_pollcreate, auth_attachments FROM " . FORUMS_TABLE . " TABLOCKX";
282                                 $sql[] = "DROP TABLE " . FORUMS_TABLE;
283                                 $sql[] = "EXECUTE sp_rename N'Tmp_" . FORUMS_TABLE . "', N'" . FORUMS_TABLE . "', 'OBJECT'";
284                                 $sql[] = "ALTER TABLE " . FORUMS_TABLE . " ADD
285                                         CONSTRAINT [PK_" . $table_prefix . "forums] PRIMARY KEY CLUSTERED (forum_id) ON [PRIMARY]";
286                                 $sql[] = "CREATE NONCLUSTERED INDEX [IX_" . $table_prefix . "forums]
287                                         ON " . FORUMS_TABLE . " (cat_id, forum_order, forum_last_post_id) ON [PRIMARY]";
288                                 /* --------------------------------------------------------------
289                                         END OF DROP FORUM -- don't remove anything after this point!
290                                    -------------------------------------------------------------- */
291
292                                 $sql[] = "DROP INDEX " . RANKS_TABLE . ".IX_" . $table_prefix . "ranks";
293                                 $sql[] = "ALTER TABLE " . RANKS_TABLE . " DROP
294                                         COLUMN rank_max";
295                                 $sql[] = "CREATE  INDEX [IX_" . $table_prefix . "ranks]
296                                         ON [" . RANKS_TABLE . "]([rank_min], [rank_special]) ON [PRIMARY]";
297
298                                 $sql[] = "DROP INDEX " . TOPICS_TABLE . ".IX_" . $table_prefix . "topics";
299                                 $sql[] = "ALTER TABLE " . TOPICS_TABLE . " ADD
300                                         topic_first_post_id int NULL,
301                                         CONSTRAINT [DF_" . $table_prefix . "topics_topic_first_post_id] FOR [topic_first_post_id]";
302                                 $sql[] = "CREATE  INDEX [IX_" . $table_prefix . "topics]
303                                         ON [" . TOPICS_TABLE . "]([forum_id], [topic_type], [topic_first_post_id], [topic_last_post_id]) ON [PRIMARY]";
304
305                                 $sql[] = "ALTER TABLE " . SEARCH_WORD_TABLE . " DROP
306                                         CONSTRAINT [PK_" . $table_prefix . "search_wordlist]";
307                                 $sql[] = "CREATE UNIQUE INDEX [IX_" . $table_prefix . "search_wordlist]
308                                         ON [" . SEARCH_WORD_TABLE . "]([word_text]) WITH IGNORE_DUP_KEY ON [PRIMARY]";
309                                 $sql[] = "CREATE  INDEX [IX_" . $table_prefix . "search_wordlist_1]
310                                         ON [" . SEARCH_WORD_TABLE . "]([word_common]) ON [PRIMARY]";
311
312                                 $sql[] = "CREATE INDEX [IX_" . $table_prefix . "search_wordmatch_1]
313                                         ON [" . SEARCH_MATCH_TABLE . "]([word_id]) ON [PRIMARY]";
314
315                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . " ADD
316                                         tr_class1_name varchar(50) NULL,
317                                         tr_class2_name varchar(50) NULL,
318                                         tr_class3_name varchar(50) NULL,
319                                         th_class1_name varchar(50) NULL,
320                                         th_class2_name varchar(50) NULL,
321                                         th_class3_name varchar(50) NULL,
322                                         td_class1_name varchar(50) NULL,
323                                         td_class2_name varchar(50) NULL,
324                                         td_class3_name varchar(50) NULL,
325                                         span_class1_name varchar(50) NULL,
326                                         span_class2_name varchar(50) NULL,
327                                         span_class3_name varchar(50) NULL";
328                                 break;
329
330                         case 'msaccess':
331                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " DROP
332                                         COLUMN user_autologin_key";
333
334                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
335                                         user_session_time int NOT NULL,
336                                         user_session_page smallint NOT NULL";
337                                 $sql[] = "CREATE INDEX user_session_time
338                                         ON " . USERS_TABLE . " (user_session_time)";
339
340                                 $sql[] = "ALTER TABLE " . TOPICS_TABLE . " ADD
341                                         topic_first_post_id int NULL";
342                                 $sql[] = "CREATE INDEX topic_first_post_id
343                                         ON " . TOPICS_TABLE . " (topic_first_post_id)";
344
345                                 $sql[] = "ALTER TABLE " . THEMES_NAME_TABLE . " ADD
346                                         tr_class1_name varchar(50) NULL,
347                                         tr_class2_name varchar(50) NULL,
348                                         tr_class3_name varchar(50) NULL,
349                                         th_class1_name varchar(50) NULL,
350                                         th_class2_name varchar(50) NULL,
351                                         th_class3_name varchar(50) NULL,
352                                         td_class1_name varchar(50) NULL,
353                                         td_class2_name varchar(50) NULL,
354                                         td_class3_name varchar(50) NULL,
355                                         span_class1_name varchar(50) NULL,
356                                         span_class2_name varchar(50) NULL,
357                                         span_class3_name varchar(50) NULL";
358                                 break;
359
360                         default:
361                                 die("No DB LAYER found!");
362                                 break;
363                 }
364
365         case 'RC-3':
366         case 'RC-4':
367         case '.0.0':
368                 switch (SQL_LAYER)
369                 {
370                         case 'mysql':
371                         case 'mysql4':
372                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
373                                         MODIFY COLUMN user_id  mediumint(8) NOT NULL,
374                                         MODIFY COLUMN user_timezone decimal(5,2) DEFAULT '0' NOT NULL";
375                                 break;
376                         case 'postgresql':
377                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
378                                         RENAME COLUMN user_timezone TO user_timezone_old";
379                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
380                                         ADD COLUMN user_timezone decimal(5)";
381                                 break;
382                         case 'mssql':
383                         case 'mssql-odbc':
384                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
385                                         ALTER COLUMN [user_timezone] [decimal] (5,2) NOT NULL";
386                                 break;
387                 }
388
389         case '.0.1':
390                 switch (SQL_LAYER)
391                 {
392                         case 'mysql':
393                         case 'mysql4':
394                                 $sql[] = "ALTER TABLE " . GROUPS_TABLE . "
395                                         MODIFY COLUMN group_id mediumint(8) NOT NULL auto_increment";
396                                 break;
397                         case 'mssql':
398                         case 'mssql-odbc':
399                                 /* ---------------------------------------------------------------------
400                                         DROP GROUP TABLE -- if this may cause you problems you can safely
401                                         comment it out, remember to manually add the IDENTITY setting on
402                                         the group_id column
403                                    --------------------------------------------------------------------- */
404                                 $sql[] = "CREATE TABLE Tmp_" . GROUPS_TABLE . "
405                                         (group_id int IDENTITY (1, 1) NOT NULL, group_type smallint NULL, group_name varchar(50) NOT NULL, group_description varchar(255) NOT NULL, group_moderator int NULL, group_single_user smallint NOT NULL) ON [PRIMARY]";
406                                 $sql[] = "SET IDENTITY_INSERT " . GROUPS_TABLE . " ON";
407                                 $sql[] = "INSERT INTO Tmp_" . GROUPS_TABLE . " (group_id, group_type, group_name, group_description, group_moderator, group_single_user)
408                                         SELECT group_id, group_type, group_name, group_description, group_moderator, group_single_user FROM " . GROUPS_TABLE . " TABLOCKX";
409                                 $sql[] = "SET IDENTITY_INSERT " . GROUPS_TABLE . " OFF";
410                                 $sql[] = "DROP TABLE " . GROUPS_TABLE;
411                                 $sql[] = "EXECUTE sp_rename N'Tmp_" . GROUPS_TABLE . "', N'" . GROUPS_TABLE . "', 'OBJECT'";
412                                 $sql[] = "ALTER TABLE " . GROUPS_TABLE . " ADD
413                                         CONSTRAINT [PK_" . $table_prefix . "groups] PRIMARY KEY CLUSTERED (group_id) ON [PRIMARY]";
414                                 $sql[] = "CREATE INDEX [IX_" . $table_prefix . "groups]
415                                         ON " . GROUPS_TABLE . " (group_single_user) ON [PRIMARY]";
416                                 /* --------------------------------------------------------------
417                                         END OF DROP GROUP -- don't remove anything after this point!
418                                    -------------------------------------------------------------- */
419                                 break;
420                         
421                 }
422
423         case '.0.2':
424
425         case '.0.3':
426
427                 switch (SQL_LAYER)
428                 {
429                         case 'mysql':
430                         case 'mysql4':
431                                 // Add indexes to post_id in search match table (+ word_id for MS Access)
432                                 $sql[] = "ALTER TABLE " . SEARCH_MATCH_TABLE . " 
433                                         ADD INDEX post_id (post_id)";
434
435                                 // Modify user_timezone to decimal(5,2) for mysql ... mysql4/mssql/pgsql/msaccess
436                                 // should be completely unaffected
437                                 // Change default user_notify to 0 
438                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " 
439                                         MODIFY COLUMN user_timezone decimal(5,2) DEFAULT '0' NOT NULL, 
440                                         MODIFY COLUMN user_notify tinyint(1) DEFAULT '0' NOT NULL";
441
442                                 // Adjust field type for prune_days, prune_freq ... was too small
443                                 $sql[] = "ALTER TABLE " . PRUNE_TABLE . " 
444                                         MODIFY COLUMN prune_days smallint(5) UNSIGNED NOT NULL, 
445                                         MODIFY COLUMN prune_freq smallint(5) UNSIGNED NOT NULL";
446                                 break;
447
448                         case 'msaccess':
449                                 // Add indexes to post_id in search match table (+ word_id for MS Access)
450                                 $sql[] = "CREATE INDEX " . SEARCH_MATCH_TABLE . " 
451                                         ON " . SEARCH_MATCH_TABLE . " ([post_id])";
452                                 $sql[] = "CREATE INDEX " . SEARCH_MATCH_TABLE . "_1 
453                                         ON " . SEARCH_MATCH_TABLE . " ([word_id])";
454                                 break;
455
456                         case 'postgresql':
457                                 // Add indexes to post_id in search match table (+ word_id for MS Access)
458                                 $sql[] = "CREATE INDEX post_id_" . SEARCH_MATCH_TABLE . " 
459                                         ON " . SEARCH_MATCH_TABLE . " (post_id)";
460
461                                 // Regenerate groups table with incremented group_id for pgsql 
462                                 // ... missing in 2.0.3 ...
463                                 $sql[] = "CREATE SEQUENCE " . GROUPS_TABLE . "_id_seq start 3 increment 1 maxvalue 2147483647 minvalue 1 cache 1";
464                                 $sql[] = "CREATE TABLE tmp_" . GROUPS_TABLE . " 
465                                         AS SELECT group_id, group_name, group_type, group_description, group_moderator, group_single_user 
466                                                 FROM " . GROUPS_TABLE;
467                                 $sql[] = "DROP TABLE " . GROUPS_TABLE;
468                                 $sql[] = "CREATE TABLE {$table_prefix}groups (group_id int DEFAULT nextval('" . GROUPS_TABLE . "_id_seq'::text) NOT NULL, group_name varchar(40) NOT NULL, group_type int2 DEFAULT '1' NOT NULL, group_description varchar(255) NOT NULL, group_moderator int4 DEFAULT '0' NOT NULL, group_single_user int2 DEFAULT '0' NOT NULL, CONSTRAINT {$table_prefix}groups_pkey PRIMARY KEY (group_id))";
469                                 $sql[] = "INSERT INTO " . GROUPS_TABLE . " (group_id, group_name, group_type, group_description, group_moderator, group_single_user) 
470                                         SELECT group_id, group_name, group_type, group_description, group_moderator, group_single_user 
471                                                 FROM tmp_" . GROUPS_TABLE;
472                                 $sql[] = "DROP TABLE tmp_" . GROUPS_TABLE;
473                                 break;
474                 }
475
476         case '.0.4':
477
478                 switch (SQL_LAYER)
479                 {
480                         case 'mssql':
481                         case 'mssql-odbc':
482                                 // Add missing defaults to MSSQL post table schema, failed in previous updates
483                                 $sql[] = "ALTER TABLE [" . POSTS_TABLE . "] WITH NOCHECK ADD
484                                         CONSTRAINT [DF_" . POSTS_TABLE . "_enable_bbcode] DEFAULT (1) FOR [enable_bbcode],
485                                         CONSTRAINT [DF_" . POSTS_TABLE . "_enable_html] DEFAULT (0) FOR [enable_html],
486                                         CONSTRAINT [DF_" . POSTS_TABLE . "_enable_smilies] DEFAULT (1) FOR [enable_smilies],
487                                         CONSTRAINT [DF_" . POSTS_TABLE . "_enable_sig] DEFAULT (1) FOR [enable_sig],
488                                         CONSTRAINT [DF_" . POSTS_TABLE . "_post_edit_count] DEFAULT (0) FOR [post_edit_count]";
489                                 break;
490                 }
491
492                 // Add tables for visual confirmation ... saves me the trouble of writing a seperate
493                 // script :D
494                 switch (SQL_LAYER)
495                 {
496                         case 'mysql':
497                         case 'mysql4':
498                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'confirm (confirm_id char(32) DEFAULT \'\' NOT NULL, session_id char(32) DEFAULT \'\' NOT NULL, code char(6) DEFAULT \'\' NOT NULL, PRIMARY KEY (session_id, confirm_id))';
499                                 break;
500
501                         case 'mssql':
502                         case 'mssql-odbc':
503                                 $sql[] = 'CREATE TABLE [' . $table_prefix . 'confirm] ([confirm_id] [char] (32) NOT NULL , [session_id] [char] (32) NOT NULL , [code] [char] (6) NOT NULL ) ON [PRIMARY]';
504                                 $sql[] = 'ALTER TABLE [' . $table_prefix . 'confirm] WITH NOCHECK ADD CONSTRAINT [PK_' . $table_prefix . 'confirm] PRIMARY KEY  CLUSTERED ( [session_id],[confirm_id])  ON [PRIMARY]';
505                                 $sql[] = 'ALTER TABLE [' . $table_prefix . 'confirm] WITH NOCHECK ADD CONSTRAINT [DF_' . $table_prefix . 'confirm_confirm_id] DEFAULT (\'\') FOR [confirm_id], CONSTRAINT [DF_' . $table_prefix . 'confirm_session_id] DEFAULT (\'\') FOR [session_id], CONSTRAINT [DF_' . $table_prefix . 'confirm_code] DEFAULT (\'\') FOR [code]';
506                                 break;
507
508                         case 'msaccess':
509                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'confirm (confirm_id char(32) NOT NULL, session_id char(32) NOT NULL, code char(6) NOT NULL)';
510                                 $sql[] = 'ALTER TABLE ' . $table_prefix . 'confirm ADD (PRIMARY KEY (session_id, confirm_id))';
511                                 break;
512
513                         case 'postgresql':
514                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'confirm (confirm_id char(32) DEFAULT \'\' NOT NULL,  session_id char(32) DEFAULT \'\' NOT NULL, code char(6) DEFAULT \'\' NOT NULL, CONSTRAINT {$table_prefix}confirm_pkey PRIMARY KEY (session_id, confirm_id))';
515                                 break;
516                 }
517
518         case '.0.5':
519         case '.0.6':
520         case '.0.7':
521         case '.0.8':
522         case '.0.9':
523         case '.0.10':
524         case '.0.11':
525         case '.0.12':
526         case '.0.13':
527         case '.0.14':
528
529                 switch (SQL_LAYER)
530                 {
531                         case 'mysql':
532                         case 'mysql4':
533                                 $sql[] = "ALTER TABLE " . SESSIONS_TABLE . "
534                                         ADD COLUMN session_admin tinyint(2) DEFAULT '0' NOT NULL";
535                                 break;
536
537                         case 'postgresql':
538                                 $sql[] = "ALTER TABLE " . SESSIONS_TABLE . "
539                                         ADD COLUMN session_admin int2";
540                                 $sql[] = "ALTER TABLE " . SESSIONS_TABLE . "
541                                         ALTER COLUMN session_admin SET DEFAULT '0'";
542                                 break;
543
544                         case 'mssql-odbc':
545                         case 'mssql':
546                                 $sql[] = "ALTER TABLE " . SESSIONS_TABLE . " ADD
547                                         session_admin smallint NOT NULL,
548                                         CONSTRAINT [DF_" . $table_prefix . "sessions_session_admin] DEFAULT (0) FOR [session_admin]";
549                                 break;
550
551                         case 'msaccess':
552                                 $sql[] = "ALTER TABLE " . SESSIONS_TABLE . " ADD
553                                         session_admin smallint NOT NULL";
554                                 break;
555                 }
556
557         case '.0.15':
558         case '.0.16':
559         case '.0.17':
560                 // Add tables for session keys
561                 switch (SQL_LAYER)
562                 {
563                         case 'mysql':
564                         case 'mysql4':
565                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id varchar(32) DEFAULT \'0\' NOT NULL, user_id mediumint(8) DEFAULT \'0\' NOT NULL, last_ip varchar(8) DEFAULT \'0\' NOT NULL, last_login int(11) DEFAULT \'0\' NOT NULL, PRIMARY KEY (key_id, user_id), KEY last_login (last_login))';
566                                 break;
567
568                         case 'mssql':
569                         case 'mssql-odbc':
570                                 $sql[] = 'CREATE TABLE [' . $table_prefix . 'sessions_keys] ([key_id] [char] (32) NOT NULL , [user_id] [int] NOT NULL , [last_ip] [char] (8) NOT NULL , [last_login] [int] NOT NULL) ON [PRIMARY]';
571
572                                 $sql[] = 'CREATE INDEX [IX_' . $table_prefix . 'sessions_keys] ON [' . $table_prefix . 'sessions_keys]([key_id], [user_id]) ON [PRIMARY]';
573                                 $sql[] = 'CREATE  INDEX [IX_' . $table_prefix . 'sessions_keys_1] ON [' . $table_prefix . 'sessions_keys]([last_login]) ON [PRIMARY]';
574                                 break;
575
576                         case 'msaccess':
577                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id char(32) NOT NULL, user_id int NOT NULL, last_ip char(8) NOT NULL, last_login int NOT NULL)';
578                                 $sql[] = 'ALTER TABLE ' . $table_prefix . 'sessions_keys ADD PRIMARY KEY (key_id, user_id)';
579                                 break;
580
581                         case 'postgresql':
582                                 $sql[] = 'CREATE TABLE ' . $table_prefix . 'sessions_keys (key_id char(32) DEFAULT \'0\' NOT NULL, user_id int4 DEFAULT \'0\' NOT NULL, last_ip char(8) DEFAULT \'0\' NOT NULL, last_login int4 DEFAULT \'0\' NOT NULL, CONSTRAINT ' . $table_prefix . 'sessions_keys_pkey PRIMARY KEY (key_id, user_id))';
583                                 $sql[] = 'CREATE INDEX last_login_' . $table_prefix . 'sessions_keys_index ON ' . $table_prefix . 'sessions_keys (last_login)';
584                                 break;
585                 }
586
587         case '.0.18':
588
589                 // Add login columns to user table
590                 switch (SQL_LAYER)
591                 {
592                         case 'mysql':
593                         case 'mysql4':
594                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
595                                         ADD COLUMN user_login_tries smallint(5) UNSIGNED DEFAULT '0' NOT NULL";
596                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
597                                         ADD COLUMN user_last_login_try int(11) DEFAULT '0' NOT NULL";
598                                 break;
599
600                         case 'postgresql':
601                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
602                                         ADD COLUMN user_login_tries int2";
603                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
604                                         ALTER COLUMN user_login_tries SET DEFAULT '0'";
605                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
606                                         ADD COLUMN user_last_login_try int4";
607                                 $sql[] = "ALTER TABLE " . USERS_TABLE . "
608                                         ALTER COLUMN user_last_login_try SET DEFAULT '0'";
609                                 break;
610
611                         case 'mssql-odbc':
612                         case 'mssql':
613                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
614                                         user_login_tries smallint NOT NULL,
615                                         CONSTRAINT [DF_" . $table_prefix . "users_user_login_tries] DEFAULT (0) FOR [user_login_tries]";
616                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
617                                         user_last_login_try int NOT NULL,
618                                         CONSTRAINT [DF_" . $table_prefix . "users_user_last_login_try] DEFAULT (0) FOR [user_last_login_try]";
619                                 break;
620
621                         case 'msaccess':
622                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
623                                         user_login_tries smallint NOT NULL";
624                                 $sql[] = "ALTER TABLE " . USERS_TABLE . " ADD
625                                         user_last_login_try int NOT NULL";
626                                 break;
627                 }
628
629                 break;
630 }
631
632 echo "<h2>Updating database schema</h2>\n";
633 echo "<p>Progress :: <b>";
634 flush();
635
636 $error_ary = array();
637 $errored = false;
638 if (count($sql))
639 {
640         for ($i = 0; $i < count($sql); $i++)
641         {
642                 _sql($sql[$i], $errored, $error_ary);
643         }
644
645         echo "</b> <b class=\"ok\">Done</b><br />Result &nbsp; :: \n";
646
647         if ($errored)
648         {
649                 echo " <b>Some queries failed, the statements and errors are listing below</b>\n<ul>";
650
651                 for ($i = 0; $i < count($error_ary['sql']); $i++)
652                 {
653                         echo "<li>Error :: <b>" . $error_ary['error_code'][$i]['message'] . "</b><br />";
654                         echo "SQL &nbsp; :: <b>" . $error_ary['sql'][$i] . "</b><br /><br /></li>";
655                 }
656
657                 echo "</ul>\n<p>This is probably nothing to worry about, update will continue. Should this fail to complete you may need to seek help at our development board. See <a href=\"docs\README.html\">README</a> for details on how to obtain advice.</p>\n";
658         }
659         else
660         {
661                 echo "<b>No errors</b>\n";
662         }
663 }
664 else
665 {
666         echo " No updates required</b></p>\n";
667 }
668
669 //
670 // Data updates
671 //
672 unset($sql);
673 $error_ary = array();
674 $errored = false;
675
676 echo "<h2>Updating data</h2>\n";
677 echo "<p>Progress :: <b>";
678 flush();
679
680 switch ($row['config_value'])
681 {
682         case '':
683                 $sql = "SELECT themes_id
684                         FROM " . THEMES_TABLE . "
685                         WHERE template_name = 'subSilver'";
686                 $result = _sql($sql, $errored, $error_ary);
687
688                 if ($row = $db->sql_fetchrow($result))
689                 {
690                         $theme_id = $row['themes_id'];
691
692                         $sql = "UPDATE " . THEMES_TABLE . "
693                                 SET head_stylesheet = 'subSilver.css', body_background = '', body_bgcolor = 'E5E5E5', body_text = '000000', body_link = '006699', body_vlink = '5493B4', body_alink = '', body_hlink = 'DD6900', tr_color1 = 'EFEFEF', tr_color2 = 'DEE3E7', tr_color3 = 'D1D7DC', tr_class1 = '', tr_class2 = '', tr_class3 = '', th_color1 = '98AAB1', th_color2 = '006699', th_color3 = 'FFFFFF', th_class1 = 'cellpic1.gif', th_class2 = 'cellpic3.gif', th_class3 = 'cellpic2.jpg', td_color1 = 'FAFAFA', td_color2 = 'FFFFFF', td_color3 = '', td_class1 = 'row1', td_class2 = 'row2', td_class3 = '', fontface1 = 'Verdana, Arial, Helvetica, sans-serif', fontface2 = 'Trebuchet MS', fontface3 = 'Courier, ''Courier New'', sans-serif', fontsize1 = 10, fontsize2 = 11, fontsize3 = 12, fontcolor1 = '444444', fontcolor2 = '006600', fontcolor3 = 'FFA34F', span_class1 = '', span_class2 = '', span_class3 = ''
694                                 WHERE themes_id = $theme_id";
695                         _sql($sql, $errored, $error_ary);
696
697                         $sql = "DELETE FROM " . THEMES_NAME_TABLE . "
698                                 WHERE themes_id = $theme_id";
699                         _sql($sql, $errored, $error_ary);
700
701                         $sql = "INSERT INTO " . THEMES_NAME_TABLE . " (themes_id, tr_color1_name, tr_color2_name, tr_color3_name, tr_class1_name, tr_class2_name, tr_class3_name, th_color1_name, th_color2_name, th_color3_name, th_class1_name, th_class2_name, th_class3_name, td_color1_name, td_color2_name, td_color3_name, td_class1_name, td_class2_name, td_class3_name, fontface1_name, fontface2_name, fontface3_name, fontsize1_name, fontsize2_name, fontsize3_name, fontcolor1_name, fontcolor2_name, fontcolor3_name, span_class1_name, span_class2_name, span_class3_name)
702                                 VALUES ($theme_id, 'The lightest row colour', 'The medium row color', 'The darkest row colour', '', '', '', 'Border round the whole page', 'Outer table border', 'Inner table border', 'Silver gradient picture', 'Blue gradient picture', 'Fade-out gradient on index', 'Background for quote boxes', 'All white areas', '', 'Background for topic posts', '2nd background for topic posts', '', 'Main fonts', 'Additional topic title font', 'Form fonts', 'Smallest font size', 'Medium font size', 'Normal font size (post body etc)', 'Quote & copyright text', 'Code text colour', 'Main table header text colour', '', '', '')";
703                         _sql($sql, $errored, $error_ary);
704                 }
705                 $db->sql_freeresult($result);
706
707                 $sql = "SELECT MIN(post_id) AS first_post_id, topic_id
708                         FROM " . POSTS_TABLE . "
709                         GROUP BY topic_id
710                         ORDER BY topic_id ASC";
711                 $result = _sql($sql, $errored, $error_ary);
712
713                 if ($row = $db->sql_fetchrow($result))
714                 {
715                         do
716                         {
717                                 $sql = "UPDATE " . TOPICS_TABLE . "
718                                         SET topic_first_post_id = " . $row['first_post_id'] . "
719                                         WHERE topic_id = " . $row['topic_id'];
720                                 _sql($sql, $errored, $error_ary);
721                         }
722                         while ($row = $db->sql_fetchrow($result));
723                 }
724                 $db->sql_freeresult($result);
725
726                 $sql = "SELECT DISTINCT u.user_id
727                         FROM " . USERS_TABLE . " u, " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa
728                         WHERE aa.auth_mod = 1
729                                 AND ug.group_id = aa.group_id
730                                 AND u.user_id = ug.user_id
731                                 AND u.user_level <> " . ADMIN;
732                 $result = _sql($sql, $errored, $error_ary);
733
734                 $mod_user = array();
735                 while ($row = $db->sql_fetchrow($result))
736                 {
737                         $mod_user[] = $row['user_id'];
738                 }
739                 $db->sql_freeresult($result);
740
741                 if (count($mod_user))
742                 {
743                         $sql = "UPDATE " . USERS_TABLE . "
744                                 SET user_level = " . MOD . "
745                                 WHERE user_id IN (" . implode(', ', $mod_user) . ")";
746                         _sql($sql, $errored, $error_ary);
747                 }
748
749                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
750                         VALUES ('server_name', 'www.myserver.tld')";
751                 _sql($sql, $errored, $error_ary);
752
753                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
754                         VALUES ('script_path', '/phpBB2/')";
755                 _sql($sql, $errored, $error_ary);
756
757                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
758                         VALUES ('server_port', '80')";
759                 _sql($sql, $errored, $error_ary);
760
761                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
762                         VALUES ('record_online_users', '1')";
763                 _sql($sql, $errored, $error_ary);
764
765                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
766                         VALUES ('record_online_date', '" . time() . "')";
767                 _sql($sql, $errored, $error_ary);
768
769         case 'RC-3':
770         case 'RC-4':
771         case '.0.0':
772         case '.0.1':
773                 if (SQL_LAYER == 'postgresql')
774                 {
775                         $sql = "SELECT user_id, user_timezone_old
776                                 FROM " . USERS_TABLE;
777                         $result = _sql($sql, $errored, $error_ary);
778
779                         while ($row = $db->sql_fetchrow($result))
780                         {
781                                 $sql = "UPDATE " . USERS_TABLE . "
782                                         SET user_timezone = " . $row['user_timezone_old'] . "
783                                         WHERE user_id = " . $row['user_id'];
784                                 _sql($sql, $errored, $error_ary);
785                         }
786                         $db->sql_freeresult($result);
787                 }
788
789                 $sql = "SELECT topic_id, topic_moved_id
790                         FROM " . TOPICS_TABLE . "
791                         WHERE topic_moved_id <> 0
792                                 AND topic_status = " . TOPIC_MOVED;
793                 $result = _sql($sql, $errored, $error_ary);
794
795                 $topic_ary = array();
796                 while ($row = $db->sql_fetchrow($result))
797                 {
798                         $topic_ary[$row['topic_id']] = $row['topic_moved_id'];
799                 }
800                 $db->sql_freeresult($result);
801
802                 while (list($topic_id, $topic_moved_id) = each($topic_ary))
803                 {
804                         $sql = "SELECT MAX(post_id) AS last_post, MIN(post_id) AS first_post, COUNT(post_id) AS total_posts
805                                 FROM " . POSTS_TABLE . "
806                                 WHERE topic_id = $topic_moved_id";
807                         $result = _sql($sql, $errored, $error_ary);
808
809                         $sql = ($row = $db->sql_fetchrow($result)) ? "UPDATE " . TOPICS_TABLE . "       SET topic_replies = " . ($row['total_posts'] - 1) . ", topic_first_post_id = " . $row['first_post'] . ", topic_last_post_id = " . $row['last_post'] . " WHERE topic_id = $topic_id" : "DELETE FROM " . TOPICS_TABLE . " WHERE topic_id = " . $row['topic_id'];
810                         _sql($sql, $errored, $error_ary);
811                 }
812
813                 unset($sql);
814
815                 sync('all forums');
816
817         case '.0.2':
818
819         case '.0.3':
820
821                 // Topics will resync automatically
822
823                 // Remove stop words from search match and search words
824                 $dirname = 'language';
825                 $dir = opendir($phpbb_root_path . $dirname);
826
827                 while ($file = readdir($dir))
828                 {
829                         if (preg_match("#^lang_#i", $file) && !is_file($phpbb_root_path . $dirname . "/" . $file) && !is_link($phpbb_root_path . $dirname . "/" . $file) && file_exists($phpbb_root_path . $dirname . "/" . $file . '/search_stopwords.txt'))
830                         {
831
832                                 $stopword_list = trim(preg_replace('#([\w\.\-_\+\'±µ-ÿ\\\]+?)[ \n\r]*?(,|$)#', '\'\1\'\2', str_replace("'", "\'", implode(', ', file($phpbb_root_path . $dirname . "/" . $file . '/search_stopwords.txt')))));
833
834                                 $sql = "SELECT word_id 
835                                         FROM " . SEARCH_WORD_TABLE . " 
836                                         WHERE word_text IN ($stopword_list)";
837                                 $result = _sql($sql, $errored, $error_ary);
838
839                                 $word_id_sql = '';
840                                 if ($row = $db->sql_fetchrow($result))
841                                 {
842                                         do
843                                         {
844                                                 $word_id_sql .= (($word_id_sql != '') ? ', ' : '') . $row['word_id'];
845                                         }
846                                         while ($row = $db->sql_fetchrow($result));
847
848                                         $sql = "DELETE FROM " . SEARCH_WORD_TABLE . " 
849                                                 WHERE word_id IN ($word_id_sql)";
850                                         _sql($sql, $errored, $error_ary);
851
852                                         $sql = "DELETE FROM " . SEARCH_MATCH_TABLE . " 
853                                                 WHERE word_id IN ($word_id_sql)";
854                                         _sql($sql, $errored, $error_ary);
855                                 }
856                                 $db->sql_freeresult($result);
857                         }
858                 }
859                 closedir($dir);
860
861                 // Mark common words ...
862                 remove_common('global', 4/10);
863
864                 // remove superfluous polls ... grab polls with topics then delete polls
865                 // not in that list
866                 $sql = "SELECT v.vote_id 
867                         FROM " . TOPICS_TABLE . " t, " . VOTE_DESC_TABLE . " v
868                         WHERE v.topic_id = t.topic_id";
869                 $result = _sql($sql, $errored, $error_ary);
870
871                 $vote_id_sql = '';
872                 if ($row = $db->sql_fetchrow($result))
873                 {
874                         do
875                         {
876                                 $vote_id_sql .= (($vote_id_sql != '') ? ', ' : '') . $row['vote_id'];
877                         }
878                         while ($row = $db->sql_fetchrow($result));
879
880                         $sql = "DELETE FROM " . VOTE_DESC_TABLE . " 
881                                 WHERE vote_id NOT IN ($vote_id_sql)";
882                         _sql($sql, $errored, $error_ary);
883
884                         $sql = "DELETE FROM " . VOTE_RESULTS_TABLE . " 
885                                 WHERE vote_id NOT IN ($vote_id_sql)";
886                         _sql($sql, $errored, $error_ary);
887
888                         $sql = "DELETE FROM " . VOTE_USERS_TABLE . " 
889                                 WHERE vote_id NOT IN ($vote_id_sql)";
890                         _sql($sql, $errored, $error_ary);
891                 }
892                 $db->sql_freeresult($result);
893
894                 // update pm counters
895                 $sql = "SELECT privmsgs_to_userid, COUNT(privmsgs_id) AS unread_count 
896                         FROM " . PRIVMSGS_TABLE . " 
897                         WHERE privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " 
898                         GROUP BY privmsgs_to_userid";
899                 $result = _sql($sql, $errored, $error_ary);
900
901                 if ($row = $db->sql_fetchrow($result))
902                 {
903                         $update_users = array();
904                         do
905                         {
906                                 $update_users[$row['unread_count']][] = $row['privmsgs_to_userid'];
907                         }
908                         while ($row = $db->sql_fetchrow($result));
909
910                         while (list($num, $user_ary) = each($update_users))
911                         {
912                                 $user_ids = implode(', ', $user_ary);
913
914                                 $sql = "UPDATE " . USERS_TABLE . " 
915                                         SET user_unread_privmsg = $num 
916                                         WHERE user_id IN ($user_ids)";
917                                 _sql($sql, $errored, $error_ary);
918                         }
919                         unset($update_list);
920                 }
921                 $db->sql_freeresult($result);
922
923                 $sql = "SELECT privmsgs_to_userid, COUNT(privmsgs_id) AS new_count 
924                         FROM " . PRIVMSGS_TABLE . " 
925                         WHERE privmsgs_type = " . PRIVMSGS_NEW_MAIL . " 
926                         GROUP BY privmsgs_to_userid";
927                 $result = _sql($sql, $errored, $error_ary);
928
929                 if ($row = $db->sql_fetchrow($result))
930                 {
931                         $update_users = array();
932                         do
933                         {
934                                 $update_users[$row['new_count']][] = $row['privmsgs_to_userid'];
935                         }
936                         while ($row = $db->sql_fetchrow($result));
937
938                         while (list($num, $user_ary) = each($update_users))
939                         {
940                                 $user_ids = implode(', ', $user_ary);
941
942                                 $sql = "UPDATE " . USERS_TABLE . " 
943                                         SET user_new_privmsg = $num 
944                                         WHERE user_id IN ($user_ids)";
945                                 _sql($sql, $errored, $error_ary);
946                         }
947                         unset($update_list);
948                 }
949                 $db->sql_freeresult($result);
950
951                 // Remove superfluous watched topics
952                 $sql = "SELECT t.topic_id 
953                         FROM " . TOPICS_TABLE . " t, " . TOPICS_WATCH_TABLE . " w
954                         WHERE w.topic_id = t.topic_id";
955                 $result = _sql($sql, $errored, $error_ary);
956
957                 $topic_id_sql = '';
958                 if ($row = $db->sql_fetchrow($result))
959                 {
960                         do
961                         {
962                                 $topic_id_sql .= (($topic_id_sql != '') ? ', ' : '') . $row['topic_id'];
963                         }
964                         while ($row = $db->sql_fetchrow($result));
965
966                         $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . " 
967                                 WHERE topic_id NOT IN ($topic_id_sql)";
968                         _sql($sql, $errored, $error_ary);
969                 }
970                 $db->sql_freeresult($result);
971
972                 // Reset any email addresses which are non-compliant ... something
973                 // not done in the upgrade script and thus which may affect some 
974                 // mysql users
975                 switch (SQL_LAYER)
976                 {
977                         case 'mysql':
978                                 $sql = "UPDATE " . USERS_TABLE . " 
979                                         SET user_email = '' 
980                                         WHERE user_email NOT REGEXP '^[a-zA-Z0-9_\+\.\-]+@.*[a-zA-Z0-9_\-]+\.[a-zA-Z]{2,}$'";
981                                 _sql($sql, $errored, $error_ary);
982                 }
983
984         case '.0.4':
985
986                 // Add the confirmation code switch ... save time and trouble elsewhere
987                 $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value)
988                         VALUES ('enable_confirm', '0')";
989                 _sql($sql, $errored, $error_ary);
990
991                 $sql = "INSERT INTO " . CONFIG_TABLE . " (config_name, config_value)
992                         VALUES ('sendmail_fix', '0')";
993                 _sql($sql, $errored, $error_ary);
994
995         case '.0.5':
996                 
997                 $sql = "SELECT user_id, username 
998                         FROM " . USERS_TABLE;
999                 $result = _sql($sql, $errored, $error_ary);
1000
1001                 while ($row = $db->sql_fetchrow($result))
1002                 {
1003                         if (!preg_match('#(&gt;)|(&lt;)|(&quot)|(&amp;)#', $row['username']))
1004                         {
1005                                 if ($row['username'] != htmlspecialchars($row['username']))
1006                                 {
1007                                         $sql = "UPDATE " . USERS_TABLE . "
1008                                                 SET username = '" . str_replace("'", "''", htmlspecialchars($row['username'])) . "'
1009                                                 WHERE user_id = " . $row['user_id'];
1010                                         _sql($sql, $errored, $error_ary);
1011                                 }
1012                         }
1013                 }
1014                 $db->sql_freeresult($result);
1015                 
1016         case '.0.6':
1017         case '.0.7':
1018         case '.0.8':
1019         case '.0.9':
1020         case '.0.10':
1021         case '.0.11':
1022         case '.0.12':
1023         case '.0.13':
1024         case '.0.14':
1025
1026                 $sql = 'UPDATE ' . USERS_TABLE . ' SET user_allowhtml = 1 WHERE user_id = ' . ANONYMOUS;
1027                 _sql($sql, $errored, $error_ary);
1028
1029         case '.0.15':
1030         case '.0.16':
1031         case '.0.17':
1032
1033                 $sql = 'UPDATE ' . USERS_TABLE . ' SET user_active = 0 WHERE user_id = ' . ANONYMOUS;
1034                 _sql($sql, $errored, $error_ary);
1035
1036                 $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value)
1037                         VALUES ('allow_autologin', '1')";
1038                 _sql($sql, $errored, $error_ary);
1039
1040                 $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value)
1041                         VALUES ('max_autologin_time', '0')";
1042                 _sql($sql, $errored, $error_ary);
1043                 
1044                 // We reset those having autologin enabled and forcing the re-assignment of a session id
1045                 $sql = 'DELETE FROM ' . SESSIONS_TABLE;
1046                 _sql($sql, $errored, $error_ary);
1047
1048         case '.0.18':
1049
1050                 $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value)
1051                         VALUES ('max_login_attempts', '5')";
1052                 _sql($sql, $errored, $error_ary);
1053
1054                 $sql = 'INSERT INTO ' . CONFIG_TABLE . " (config_name, config_value)
1055                         VALUES ('login_reset_time', '30')";
1056                 _sql($sql, $errored, $error_ary);
1057
1058                 break;
1059
1060         default:
1061                 echo " No updates where required</b></p>\n";
1062                 break;
1063 }
1064
1065 echo "<h2>Updating version and optimizing tables</h2>\n";
1066 echo "<p>Progress :: <b>";
1067 flush();
1068
1069 // update the version
1070 $sql = "UPDATE " . CONFIG_TABLE . "
1071         SET config_value = '$updates_to_version'
1072         WHERE config_name = 'version'";
1073 _sql($sql, $errored, $error_ary);
1074
1075 // Optimize/vacuum analyze the tables where appropriate 
1076 // this should be done for each version in future along with 
1077 // the version number update
1078 switch (SQL_LAYER)
1079 {
1080         case 'mysql':
1081         case 'mysql4':
1082                 $sql = 'OPTIMIZE TABLE ' . $table_prefix . 'auth_access, ' . $table_prefix . 'banlist, ' . $table_prefix . 'categories, ' . $table_prefix . 'config, ' . $table_prefix . 'disallow, ' . $table_prefix . 'forum_prune, ' . $table_prefix . 'forums, ' . $table_prefix . 'groups, ' . $table_prefix . 'posts, ' . $table_prefix . 'posts_text, ' . $table_prefix . 'privmsgs, ' . $table_prefix . 'privmsgs_text, ' . $table_prefix . 'ranks, ' . $table_prefix . 'search_results, ' . $table_prefix . 'search_wordlist, ' . $table_prefix . 'search_wordmatch, ' . $table_prefix . 'smilies, ' . $table_prefix . 'themes, ' . $table_prefix . 'themes_name, ' . $table_prefix . 'topics, ' . $table_prefix . 'topics_watch, ' . $table_prefix . 'user_group, ' . $table_prefix . 'users, ' . $table_prefix . 'vote_desc, ' . $table_prefix . 'vote_results, ' . $table_prefix . 'vote_voters, ' . $table_prefix . 'words';
1083                 _sql($sql, $errored, $error_ary);
1084                 break;
1085
1086         case 'postgresql':
1087                 _sql("VACUUM ANALYZE", $errored, $error_ary);
1088                 break;
1089 }
1090
1091 echo "</b> <b class=\"ok\">Done</b><br />Result &nbsp; :: \n";
1092
1093 if ($errored)
1094 {
1095         echo " <b>Some queries failed, the statements and errors are listing below</b>\n<ul>";
1096
1097         for ($i = 0; $i < count($error_ary['sql']); $i++)
1098         {
1099                 echo "<li>Error :: <b>" . $error_ary['error_code'][$i]['message'] . "</b><br />";
1100                 echo "SQL &nbsp; :: <b>" . $error_ary['sql'][$i] . "</b><br /><br /></li>";
1101         }
1102
1103         echo "</ul>\n<p>This is probably nothing to worry about, update will continue. Should this fail to complete you may need to seek help at our development board. See <a href=\"docs\README.html\">README</a> for details on how to obtain advice.</p>\n";
1104 }
1105 else
1106 {
1107         echo "<b>No errors</b>\n";
1108 }
1109
1110 echo "<h2>Update completed</h2>\n";
1111 echo "\n" . '<p style="color:red">Please make sure you have updated your board files too, this file is only updating your database.</p>';
1112 echo "\n<p>You should now visit the General Configuration settings page in the <a href=\"../admin/\">Administration Panel</a> and check the General Configuration of the board. If you updated from versions prior to RC-3 you <b>must</b> update some entries. If you do not do this emails sent from the board will contain incorrect information. Don't forget to delete this file!</p>\n";
1113
1114 ?>
1115
1116 <br clear="all" />
1117
1118 </body>
1119 </html>