[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/install/ -> upgrade.php (source)

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


Generated: Mon Jan 14 19:21:40 2013 Cross-referenced by PHPXref 0.7.1