Verzeichnisstruktur phpBB-2.0.0


Veröffentlicht
03.04.2002

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

upgrade.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 56.00 KiB


 0001  <?php
 0002  /***************************************************************************
 0003  *                                  upgrade.php
 0004  *                              -------------------
 0005  *     begin                : Wed Sep 05 2001
 0006  *     copyright            : (C) 2001 The phpBB Group
 0007  *     email                : support@phpbb.com
 0008  *
 0009  *     $Id$
 0010  *
 0011  ****************************************************************************/
 0012   
 0013  /***************************************************************************
 0014   *
 0015   *   This program is free software; you can redistribute it and/or modify
 0016   *   it under the terms of the GNU General Public License as published by
 0017   *   the Free Software Foundation; either version 2 of the License, or
 0018   *   (at your option) any later version.
 0019   *
 0020   ***************************************************************************/
 0021   
 0022  define('IN_PHPBB', true);
 0023   
 0024  $phpbb_root_path = './../';
 0025   
 0026  if ( !defined('INSTALLING') )
 0027  {
 0028      error_reporting  (E_ERROR | E_WARNING | E_PARSE); // This will NOT report uninitialized variables
 0029      set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
 0030   
 0031      //
 0032      // If we are being called from the install script then we don't need these
 0033      // as they are already included.
 0034      //
 0035      include($phpbb_root_path . 'extension.inc');
 0036      include($phpbb_root_path . 'config.'.$phpEx);
 0037      include($phpbb_root_path . 'includes/constants.'.$phpEx);
 0038      include($phpbb_root_path . 'includes/functions.'.$phpEx);
 0039   
 0040      if( defined("PHPBB_INSTALLED") )
 0041      {
 0042          redirect("../index.$phpEx");
 0043      }
 0044  }
 0045   
 0046  //
 0047  // Force the DB type to be MySQL
 0048  //
 0049  $dbms = 'mysql';
 0050   
 0051  include($phpbb_root_path . 'includes/db.'.$phpEx);
 0052  include($phpbb_root_path . 'includes/bbcode.'.$phpEx);
 0053  include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
 0054   
 0055  set_time_limit(0); // Unlimited execution time
 0056   
 0057  $months = array(
 0058      'Jan' => 1,
 0059      'Feb' => 2,
 0060      'Mar' => 3,
 0061      'Apr' => 4,
 0062      'May' => 5,
 0063      'Jun' => 6,
 0064      'Jul' => 7,
 0065      'Aug' => 8,
 0066      'Sep' => 9,
 0067      'Sept' => 9,
 0068      'Oct' => 10,
 0069      'Nov' => 11,
 0070      'Dec' => 12
 0071  );
 0072   
 0073  // ---------------
 0074  // Begin functions
 0075  //
 0076  function common_header()
 0077  {
 0078  ?>
 0079  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 0080  <html>
 0081  <head>
 0082  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 0083  <meta http-equiv="Content-Style-Type" content="text/css">
 0084  <style type="text/css">
 0085  <!--
 0086  /* Specifiy background images for selected styles
 0087     This can't be done within the external style sheet as NS4 sees image paths relative to
 0088     the page which called the style sheet (i.e. this page in the root phpBB directory)
 0089     whereas all other browsers see image paths relative to the style sheet. Stupid NS again!
 0090  */
 0091  th            { background-image: url('../templates/subSilver/images/cellpic3.gif') }
 0092  td.cat        { background-image: url('../templates/subSilver/images/cellpic1.gif') }
 0093  td.rowpic    { background-image: url('../templates/subSilver/images/cellpic2.jpg'); background-repeat: repeat-y }
 0094  td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom { background-image: url('../templates/subSilver/images/cellpic1.gif') }
 0095   
 0096  font,th,td,p,body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11pt }
 0097  a:link,a:active,a:visited { font-family: Verdana, Arial, Helvetica, sans-serif; color : #006699; font-size:11pt }
 0098  a:hover        { font-family: Verdana, Arial, Helvetica, sans-serif;  text-decoration: underline; color : #DD6900; font-size:11pt }
 0099  hr    { height: 0px; border: solid #D1D7DC 0px; border-top-width: 1px;}
 0100   
 0101  .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;}
 0102   
 0103  .ok {color:green}
 0104   
 0105  /* Import the fancy styles for IE only (NS4.x doesn't use the @import function) */
 0106  @import url("../templates/subSilver/formIE.css"); 
 0107  -->
 0108  </style>
 0109  </head>
 0110  <body bgcolor="#FFFFFF" text="#000000" link="#006699" vlink="#5584AA">
 0111   
 0112  <table width="100%" border="0" cellspacing="0" cellpadding="10" align="center"> 
 0113      <tr>
 0114          <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
 0115              <tr>
 0116                  <td><img src="../templates/subSilver/images/logo_phpBB.gif" border="0" alt="Forum Home" vspace="1" /></td>
 0117                  <td align="center" width="100%" valign="middle"><span class="maintitle">Upgrading to phpBB 2.0</span></td>
 0118              </tr>
 0119          </table></td>
 0120      </tr>
 0121  </table>
 0122   
 0123  <br clear="all" />
 0124   
 0125  <?
 0126      return;
 0127  }
 0128   
 0129  function common_footer()
 0130  {
 0131  ?>
 0132   
 0133  <br clear="all" />
 0134   
 0135  </body>
 0136  </html>
 0137  <?
 0138      return;
 0139  }
 0140   
 0141  function query($sql, $errormsg)
 0142  {
 0143      global $db;
 0144   
 0145      if ( !($result = $db->sql_query($sql)) )
 0146      {
 0147          print "<br><font color=\"red\">\n";
 0148          print "$errormsg<br>";
 0149   
 0150          $sql_error = $db->sql_error();
 0151          print $sql_error['code'] .": ". $sql_error['message']. "<br>\n";
 0152   
 0153          print "<pre>$sql</pre>";
 0154          print "</font>\n";
 0155   
 0156          return FALSE;
 0157      }
 0158      else
 0159      {
 0160          return $result;
 0161      }
 0162  }
 0163   
 0164  function smiley_replace($text = '')
 0165  {
 0166      global $db;
 0167   
 0168      static $search, $replace;
 0169   
 0170      // Did we get the smiley info in a previous call?
 0171      if ( !is_array($search) )
 0172      {
 0173          $sql = "SELECT code, smile_url
 0174              FROM smiles";
 0175          $result = query($sql, "Unable to get list of smilies from the DB");
 0176   
 0177          $smilies = $db->sql_fetchrowset($result);
 0178          @usort($smilies, 'smiley_sort');
 0179   
 0180          $search = array();
 0181          $replace = array();
 0182          for($i = 0; $i < count($smilies); $i++)
 0183          {
 0184              $search[] = '/<IMG SRC=".*?\/' . phpbb_preg_quote($smilies[$i]['smile_url'], '/') .'">/i';
 0185              $replace[] = $smilies[$i]['code'];
 0186          }
 0187      }
 0188   
 0189      return ( $text != '' ) ? preg_replace($search, $replace, $text) : '';
 0190      
 0191  }
 0192   
 0193  function get_schema()
 0194  {
 0195      global $table_prefix;
 0196   
 0197      $schemafile = file('schemas/mysql_schema.sql');
 0198      $tabledata = 0;
 0199   
 0200      for($i=0; $i < count($schemafile); $i++)
 0201      {
 0202          $line = $schemafile[$i];
 0203   
 0204          if ( preg_match('/^CREATE TABLE (\w+)/i', $line, $matches) )
 0205          {
 0206              // Start of a new table definition, set some variables and go to the next line.
 0207              $tabledata = 1;
 0208              // Replace the 'phpbb_' prefix by the user defined prefix.
 0209              $table = str_replace('phpbb_', $table_prefix, $matches[1]);
 0210              $table_def[$table] = "CREATE TABLE $table (\n";
 0211              continue;
 0212          }
 0213   
 0214          if ( preg_match('/^\);/', $line) )
 0215          {
 0216              // End of the table definition
 0217              // After this we will skip everything until the next 'CREATE' line
 0218              $tabledata = 0;
 0219              $table_def[$table] .= ')'; // We don't need the closing semicolon
 0220          }
 0221   
 0222          if ( $tabledata == 1 )
 0223          {
 0224              // We are inside a table definition, parse this line.
 0225              // Add the current line to the complete table definition:
 0226              $table_def[$table] .= $line;
 0227              if ( preg_match('/^\s*(\w+)\s+(\w+)\(([\d,]+)\)(.*)$/', $line, $matches) )
 0228              {
 0229                  // This is a column definition
 0230                  $field = $matches[1];
 0231                  $type = $matches[2];
 0232                  $size = $matches[3];
 0233   
 0234                  preg_match('/DEFAULT (NULL|\'.*?\')[,\s](.*)$/i', $matches[4], $match);
 0235                  $default = $match[1];
 0236   
 0237                  $notnull = ( preg_match('/NOT NULL/i', $matches[4]) ) ? 1 : 0;
 0238                  $auto_increment = ( preg_match('/auto_increment/i', $matches[4]) ) ? 1 : 0;
 0239   
 0240                  $field_def[$table][$field] = array(
 0241                      'type' => $type,
 0242                      'size' => $size,
 0243                      'default' => $default,
 0244                      'notnull' => $notnull,
 0245                      'auto_increment' => $auto_increment
 0246                  );
 0247              }
 0248              
 0249              if ( preg_match('/\s*PRIMARY\s+KEY\s*\((.*)\).*/', $line, $matches) )
 0250              {
 0251                  // Primary key
 0252                  $key_def[$table]['PRIMARY'] = $matches[1];
 0253              }
 0254              else if ( preg_match('/\s*KEY\s+(\w+)\s*\((.*)\)/', $line, $matches) )
 0255              {
 0256                  // Normal key
 0257                  $key_def[$table][$matches[1]] = $matches[2];
 0258              }
 0259              else if ( preg_match('/^\s*(\w+)\s*(.*?),?\s*$/', $line, $matches) )
 0260              {
 0261                  // Column definition
 0262                  $create_def[$table][$matches[1]] = $matches[2];
 0263              }
 0264              else
 0265              {
 0266                  // It's a bird! It's a plane! It's something we didn't expect ;(
 0267              }
 0268          }
 0269      }
 0270   
 0271      $schema['field_def'] = $field_def;
 0272      $schema['table_def'] = $table_def;
 0273      $schema['create_def'] = $create_def;
 0274      $schema['key_def'] = $key_def;
 0275   
 0276      return $schema;
 0277  }
 0278   
 0279  function get_inserts()
 0280  {
 0281      global $table_prefix;
 0282   
 0283      $insertfile = file('schemas/mysql_basic.sql');
 0284   
 0285      for($i = 0; $i < count($insertfile); $i++)
 0286      {
 0287          if ( preg_match('/(INSERT INTO (\w+)\s.*);/i', str_replace('phpbb_', $table_prefix, $insertfile[$i]), $matches) )
 0288          {
 0289              $returnvalue[$matches[2]][] = $matches[1];
 0290          }
 0291      }
 0292   
 0293      return $returnvalue;
 0294  }
 0295   
 0296  function lock_tables($state, $tables= '')
 0297  {
 0298      if ( $state == 1 )
 0299      {
 0300          if ( is_array($tables) )
 0301          {
 0302              $tables = join(' WRITE, ', $tables);
 0303          }
 0304   
 0305          query("LOCK TABLES $tables WRITE", "Couldn't do: $sql");
 0306      }
 0307      else
 0308      {
 0309          query("UNLOCK TABLES", "Couldn't unlock all tables");
 0310      }
 0311  }
 0312   
 0313  function output_table_content($content)
 0314  {
 0315      echo $content . "\n";
 0316   
 0317      return;
 0318  }
 0319   
 0320  //
 0321  // Nathan's bbcode2 conversion routines
 0322  //
 0323  function bbdecode($message)
 0324  {
 0325      // Undo [code]
 0326      $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>';
 0327      $code_end_html = '</PRE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode End -->';
 0328      $message = str_replace($code_start_html, '[code]', $message);
 0329      $message = str_replace($code_end_html, '[/code]', $message);
 0330   
 0331      // Undo [quote]
 0332      $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>';
 0333      $quote_end_html = '</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode Quote End -->';
 0334      $message = str_replace($quote_start_html, '[quote]', $message);
 0335      $message = str_replace($quote_end_html, '[/quote]', $message);
 0336   
 0337      // Undo [b] and [i]
 0338      $message = preg_replace("#<!-- BBCode Start --><B>(.*?)</B><!-- BBCode End -->#s", "[b]\\1[/b]", $message);
 0339      $message = preg_replace("#<!-- BBCode Start --><I>(.*?)</I><!-- BBCode End -->#s", "[i]\\1[/i]", $message);
 0340   
 0341      // Undo [url] (long form)
 0342      $message = preg_replace("#<!-- BBCode u2 Start --><A HREF=\"([a-z]+?://)(.*?)\" TARGET=\"_blank\">(.*?)</A><!-- BBCode u2 End -->#s", "[url=\\1\\2]\\3[/url]", $message);
 0343   
 0344      // Undo [url] (short form)
 0345      $message = preg_replace("#<!-- BBCode u1 Start --><A HREF=\"([a-z]+?://)(.*?)\" TARGET=\"_blank\">(.*?)</A><!-- BBCode u1 End -->#s", "[url]\\3[/url]", $message);
 0346   
 0347      // Undo [email]
 0348      $message = preg_replace("#<!-- BBCode Start --><A HREF=\"mailto:(.*?)\">(.*?)</A><!-- BBCode End -->#s", "[email]\\1[/email]", $message);
 0349   
 0350      // Undo [img]
 0351      $message = preg_replace("#<!-- BBCode Start --><IMG SRC=\"(.*?)\" BORDER=\"0\"><!-- BBCode End -->#s", "[img]\\1[/img]", $message);
 0352   
 0353      // Undo lists (unordered/ordered)
 0354   
 0355      // <li> tags:
 0356      $message = str_replace('<!-- BBCode --><LI>', '[*]', $message);
 0357   
 0358      // [list] tags:
 0359      $message = str_replace('<!-- BBCode ulist Start --><UL>', '[list]', $message);
 0360   
 0361      // [list=x] tags:
 0362      $message = preg_replace('#<!-- BBCode olist Start --><OL TYPE=([A1])>#si', "[list=\\1]", $message);
 0363   
 0364      // [/list] tags:
 0365      $message = str_replace('</UL><!-- BBCode ulist End -->', '[/list]', $message);
 0366      $message = str_replace('</OL><!-- BBCode olist End -->', '[/list]', $message);
 0367   
 0368      return $message;
 0369  }
 0370   
 0371  //
 0372  // Alternative for in_array() which is only available in PHP4
 0373  //
 0374  function inarray($needle, $haystack)
 0375  { 
 0376      for( $i = 0 ; $i < sizeof($haystack) ; $i++ )
 0377      { 
 0378          if ( $haystack[$i] == $needle )
 0379          { 
 0380              return true; 
 0381          } 
 0382      } 
 0383   
 0384      return false; 
 0385  }
 0386   
 0387  function end_step($next)
 0388  {
 0389      print "<hr /><a href=\"$PHP_SELF?next=$next\">Next step: <b>$next</b></a><br /><br />\n";
 0390      exit;
 0391  }
 0392  //
 0393  // End functions
 0394  // -------------
 0395   
 0396   
 0397  //
 0398  // Start at the beginning if the user hasn't specified a specific starting point.
 0399  //
 0400  $next = ( isset($HTTP_GET_VARS['next']) ) ? $HTTP_GET_VARS['next'] : 'start';
 0401   
 0402  // If debug is set we'll do all steps in one go.
 0403  $debug = 1;
 0404   
 0405  // Parse the MySQL schema file into some arrays.
 0406  $schema = get_schema();
 0407   
 0408  $table_def = $schema['table_def'];
 0409  $field_def = $schema['field_def'];
 0410  $key_def = $schema['key_def'];
 0411  $create_def = $schema['create_def'];
 0412   
 0413  //
 0414  // Get mysql_basic data
 0415  //
 0416  $inserts = get_inserts();
 0417   
 0418  //
 0419  // Get smiley data
 0420  //
 0421  smiley_replace();
 0422   
 0423  common_header();
 0424   
 0425  if ( !empty($next) )
 0426  {
 0427      switch($next)
 0428      {
 0429          case 'start':
 0430              end_step('initial_drops');
 0431   
 0432          case 'initial_drops':
 0433              print " * Dropping sessions and themes tables :: ";
 0434              flush();
 0435   
 0436              query("DROP TABLE sessions", "Couldn't drop table 'sessions'");
 0437              query("DROP TABLE themes", "Couldn't drop table 'themes'");   
 0438   
 0439              print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0440   
 0441              end_step('mod_old_tables');
 0442   
 0443          case 'mod_old_tables':
 0444              $modtables = array(
 0445                  "banlist" => "banlist",
 0446                  "catagories" => "categories",
 0447                  "config" => "old_config",
 0448                  "forums" => "forums",
 0449                  "disallow" => "disallow",
 0450                  "posts" => "posts",
 0451                  "posts_text" => "posts_text",
 0452                  "priv_msgs" => "privmsgs",
 0453                  "ranks" => "ranks",
 0454                  "smiles" => "smilies",
 0455                  "topics" => "topics",
 0456                  "users" => "users",
 0457                  "words" => "words"
 0458              );
 0459   
 0460              while( list($old, $new) = each($modtables) )
 0461              {
 0462                  $result = query("SHOW INDEX FROM $old", "Couldn't get list of indices for table $old");
 0463   
 0464                  while( $row = $db->sql_fetchrow($result) )
 0465                  {
 0466                      $index = $row['Key_name'];
 0467                      if ( $index != 'PRIMARY' )
 0468                      {
 0469                          query("ALTER TABLE $old DROP INDEX $index", "Couldn't DROP INDEX $old.$index");
 0470                      }
 0471                  }
 0472   
 0473                  // Rename table
 0474                  $new = $table_prefix . $new;
 0475   
 0476                  print " * Renaming '$old' to '$new' :: ";
 0477                  flush();
 0478                  query("ALTER TABLE $old RENAME $new", "Failed to rename $old to $new");
 0479                  print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0480                  
 0481              }
 0482              end_step('create_tables');
 0483              
 0484          case 'create_tables':
 0485              // Create array with tables in 'old' database
 0486              $result = query('SHOW TABLES', "Couldn't get list of current tables");
 0487   
 0488              while( $table = $db->sql_fetchrow($result) )
 0489              {
 0490                  $currenttables[] = $table[0];
 0491              }
 0492              
 0493              // Check what tables we need to CREATE
 0494              while( list($table, $definition) = each($table_def) )
 0495              {
 0496                  if ( !inarray($table, $currenttables) )
 0497                  {
 0498                      print " * Creating $table :: ";
 0499   
 0500                      query($definition, "Couldn't create table $table");
 0501   
 0502                      print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0503                  }
 0504              }
 0505              
 0506              end_step('create_config');
 0507              
 0508          case 'create_config':
 0509              print " * Inserting new values into new layout config table :: ";
 0510   
 0511              @reset($inserts);
 0512              while( list($table, $inserts_table) = each($inserts) )
 0513              {
 0514                  if ( $table == CONFIG_TABLE )
 0515                  {
 0516                      $per_pct = ceil( count($inserts_table) / 40 );
 0517                      $inc = 0;
 0518   
 0519                      while( list($nr, $insert) = each($inserts_table) )
 0520                      {
 0521                          query($insert, "Couldn't insert value into config table");
 0522   
 0523                          $inc++;
 0524                          if ( $inc == $per_pct )
 0525                          {
 0526                              print ".";
 0527                              flush();
 0528                              $inc = 0;
 0529                          }
 0530                      }
 0531                  }
 0532              }
 0533   
 0534              print " <span class=\"ok\"><b>OK</b></span><br />\n";
 0535   
 0536              end_step('convert_config');
 0537              
 0538          case 'convert_config':
 0539              print " * Converting configuration table :: ";
 0540   
 0541              $sql = "SELECT * 
 0542                  FROM $table_prefix" . "old_config";
 0543              $result = query($sql, "Couldn't get info from old config table");
 0544   
 0545              $oldconfig = $db->sql_fetchrow($result);
 0546   
 0547              //
 0548              // We don't need several original config types and two others
 0549              // have changed name ... so take account of this.
 0550              //
 0551              $ignore_configs = array("selected", "admin_passwd", "override_themes", "allow_sig");
 0552              $rename_configs = array(
 0553                  "email_from" => "board_email",
 0554                  "email_sig" => "board_email_sig"
 0555              );
 0556   
 0557              while( list($name, $value) = each($oldconfig) )
 0558              {
 0559                  if ( is_int($name) )
 0560                  {
 0561                      continue;
 0562                  }
 0563   
 0564                  if ( !inarray($name, $ignore_configs) )
 0565                  {
 0566                      $name = ( !empty($rename_configs[$name]) ) ? $rename_configs[$name] : $name;
 0567                      
 0568                      // phpBB 1.x has some problems with escaping strings in the database. Try to correct for
 0569                      // this by removing all slashes and then escaping once.
 0570                      $sql = "REPLACE INTO " . CONFIG_TABLE . " (config_name, config_value) 
 0571                          VALUES ('$name', '".addslashes(stripslashes(stripslashes($value)))."')";
 0572                      query($sql, "Couldn't update config table with values from old config table");
 0573                  }
 0574              }
 0575              
 0576              $sql = "UPDATE " . CONFIG_TABLE . " 
 0577                  SET config_value = 'dutch' 
 0578                  WHERE config_name = 'default_lang' && config_value = 'nederlands'";
 0579              query($sql, "Couldn't rename 'nederlands' to 'dutch' in config table");
 0580              
 0581              print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0582              end_step('convert_ips');
 0583   
 0584          case 'convert_ips':
 0585              $names = array( 
 0586                  POSTS_TABLE => array(
 0587                      'id' => 'post_id',
 0588                      'field' => 'poster_ip'
 0589                  ), 
 0590                  PRIVMSGS_TABLE => array( 
 0591                      'id' => 'msg_id', 
 0592                      'field' => 'poster_ip'
 0593                  ), 
 0594                  BANLIST_TABLE => array( 
 0595                      'id' => 'ban_id', 
 0596                      'field' => 'ban_ip'
 0597                  )
 0598              );
 0599   
 0600              lock_tables(1, array(POSTS_TABLE, PRIVMSGS_TABLE, BANLIST_TABLE));
 0601   
 0602              $batchsize = 2000;
 0603              while( list($table, $data_array) = each($names) )
 0604              {
 0605                  $sql = "SELECT MAX(" . $data_array['id'] . ") AS max_id 
 0606                      FROM $table";
 0607                  $result = query($sql, "Couldn't obtain ip data from $table (" . $fields . ")");
 0608   
 0609                  $row = $db->sql_fetchrow($result);
 0610   
 0611                  $maxid = $row['max_id'];
 0612   
 0613                  for($i = 0; $i <= $maxid; $i += $batchsize)
 0614                  {
 0615                      $batchstart = $i;
 0616                      $batchend = $i + $batchsize;
 0617   
 0618                      $field_id = $data_array['id'];
 0619                      $field = $data_array['field'];
 0620   
 0621                      print " * Converting IP format '" . $field . "' / '$table' ( $batchstart to $batchend ) :: ";
 0622                      flush();
 0623   
 0624                      $sql = "SELECT $field_id, $field 
 0625                          FROM $table 
 0626                          WHERE $field_id 
 0627                              BETWEEN $batchstart 
 0628                                  AND $batchend";
 0629                      $result = query($sql, "Couldn't obtain ip data from $table (" . $fields . ")");
 0630   
 0631                      $per_pct = ceil( $db->sql_numrows($result) / 40 );
 0632                      $inc = 0;
 0633   
 0634                      while( $row = $db->sql_fetchrow($result) )
 0635                      {
 0636                          $sql = "UPDATE $table 
 0637                              SET $field = '" . encode_ip($row[$field]) . "' 
 0638                              WHERE $field_id = " . $row[$field_id];
 0639                          query($sql, "Couldn't convert IP format of $field in $table with $field_id of " . $rowset[$field_id]);
 0640   
 0641                          $inc++;
 0642                          if ( $inc == $per_pct )
 0643                          {
 0644                              print ".";
 0645                              flush();
 0646                              $inc = 0;
 0647                          }
 0648                      }
 0649   
 0650                      print " <span class=\"ok\"><b>OK</b></span><br />\n";
 0651                  }
 0652              }
 0653   
 0654              lock_tables(0);
 0655              end_step('convert_dates');
 0656   
 0657          case 'convert_dates':
 0658              $names = array(
 0659                  POSTS_TABLE => array('post_time'),
 0660                  TOPICS_TABLE => array('topic_time'), 
 0661                  PRIVMSGS_TABLE => array('msg_time')
 0662              );
 0663   
 0664              lock_tables(1, array(POSTS_TABLE, TOPICS_TABLE, PRIVMSGS_TABLE));
 0665   
 0666              while( list($table, $fields) = each($names) )
 0667              {
 0668                  print " * Converting date format of $fields[$i] in $table :: ";
 0669                  flush();
 0670   
 0671                  for($i = 0; $i < count($fields); $i++)
 0672                  {
 0673                      $sql = "UPDATE $table 
 0674                          SET " . $fields[$i] . " = UNIX_TIMESTAMP(" . $fields[$i] . ")";
 0675                      query($sql, "Couldn't convert date format of $table(" . $fields[$i] . ")");
 0676                  }
 0677   
 0678                  print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0679              }
 0680   
 0681              lock_tables(0);
 0682              end_step('fix_addslashes');
 0683   
 0684          case 'fix_addslashes':
 0685              $slashfields[TOPICS_TABLE] = array('topic_title');
 0686              $slashfields[FORUMS_TABLE] = array('forum_desc', 'forum_name');
 0687              $slashfields[CATEGORIES_TABLE] = array('cat_title');
 0688              $slashfields[WORDS_TABLE] = array('word', 'replacement');
 0689              $slashfields[RANKS_TABLE] = array('rank_title');
 0690              $slashfields[DISALLOW_TABLE] = array('disallow_username');
 0691   
 0692              //convert smilies?
 0693              $slashes = array(
 0694                  "\\'" => "'",
 0695                  "\\\"" => "\"",
 0696                  "\\\\" => "\\");
 0697              $slashes = array(
 0698                  "\\'" => "'",
 0699                  "\\\"" => "\"",
 0700                  "\\\\" => "\\");
 0701   
 0702              lock_tables(1, array(TOPICS_TABLE, FORUMS_TABLE, CATEGORIES_TABLE, WORDS_TABLE, RANKS_TABLE, DISALLOW_TABLE, SMILIES_TABLE));
 0703   
 0704              while( list($table, $fields) = each($slashfields) )
 0705              {
 0706                  print " * Removing slashes from $table table :: ";
 0707                  flush();
 0708   
 0709                  while( list($nr, $field) = each($fields) )
 0710                  {
 0711                      @reset($slashes);
 0712                      while( list($search, $replace) = each($slashes) )
 0713                      {
 0714                          $sql = "UPDATE $table 
 0715                              SET $field = REPLACE($field, '" . addslashes($search) . "', '" . addslashes($replace) . "')";
 0716                          query($sql, "Couldn't remove extraneous slashes from the old data.");
 0717                      }
 0718                  }
 0719   
 0720                  print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0721              }
 0722   
 0723              lock_tables(0);
 0724              end_step('remove_topics');
 0725   
 0726          case 'remove_topics':
 0727              print " * Removing posts with no corresponding topics :: ";
 0728              flush();
 0729   
 0730              $sql = "SELECT p.post_id 
 0731                  FROM " . POSTS_TABLE . " p 
 0732                  LEFT JOIN " . TOPICS_TABLE . " t ON p.topic_id = t.topic_id  
 0733                  WHERE t.topic_id IS NULL";
 0734              $result = query($sql, "Couldn't obtain list of deleted topics");
 0735              
 0736              $post_total = $db->sql_numrows($result);
 0737   
 0738              if ( $post_total )
 0739              {
 0740                  $post_id_ary = array();
 0741                  while( $row = $db->sql_fetchrow($result) )
 0742                  {
 0743                      $post_id_ary[] = $row['post_id'];
 0744                  }
 0745   
 0746                  $sql = "DELETE FROM " . POSTS_TABLE . "  
 0747                      WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
 0748                  query($sql, "Couldn't update posts to remove deleted user poster_id values");
 0749   
 0750                  $sql = "DELETE FROM " . POSTS_TEXT_TABLE . "
 0751                      WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
 0752                  query($sql, "Couldn't update posts to remove deleted user poster_id values");
 0753              }
 0754   
 0755              echo "<span class=\"ok\"><b>OK</b></span> ( Removed $post_total posts )<br />\n";
 0756              end_step('convert_users');
 0757   
 0758          case 'convert_users':
 0759              //
 0760              // Completely remove old soft-deleted users
 0761              //
 0762              $sql = "DELETE FROM " . USERS_TABLE . " 
 0763                  WHERE user_level = -1";
 0764              query($sql, "Couldn't delete old soft-deleted users");
 0765   
 0766              $sql = "SELECT COUNT(*) AS total, MAX(user_id) AS maxid 
 0767                  FROM " . USERS_TABLE;
 0768              $result = query($sql, "Couldn't get max user_id.");
 0769   
 0770              $row = $db->sql_fetchrow($result);
 0771   
 0772              $totalposts = $row['total'];
 0773              $maxid = $row['maxid'];
 0774   
 0775              $sql = "ALTER TABLE " . USERS_TABLE . " 
 0776                  ADD user_sig_bbcode_uid CHAR(10),
 0777                  MODIFY user_sig text";
 0778              query($sql, "Couldn't add user_sig_bbcode_uid field to users table");
 0779   
 0780              $super_mods = array();
 0781              $first_admin = -2;
 0782   
 0783              $batchsize = 1000;
 0784              for($i = -1; $i <= $maxid; $i += $batchsize)
 0785              {
 0786                  $batchstart = $i;
 0787                  $batchend = $i + $batchsize;
 0788                  
 0789                  print " * Converting Users ( $batchstart to $batchend ) :: ";
 0790                  flush();
 0791   
 0792                  $sql = "SELECT * 
 0793                      FROM " . USERS_TABLE . " 
 0794                      WHERE user_id 
 0795                          BETWEEN $batchstart 
 0796                              AND $batchend";
 0797                  $result = query($sql, "Couldn't get ". USERS_TABLE .".user_id $batchstart to $batchend");
 0798   
 0799                  // Array with user fields that we want to check for invalid data (to few characters)
 0800                  $checklength = array(
 0801                      'user_occ',
 0802                      'user_website',
 0803                      'user_email',
 0804                      'user_from',
 0805                      'user_intrest',
 0806                      'user_aim',
 0807                      'user_yim',
 0808                      'user_msnm');
 0809   
 0810                  lock_tables(1, array(USERS_TABLE, GROUPS_TABLE, USER_GROUP_TABLE, POSTS_TABLE));
 0811   
 0812                  $per_pct = ceil( $db->sql_numrows($result) / 40 );
 0813                  $inc = 0;
 0814   
 0815                  while( $row = $db->sql_fetchrow($result) )
 0816                  {
 0817                      $sql = "INSERT INTO " . GROUPS_TABLE . " (group_name, group_description, group_single_user) 
 0818                          VALUES ('" . addslashes($row['username']) . "', 'Personal User', 1)";
 0819                      query($sql, "Wasn't able to insert user ".$row['user_id']." into table ".GROUPS_TABLE);
 0820   
 0821                      $group_id = $db->sql_nextid();
 0822   
 0823                      $sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)    
 0824                          VALUES ($group_id, " . $row['user_id'] . ", 0)";
 0825                      query($sql, "Wasn't able to insert user ".$row['user_id']." into table ".USER_GROUP_TABLE);
 0826   
 0827                      if ( is_int($row['user_regdate']) )
 0828                      {
 0829                          // We already converted this post to the new style BBcode, skip this post.
 0830                          continue;
 0831                      }
 0832   
 0833                      //
 0834                      // Nathan's bbcode2 conversion
 0835                      //
 0836   
 0837                      // undo 1.2.x encoding..
 0838                      $row['user_sig'] = bbdecode(stripslashes($row['user_sig']));
 0839                      $row['user_sig'] = undo_make_clickable($row['user_sig']);
 0840                      $row['user_sig'] = str_replace("<BR>", "\n", $row['user_sig']);
 0841   
 0842                      // make a uid
 0843                      $uid = make_bbcode_uid();
 0844   
 0845                      // do 2.x first-pass encoding..
 0846                      $row['user_sig'] = bbencode_first_pass($row['user_sig'], $uid);
 0847                      $row['user_sig'] = addslashes($row['user_sig']);
 0848   
 0849                      // Check for invalid info like '-' and '?' for a lot of fields
 0850                      @reset($checklength);
 0851                      while($field = each($checklength))
 0852                      {
 0853                          $row[$field[1]] = strlen($row[$field[1]]) < 3 ? '' : $row[$field[1]];
 0854                      }
 0855   
 0856                      preg_match('/(.*?) (\d{1,2}), (\d{4})/', $row['user_regdate'], $parts);
 0857                      $row['user_regdate'] = gmmktime(0, 0, 0, $months[$parts[1]], $parts[2], $parts[3]);
 0858   
 0859                      $website = $row['user_website'];
 0860                      if ( substr(strtolower($website), 0, 7) != "http://" )
 0861                      {
 0862                          $website = "http://" . $website;
 0863                      }
 0864                      if( strtolower($website) == 'http://' )
 0865                      {
 0866                          $website = '';
 0867                      }
 0868                      $row['user_website'] = addslashes($website);
 0869                      
 0870                      $row['user_icq'] = (ereg("^[0-9]+$", $row['user_icq'])) ? $row['user_icq'] : '';
 0871                      @reset($checklength);
 0872   
 0873                      while($field = each($checklength))
 0874                      {
 0875                          if ( strlen($row[$field[1]]) < 3 )
 0876                          {
 0877                              $row[$field[1]] = '';
 0878                          }
 0879                          $row[$field[1]] = addslashes($row[$field[1]]);
 0880                      }
 0881                      
 0882                      //
 0883                      // Is user a super moderator?
 0884                      //
 0885                      if( $row['user_level'] == 3 )
 0886                      {
 0887                          $super_mods[] = $row['user_id'];
 0888                      }
 0889   
 0890                      $row['user_level'] = ( $row['user_level'] == 4 ) ? ADMIN : USER;
 0891   
 0892                      //
 0893                      // Used to define a 'practical' group moderator user_id
 0894                      // for super mods a little latter.
 0895                      //
 0896                      if( $first_admin == -2 && $row['user_level'] == ADMIN )
 0897                      {
 0898                          $first_admin = $row['user_id'];
 0899                      }
 0900   
 0901                      //
 0902                      // Dutch language files have been renamed from 'nederlands' to 'dutch'
 0903                      //
 0904                      if( $row['user_lang'] == 'nederlands' )
 0905                      {
 0906                          $row['user_lang'] = 'dutch';
 0907                      }
 0908   
 0909                      $sql = "UPDATE " . USERS_TABLE . " 
 0910                          SET 
 0911                              user_sig = '" . $row['user_sig'] . "',
 0912                              user_sig_bbcode_uid = '$uid', 
 0913                              user_regdate = '" . $row['user_regdate'] . "',
 0914                              user_website = '" . $row['user_website'] . "',
 0915                              user_occ = '" . $row['user_occ'] . "',
 0916                              user_email = '" . $row['user_email'] . "',
 0917                              user_from = '" . $row['user_from'] . "',
 0918                              user_intrest = '" . $row['user_intrest'] . "', 
 0919                              user_aim = '" . $row['user_aim'] . "',
 0920                              user_yim = '" . $row['user_yim'] . "',
 0921                              user_msnm = '" . $row['user_msnm'] . "',
 0922                              user_level = '" . $row['user_level'] . "', 
 0923                              user_desmile = NOT(user_desmile), 
 0924                              user_bbcode = 1, 
 0925                              user_theme = 1 
 0926                          WHERE user_id = " . $row['user_id'];
 0927                      query($sql, "Couldn't update ".USERS_TABLE." table with new BBcode and regdate for user_id ".$row['user_id']);
 0928   
 0929                      $inc++;
 0930                      if ( $inc == $per_pct )
 0931                      {
 0932                          print ".";
 0933                          flush();
 0934                          $inc = 0;
 0935                      }
 0936                  }
 0937   
 0938                  // Set any non-standard (like) email addresses to nothing
 0939                  // could do this above as a preg_ but this one query may
 0940                  // be faster
 0941                  $sql = "UPDATE " . USERS_TABLE . " 
 0942                      SET user_email = '' 
 0943                      WHERE user_email NOT REGEXP '^[a-zA-Z0-9_\+\.\-]+@.*[a-zA-Z0-9\-_]+\.[a-zA-Z]{2,}$'";
 0944                  query($sql, "Couldn't update ".USERS_TABLE." table non-standard user_email entries");
 0945   
 0946                  print " <span class=\"ok\"><b>OK</b></span><br />\n";
 0947   
 0948                  lock_tables(0);
 0949              }
 0950   
 0951              //
 0952              // Handle super-mods, create hidden group for them
 0953              //
 0954              // Iterate trough access table
 0955              if( count($super_mods) && $first_admin != -2 )
 0956              {
 0957                  print "\n<br />\n * Creating new group for super moderators :: ";
 0958                  flush();
 0959   
 0960                  $sql = "INSERT INTO " . GROUPS_TABLE . " (group_type, group_name, group_description, group_moderator, group_single_user)
 0961                      VALUES (" . GROUP_HIDDEN . ", 'Super Moderators', 'Converted super moderators', $first_admin, 0)";
 0962                  $result = query($sql, "Couldn't create group for ".$row['forum_name']);
 0963   
 0964                  $group_id = $db->sql_nextid();
 0965   
 0966                  if ( $group_id <= 0 )
 0967                  {
 0968                      print "<font color=\"red\">Group creation failed. Aborting creation of groups...<br></font>\n";
 0969                      continue 2;
 0970                  }
 0971   
 0972                  print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0973   
 0974                  print " * Updating auth_access for super moderator group :: ";
 0975                  flush();
 0976   
 0977                  $sql = "SELECT forum_id 
 0978                      FROM " . FORUMS_TABLE;
 0979                  $result = query($sql, "Couldn't obtain forum_id list");
 0980   
 0981                  while( $row = $db->sql_fetchrow($result) )
 0982                  {
 0983                      $sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_mod)
 0984                          VALUES ($group_id, " . $row['forum_id'] . ", 1)";
 0985                      $result_insert = query($sql, "Unable to set group auth access for super mods.");
 0986                  }
 0987   
 0988                  for($i = 0; $i < count($super_mods); $i++)
 0989                  {
 0990                      $sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
 0991                          VALUES ($group_id, " . $super_mods[$i] . ", 0)";
 0992                      query($sql, "Unable to add user_id $user_id to group_id $group_id (super mods)<br>\n");
 0993                  }
 0994              
 0995                  print "<span class=\"ok\"><b>OK</b></span><br />\n";
 0996              }
 0997   
 0998              end_step('convert_posts');
 0999   
 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   
 1938  print "<br />If the upgrade completed without error you may click <a href=\"./../index.$phpEx\">Here</a> to proceed to the index<br />";
 1939   
 1940  common_footer();
 1941   
 1942  ?>