", "[*]", $message);
+
+ // [list] tags:
+ $message = str_replace("", "[list]", $message);
+
+ // [list=x] tags:
+ $message = preg_replace("##si", "[list=\\1]", $message);
+
+ // [/list] tags:
+ $message = str_replace("
", "[/list]", $message);
+ $message = str_replace("", "[/list]", $message);
+
+ return($message);
+}
+
+//
+// Alternative for in_array() which is only available in PHP4
+//
+function inarray($needle, $haystack) {
+ for( $i=0 ; $i < sizeof($haystack) ; $i++ )
+ {
+ if($haystack[$i]==$needle)
+ {
+ return true;
+ break;
+ }
+ else
+ {
+ $value=false;
+ }
+ }
+ return $value;
+}
+
+function end_step($next)
+{
+ global $debug;
+ if(!isset($debug))
+ {
+ // Print out link to next step and wait only if we are not debugging.
+ print "
Next step: $next
\n";
+ break;
+ }
+ else
+ {
+ print "
Next step: $next\n";
+ }
+}
+//
+// End function defns
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+?>
+Step 2: Rename tables\n";
+
+ $newnames = array(
+ "banlist" => "banlist",
+ "catagories" => "categories",
+ // Don't rename config yet, we'll create a new one and merge those later.
+ //"config" => "config",
+ "forums" => "forums",
+ "disallow" => "disallow",
+ "posts" => "posts",
+ "posts_text" => "posts_text",
+ "priv_msgs" => "privmsgs",
+ "ranks" => "ranks",
+ "sessions" => "sessions",
+ "smiles" => "smilies",
+ "topics" => "topics",
+ "users" => "users",
+ "words" => "words"
+ );
+ while(list($old, $new) = each($newnames))
+ {
+ $new = $table_prefix . $new;
+ $sql = "ALTER TABLE $old RENAME $new";
+ if(!$result = $db->sql_query($sql))
+ {
+ echo "Couldn't rename '$old' to '$new'
\n";
+ $sql_error = $db->sql_error();
+ print $sql_error['code'] .": ". $sql_error['message']. "
\n";
+ }
+ else
+ {
+ print "Renamed '$old' to '$new'
\n";
+ }
+ }
+ common_footer();
+ end_step('create_tables');
+
+ case 'create_tables':
+ common_header();
+ echo "
Step 2: Create new phpBB2 tables
\n";
+
+ $schema = get_schema();
+ $table_def = $schema['table_def'];
+ $field_def = $schema['field_def'];
+
+ // Create array with tables in 'old' database
+ $sql = 'SHOW TABLES';
+ if(!$result = $db->sql_query($sql))
+ {
+ echo "Couldn't get list of current tables
\n";
+ $sql_error = $db->sql_error();
+ print $sql_error['code'] .": ". $sql_error['message']. "
\n";
+ }
+ while ($table = $db->sql_fetchrow($result))
+ {
+ $currenttables[] = $table[0];
+ }
+
+ // Check what tables we need to CREATE
+ while (list($table, $definition) = each ($table_def))
+ {
+ if (!inarray($table, $currenttables))
+ {
+ print "Creating $table: ";
+ if(!$result = $db->sql_query($definition))
+ {
+ echo "Couldn't create table
\n";
+ $sql_error = $db->sql_error();
+ print $sql_error['code'] .": ". $sql_error['message']. "
\n";
+ print $definition . "
\n";
+ }
+ else
+ {
+ print "OK
\n";
+ }
+ }
+ }
+
+ common_footer();
+ end_step('create_config');
+
+ case 'create_config':
+ common_header();
+ $inserts = get_inserts();
+ print "Inserting new values into new layout config table";
+ while(list($table, $inserts_table) = each($inserts))
+ {
+ if ($table == CONFIG_TABLE)
+ {
+ while(list($nr, $insert) = each($inserts_table))
+ {
+ query($insert, "Couldn't insert value into config table");
+ print ".";
+ }
+ print "
";
+ }
+ }
+ //end_step('convert_config');
+
+ case 'convert_config':
+ common_header();
+ print "Starting!
";
+ $sql = "SELECT * FROM config";
+ $result = query($sql, "Couldn't get info from old config table");
+ $oldconfig = $db->sql_fetchrow($result);
+ while(list($name, $value) = each($oldconfig))
+ {
+ if(is_int($name))
+ {
+ continue;
+ }
+ print "Updating $name...
\n";
+ $sql = "UPDATE ".CONFIG_TABLE."
+ SET config_value = '".stripslashes($value)."'
+ WHERE config_name = '$name'";
+ query($sql, "Couldn't update config table with values from old config table");
+ }
+ end_step('droptables');
+
+ case 'droptables':
+ //drop access, whosonline, sessions (recreate)
+ echo "Nothing here yet
\n";
+ end_step('convert_ip_date');
+
+ case 'convert_ip_date':
+ common_header();
+ $names[POSTS_TABLE]['poster_ip'] = 'ip';
+ $names[POSTS_TABLE]['post_time'] = 'date';
+ $names[TOPICS_TABLE]['topic_time'] = 'date';
+ $names[PRIVMSGS_TABLE]['poster_ip'] = 'ip';
+ $names[PRIVMSGS_TABLE]['msg_time'] = 'date';
+
+ lock_tables(1, array(POSTS_TABLE, TOPICS_TABLE, PRIVMSGS_TABLE));
+ while(list($table, $fields) = each($names))
+ {
+ while(list($field, $type) = each($fields))
+ {
+ print "Converting $type format of $field in $table...
\n";
+ flush();
+ $function = ($type == 'ip') ? 'INET_ATON' : 'UNIX_TIMESTAMP';
+ $sql = "UPDATE $table SET $field = $function($field)";
+ query($sql, "Couldn't convert $type format of $table($field)");
+ }
+ }
+ lock_tables(0);
+
+ common_footer();
+ end_step('fix_addslashes');
+
+ case 'fix_addslashes':
+ $slashfields[TOPICS_TABLE] = array('topic_title');
+ $slashfields[FORUMS_TABLE] = array('forum_desc');
+ $slashfields[CATEGORIES_TABLE] = array('cat_title');
+ $slashfields[WORDS_TABLE] = array('word', 'replacement');
+ $slashfields[RANKS_TABLE] = array('rank_title');
+ //convert smilies?
+
+ $slashes = array(
+ "\\'" => "'",
+ "\\\"" => "\"",
+ "\\\\" => "\\");
+ $slashes = array(
+ "\\'" => "'",
+ "\\\"" => "\"",
+ "\\\\" => "\\");
+ lock_tables(1, array(TOPICS_TABLE, FORUMS_TABLE, CATEGORIES_TABLE, WORDS_TABLE, RANKS_TABLE));
+ while(list($table, $fields) = each($slashfields))
+ {
+ print "Removing slashes from $table table.
\n";
+ flush();
+ while(list($nr, $field) = each($fields))
+ {
+ reset($slashes);
+ while(list($search, $replace) = each($slashes))
+ {
+ $sql = "UPDATE $table SET $field = REPLACE($field, '".addslashes($search)."', '".addslashes($replace)."')";
+ query($sql, "Couldn't remove extraneous slashes from the old data.");
+ }
+ }
+ }
+ lock_tables(0);
+ end_step('convert_users');
+
+ case 'convert_users':
+ $sql = "
+ SELECT
+ count(*) as total,
+ max(user_id) as maxid
+ FROM ". USERS_TABLE;
+ $result = query($sql, "Couldn't get max post_id.");
+ $maxid = $db->sql_fetchrow($result);
+ $totalposts = $maxid['total'];
+ $maxid = $maxid['maxid'];
+
+ $sql = "ALTER TABLE ".USERS_TABLE."
+ ADD user_sig_bbcode_uid CHAR(10),
+ MODIFY user_sig text";
+ query($sql, "Couldn't add user_sig_bbcode_uid field to users table");
+
+ $batchsize = 1000;
+ print "Going to convert BBcode and registration dates in User table.
\n";
+ flush();
+ for($i = 0; $i <= $maxid; $i += $batchsize)
+ {
+ $batchstart = $i + 1;
+ $batchend = $i + $batchsize;
+
+ print "Converting Users $batchstart to $batchend
\n";
+ flush();
+ $sql = "SELECT * from ". USERS_TABLE. " WHERE user_id BETWEEN $batchstart AND $batchend";
+ $result = query($sql, "Couldn't get ". USERS_TABLE .".user_id $batchstart to $batchend");
+ $checklength = array(
+ 'user_occ',
+ 'user_website',
+ 'user_email',
+ 'user_from',
+ 'user_intrest',
+ 'user_aim',
+ 'user_yim',
+ 'user_msnm');
+
+ lock_tables(1, USERS_TABLE);
+ while($row = mysql_fetch_array($result))
+ {
+ if(is_int($row['user_regdate']))
+ {
+ // We already converted this post to the new style BBcode, skip this post.
+ continue;
+ }
+ //
+ // Nathan's bbcode2 conversion
+ //
+ // undo 1.2.x encoding..
+ $row['user_sig'] = bbdecode(stripslashes($row['user_sig']));
+ $row['user_sig'] = undo_make_clickable($row['user_sig']);
+ $row['user_sig'] = str_replace("
", "\n", $row['user_sig']);
+ // make a uid
+ $uid = make_bbcode_uid();
+ // do 2.x first-pass encoding..
+ $row['user_sig'] = bbencode_first_pass($row['user_sig'], $uid);
+ $row['user_sig'] = addslashes($row['user_sig']);
+
+ // Check for invalid info like '-' and '?' for a lot of fields
+ reset($checklength);
+ while($field = each($checklength))
+ {
+ $row[$field[1]] = strlen($row[$field[1]]) < 3 ? '' : $row[$field[1]];
+ }
+
+ preg_match('/(.*?) (\d{1,2}), (\d{4})/', $row['user_regdate'], $parts);
+ $row['user_regdate'] = mktime(0,0,0,$months[$parts[1]], $parts[2], $parts[3]);
+
+ $website = $row['user_website'];
+ if(substr(strtolower($website), 0, 7) != "http://")
+ {
+ $website = "http://" . $website;
+ }
+ if(strtolower($website) == 'http://'){
+ $website = '';
+ }
+ $row['user_website'] = addslashes($website);
+
+ $row['user_icq'] = (ereg("^[0-9]+$", $row['user_icq'])) ? $row['user_icq'] : '';
+ reset($checklength);
+ while($field = each($checklength))
+ {
+ if(strlen($row[$field[1]]) < 3)
+ {
+ $row[$field[1]] = '';
+ }
+ $row[$field[1]] = addslashes($row[$field[1]]);
+ }
+
+ switch($row['user_level'])
+ {
+ case '4':
+ $row['user_level'] = ADMIN;
+ break;
+ case '-1':
+ $row['user_level'] = ANONYMOUS;
+ break;
+ default:
+ $row['user_level'] = USER;
+ }
+
+ $sql = "UPDATE ".USERS_TABLE."
+ SET
+ user_sig = '".$row['user_sig']."',
+ user_sig_bbcode_uid = '$uid',
+ user_regdate = '".$row['user_regdate']."',
+ user_website = '".$row['user_website']."',
+ user_occ = '".$row['user_occ']."',
+ user_email = '".$row['user_email']."',
+ user_from = '".$row['user_from']."',
+ user_intrest = '".$row['user_intrest']."',
+ user_aim = '".$row['user_aim']."',
+ user_yim = '".$row['user_yim']."',
+ user_msnm = '".$row['user_msnm']."'
+ WHERE user_id = ".$row['user_id'];
+ query($sql, "Couldn't update ".USERS_TABLE." table with new BBcode and regdate for user_id ".$row['user_id']);
+ }
+ lock_tables(0);
+ }
+ end_step('convert_posts');
+
+
+ case 'convert_posts':
+ common_header();
+ $sql = "ALTER TABLE ".POSTS_TABLE."
+ ADD bbcode_uid char(10) NOT NULL,
+ ADD enable_sig tinyint(1) DEFAULT '1' NOT NULL";
+ print "Adding bbcode_uid field to ".POSTS_TABLE.".
\n";
+ $result = query($sql, "Couldn't get add bbcode_uid field to ".POSTS_TABLE.".");
+
+ $sql = "
+ SELECT
+ count(*) as total,
+ max(post_id) as maxid
+ FROM ". POSTS_TEXT_TABLE;
+ $result = query($sql, "Couldn't get max post_id.");
+ $maxid = $db->sql_fetchrow($result);
+ $totalposts = $maxid['total'];
+ $maxid = $maxid['maxid'];
+
+ $batchsize = 2000;
+ print "Going to convert BBcode in posts with $batchsize messages at a time and $totalposts in total.
\n";
+ for($i = 0; $i <= $maxid; $i += $batchsize)
+ {
+ $batchstart = $i + 1;
+ $batchend = $i + $batchsize;
+
+ print "Converting BBcode in post number $batchstart to $batchend
\n";
+ flush();
+ $sql = "
+ SELECT
+ pt.*,
+ p.bbcode_uid
+ FROM "
+ .POSTS_TEXT_TABLE." pt,"
+ .POSTS_TABLE." p
+ WHERE pt.post_id = p.post_id
+ && pt.post_id BETWEEN $batchstart AND $batchend";
+ $result = query($sql, "Couldn't get ". POSTS_TEXT_TABLE .".post_id $batchstart to $batchend");
+ lock_tables(1, array(POSTS_TABLE, POSTS_TEXT_TABLE));
+ while($row = mysql_fetch_array($result))
+ {
+ if($row['bbcode_uid'] != '')
+ {
+ // We already converted this post to the new style BBcode, skip this post.
+ continue;
+ }
+ //
+ // Nathan's bbcode2 conversion
+ //
+ // undo 1.2.x encoding..
+ $row['post_text'] = bbdecode(stripslashes($row['post_text']));
+ $row['post_text'] = undo_make_clickable($row['post_text']);
+ $row['post_text'] = str_replace("
", "\n", $row['post_text']);
+ // make a uid
+ $uid = make_bbcode_uid();
+ // do 2.x first-pass encoding..
+ $row['post_text'] = bbencode_first_pass($row['post_text'], $uid);
+ $row['post_text'] = addslashes($row['post_text']);
+
+ $checksig = preg_replace('/\[addsig\]$/', '', $row['post_text']);
+ if(strlen($checksig) == strlen($row['post_text']))
+ {
+ $enable_sig = 0;
+ }
+ else
+ {
+ $enable_sig = 1;
+ }
+
+ $sql = "UPDATE ".POSTS_TEXT_TABLE."
+ SET post_text = '$checksig'
+ WHERE post_id = ".$row['post_id'];
+ query($sql, "Couldn't update ".POSTS_TEXT_TABLE." table with new BBcode for post_id ".$row['post_id']);
+ $sql = "UPDATE ".POSTS_TABLE."
+ SET bbcode_uid = '$uid', enable_sig = $enable_sig
+ WHERE post_id = ".$row['post_id'];
+ query($sql, "Couldn't update ".POSTS_TABLE." table with bbcode_uid of post_id ".$row['post_id']);
+ }
+ lock_tables(0);
+ }
+ end_step('convert_pm');
+
+ case 'convert_pm':
+ $sql = "
+ SELECT
+ count(*) as total,
+ max(msg_id) as maxid
+ FROM ". PRIVMSGS_TABLE;
+ $result = query($sql, "Couldn't get max privmsgs_id.");
+ $maxid = $db->sql_fetchrow($result);
+ $totalposts = $maxid['total'];
+ $maxid = $maxid['maxid'];
+
+ $sql = "ALTER TABLE ".PRIVMSGS_TABLE."
+ ADD privmsgs_subject VARCHAR(255),
+ ADD privmsgs_attach_sig TINYINT(1) DEFAULT 1";
+ query($sql, "Couldn't add privmsgs_subject field to ".PRIVMSGS_TABLE." table");
+
+ $batchsize = 2000;
+ print "Going to convert Private messsages with $batchsize messages at a time and $totalposts in total.
\n";
+ for($i = 0; $i <= $maxid; $i += $batchsize)
+ {
+ $batchstart = $i + 1;
+ $batchend = $i + $batchsize;
+
+ print "Converting Private Message number $batchstart to $batchend
\n";
+ flush();
+ $sql = "
+ SELECT
+ *
+ FROM "
+ .PRIVMSGS_TABLE."
+ WHERE
+ msg_id BETWEEN $batchstart AND $batchend";
+ $result = query($sql, "Couldn't get ". POSTS_TEXT_TABLE .".post_id $batchstart to $batchend");
+ lock_tables(1, array(PRIVMSGS_TABLE, PRIVMSGS_TEXT_TABLE));
+ while($row = mysql_fetch_array($result))
+ {
+ if($row['msg_text'] == NULL)
+ {
+ // We already converted this post to the new style BBcode, skip this post.
+ continue;
+ }
+ //
+ // Nathan's bbcode2 conversion
+ //
+ // undo 1.2.x encoding..
+ $row['msg_text'] = bbdecode(stripslashes($row['msg_text']));
+ $row['msg_text'] = undo_make_clickable($row['msg_text']);
+ $row['msg_text'] = str_replace("
", "\n", $row['msg_text']);
+ // make a uid
+ $uid = make_bbcode_uid();
+ // do 2.x first-pass encoding..
+ $row['msg_text'] = bbencode_first_pass($row['msg_text'], $uid);
+
+ $checksig = preg_replace('/\[addsig\]$/', '', $row['msg_text']);
+ if(strlen($checksig) == strlen($row['msg_text']))
+ {
+ $enable_sig = 0;
+ }
+ else
+ {
+ $enable_sig = 1;
+ }
+ $row['msg_text'] = $checksig;
+
+ if($row['msg_status'] == 1)
+ {
+ // Private message has been read
+ $row['msg_status'] = PRIVMSGS_SAVED_IN_MAIL;
+ }
+ else
+ {
+ // Private message is new
+ $row['msg_status'] = PRIVMSGS_NEW_MAIL;
+ }
+
+
+ // Subject contains first 60 characters of msg
+ $subject = addslashes(strip_tags(substr($row['msg_text'], 0, 60)));
+
+ $row['msg_text'] = addslashes($row['msg_text']);
+
+ $sql = "INSERT INTO ".PRIVMSGS_TEXT_TABLE."
+ (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
+ VALUES
+ ('".$row['msg_id']."', '$uid', '".$row['msg_text']."')";
+ query($sql, "Couldn't insert PrivMsg text into ".PRIVMSGS_TEXT_TABLE." table msg_id ".$row['msg_id']);
+ $sql = "UPDATE ".PRIVMSGS_TABLE."
+ SET
+ msg_text = NULL,
+ msg_status = ".$row['msg_status'].",
+ privmsgs_subject = '$subject',
+ privmsgs_attach_sig = $enable_sig
+ WHERE msg_id = ".$row['msg_id'];
+ query($sql, "Couldn't update ".PRIVMSGS_TABLE." table for msg_id ".$row['post_id']);
+ }
+
+ }
+ lock_tables(0);
+ end_step('update_schema');
+
+ case 'update_schema':
+ common_header();
+ $rename =
+ array(
+ $table_prefix."users" => array(
+ "user_interest" => "user_intrest",
+ "user_allowsmile" => "user_desmile",
+ "user_allowhtml" => "user_html",
+ "user_allowbbcode" => "user_bbcode"
+ ),
+ $table_prefix."privmsgs" => array(
+ "privmsgs_id" => "msg_id",
+ "privmsgs_from_userid" => "from_userid",
+ "privmsgs_to_userid" => "to_userid",
+ "privmsgs_date" => "msg_time",
+ "privmsgs_ip" => "poster_ip",
+ "privmsgs_type" => "msg_status"
+ ),
+ $table_prefix."smilies" => array(
+ "smilies_id" => "id"
+ )
+ );
+ $schema = get_schema();
+ $table_def = $schema['table_def'];
+ $field_def = $schema['field_def'];
+
+ //print "";
+ //print_r($field_def);
+ //print "
";
+ // Loop tables in schema
+ while (list($table, $table_def) = each($field_def))
+ {
+ // Loop fields in table
+ print "Table: $table
\n";
+ flush();
+
+ $sql = "SHOW FIELDS FROM $table";
+ $result = query($sql, "Can't get definition of current $table table");
+ $current_def = $db->sql_fetchrowset($result);
+ while(list($nr, $def) = each($current_def))
+ {
+ $current_fields[] = $def['Field'];
+ }
+ //print_r($current_fields);
+
+ $alter_sql = "ALTER TABLE $table ";
+ while (list($field, $definition) = each($table_def))
+ {
+ if ($field == '')
+ {
+ // Skip empty fields if any (shouldn't be needed)
+ continue;
+ }
+ $type = $definition['type'];
+ $size = $definition['size'];
+ $default = isset($definition['default']) ? "DEFAULT " . $definition['default'] : '';
+ $notnull = $definition['notnull'] == 1 ? 'NOT NULL' : '';
+ $auto_increment = $definition['auto_increment'] == 1 ? 'auto_increment' : '';
+ $oldfield = isset($rename[$table][$field]) ? $rename[$table][$field] : $field;
+ if(!inarray($field, $current_fields) && $oldfield == $field)
+ {
+ // If the current is not a key of $current_def and it is not a field that is
+ // to be renamed then the field doesn't currently exist.
+ $changes[] = "\nADD $field $type($size) $default $notnull $auto_increment ";
+ }
+ else
+ {
+ $changes[] = "\nCHANGE $oldfield $field $type($size) $default $notnull $auto_increment";
+ }
+ }
+ $alter_sql .= join(',', $changes);
+ unset($changes);
+ unset($current_fields);
+ print "$alter_sql
\n";
+ query($alter_sql, "Couldn't alter table $table");
+ flush();
+ }
+
+ end_step('insert_themes');
+ case 'insert_themes':
+ common_header();
+ $inserts = get_inserts();
+ print "Inserting new values into new themes table";
+ while(list($table, $inserts_table) = each($inserts))
+ {
+ if ($table == THEMES_TABLE)
+ {
+ while(list($nr, $insert) = each($inserts_table))
+ {
+ query($insert, "Couldn't insert value into ".THEMES_TABLE);
+ print ".";
+ }
+ print "
";
+ }
+ }
+ //end_step('convert_config');
+
+
+ echo "This is the end....";
+ break;
+ }
+}
+?>