📄 upgrade.php
字号:
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Updating auth_access for super moderator group :: ";
flush();
$sql = "SELECT forum_id
FROM " . FORUMS_TABLE;
$result = query($sql, "Couldn't obtain forum_id list");
while( $row = $db->sql_fetchrow($result) )
{
$sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_mod)
VALUES ($group_id, " . $row['forum_id'] . ", 1)";
$result_insert = query($sql, "Unable to set group auth access for super mods.");
}
for($i = 0; $i < count($super_mods); $i++)
{
$sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
VALUES ($group_id, " . $super_mods[$i] . ", 0)";
query($sql, "Unable to add user_id $user_id to group_id $group_id (super mods)<br>\n");
}
print "<span class=\"ok\"><b>OK</b></span><br />\n";
}
end_step('convert_posts');
case 'convert_posts':
print " * Adding enable_sig field to " . POSTS_TABLE . " :: ";
flush();
$sql = "ALTER TABLE " . POSTS_TABLE . "
ADD enable_sig tinyint(1) DEFAULT '1' NOT NULL";
$result = query($sql, "Couldn't add enable_sig field to " . POSTS_TABLE . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Adding enable_bbcode field to " . POSTS_TEXT_TABLE . " :: ";
flush();
$sql = "ALTER TABLE " . POSTS_TEXT_TABLE . "
ADD enable_bbcode tinyint(1) DEFAULT '1' NOT NULL";
$result = query($sql, "Couldn't add enable_bbcode field to " . POSTS_TABLE . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Adding bbcode_uid field to " . POSTS_TEXT_TABLE . " :: ";
flush();
$sql = "ALTER TABLE " . POSTS_TEXT_TABLE . "
ADD bbcode_uid char(10) NOT NULL";
$result = query($sql, "Couldn't add bbcode_uid field to " . POSTS_TABLE . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Adding post_edit_time field to " . POSTS_TABLE . " :: ";
flush();
$sql = "ALTER TABLE " . POSTS_TABLE . "
ADD post_edit_time int(11)";
$result = query($sql, "Couldn't add post_edit_time field to " . POSTS_TABLE . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Adding post_edit_count field to " . POSTS_TABLE . " :: ";
flush();
$sql = "ALTER TABLE " . POSTS_TABLE . "
ADD post_edit_count smallint(5) UNSIGNED DEFAULT '0' NOT NULL";
$result = query($sql, "Couldn't add post_edit_count field to " . POSTS_TABLE . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n<br />\n";
$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;
for($i = 0; $i <= $maxid; $i += $batchsize)
{
$batchstart = $i + 1;
$batchend = $i + $batchsize;
print " * Converting BBcode ( $batchstart to $batchend ) :: ";
flush();
$sql = "SELECT *
FROM " . POSTS_TEXT_TABLE . "
WHERE 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_TEXT_TABLE, POSTS_TABLE));
$per_pct = ceil( $db->sql_numrows($result) / 40 );
$inc = 0;
while( $row = $db->sql_fetchrow($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('<BR>', "\n", $row['post_text']);
// make a uid
$uid = make_bbcode_uid();
// do 2.x first-pass encoding..
$row['post_text'] = smiley_replace($row['post_text']);
$row['post_text'] = bbencode_first_pass($row['post_text'], $uid);
$row['post_text'] = addslashes($row['post_text']);
$edited_sql = "";
if ( preg_match('/^(.*?)([\n]+<font size=\-1>\[ This message was .*?)$/s', $row['post_text'], $matches) )
{
$row['post_text'] = $matches[1];
$edit_info = $matches[2];
$edit_times = count(explode(' message ', $edit_info)) - 1; // Taken from example for substr_count in annotated PHP manual
if ( preg_match('/^.* by: (.*?) on (....)-(..)-(..) (..):(..) \]<\/font>/s', $edit_info, $matches) )
{
$edited_user = $matches[1];
$edited_time = gmmktime($matches[5], $matches[6], 0, $matches[3], $matches[4], $matches[2]);
//
// This isn't strictly correct since 2.0 won't include and edit
// statement if the edit wasn't by the user who posted ...
//
$edited_sql = ", post_edit_time = $edited_time, post_edit_count = $edit_times";
}
}
if ( preg_match("/^(.*?)\n-----------------\n.*$/is", $row['post_text'], $matches) )
{
$row['post_text'] = $matches[1];
$enable_sig = 1;
}
else
{
$checksig = preg_replace('/\[addsig\]$/', '', $row['post_text']);
$enable_sig = ( strlen($checksig) == strlen($row['post_text']) ) ? 0 : 1;
}
$sql = "UPDATE " . POSTS_TEXT_TABLE . "
SET post_text = '$checksig', bbcode_uid = '$uid'
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 enable_sig = $enable_sig" . $edited_sql . "
WHERE post_id = " . $row['post_id'];
query($sql, "Couldn't update " . POSTS_TABLE . " table with signature status for post with post_id :: " . $row['post_id']);
$inc++;
if ( $inc == $per_pct )
{
print '.';
flush();
$inc = 0;
}
}
print " <span class=\"ok\"><b>OK</b></span><br />\n";
lock_tables(0);
}
print "<br />\n * Updating poster_id for deleted users :: ";
flush();
$sql = "SELECT DISTINCT p.post_id
FROM " . POSTS_TABLE . " p
LEFT JOIN " . USERS_TABLE . " u ON p.poster_id = u.user_id
WHERE u.user_id IS NULL";
$result = query($sql, "Couldn't obtain list of deleted users");
$users_removed = $db->sql_numrows($result);
if ( $users_removed )
{
$post_id_ary = array();
while( $row = $db->sql_fetchrow($result) )
{
$post_id_ary[] = $row['post_id'];
}
$sql = "UPDATE " . POSTS_TABLE . "
SET poster_id = " . ANONYMOUS . ", enable_sig = 0
WHERE post_id IN (" . implode(", ", $post_id_ary) . ")";
query($sql, "Couldn't update posts to remove deleted user poster_id values");
}
print "<span class=\"ok\"><b>OK</b></span> ( Removed $users_removed non-existent user references )<br />\n";
end_step('convert_privmsgs');
case 'convert_privmsgs':
$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;
for($i = 0; $i <= $maxid; $i += $batchsize)
{
$batchstart = $i + 1;
$batchend = $i + $batchsize;
print " * Converting Private Message ( $batchstart to $batchend ) :: ";
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));
$per_pct = ceil( $db->sql_numrows($result) / 40 );
$inc = 0;
while( $row = $db->sql_fetchrow($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("<BR>", "\n", $row['msg_text']);
// make a uid
$uid = make_bbcode_uid();
// do 2.x first-pass encoding..
$row['msg_text'] = smiley_replace($row['msg_text']);
$row['msg_text'] = bbencode_first_pass($row['msg_text'], $uid);
$checksig = preg_replace('/\[addsig\]$/', '', $row['msg_text']);
$enable_sig = (strlen($checksig) == strlen($row['msg_text'])) ? 0 : 1;
if ( preg_match("/^(.*?)\n-----------------\n.*$/is", $checksig, $matches) )
{
$checksig = $matches[1];
$enable_sig = 1;
}
$row['msg_text'] = $checksig;
$row['msg_status'] = ($row['msg_status'] == 1) ? PRIVMSGS_READ_MAIL : PRIVMSGS_NEW_MAIL;
// Subject contains first 60 characters of msg, remove any BBCode tags
$subject = addslashes(strip_tags(substr($row['msg_text'], 0, 60)));
$subject = preg_replace("/\[.*?\:(([a-z0-9]:)?)$uid.*?\]/si", "", $subject);
$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']);
$inc++;
if ( $inc == $per_pct )
{
print '.';
flush();
$inc = 0;
}
}
print " <span class=\"ok\"><b>OK</b></span><br />\n";
}
lock_tables(0);
end_step('convert_moderators');
case 'convert_moderators';
$sql = "SELECT *
FROM forum_mods";
$result = query($sql, "Couldn't get list with all forum moderators");
while( $row = $db->sql_fetchrow($result) )
{
// Check if this moderator and this forum still exist
$sql = "SELECT user_id
FROM " . USERS_TABLE . ", " . FORUMS_TABLE . "
WHERE user_id = " . $row['user_id'] . "
AND forum_id = " . $row['forum_id'];
$check_data = query($sql, "Couldn't check if user " . $row['user_id'] . " and forum " . $row['forum_id'] . " exist");
if ( !($rowtest = $db->sql_fetchrow($check_data)) )
{
// Either the moderator or the forum have been deleted, this line in forum_mods was redundant, skip it.
continue;
}
$sql = "SELECT g.group_id
FROM " . GROUPS_TABLE . " g, " . USER_GROUP_TABLE . " ug
WHERE g.group_id = ug.group_id
AND ug.user_id = " . $row['user_id'] . "
AND g.group_single_user = 1";
$insert_group = query($sql, "Couldn't get group number for user " . $row['user_id'] . ".");
$group_id = $db->sql_fetchrow($insert_group);
$group_id = $group_id['group_id'];
print " * Adding moderator for forum " . $row['forum_id'] . " :: ";
flush();
$sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (group_id, forum_id, auth_mod) VALUES ($group_id, ".$row['forum_id'].", 1)";
query($sql, "Couldn't set moderator (user_id = " . $row['user_id'] . ") for forum " . $row['forum_id'] . ".");
print "<span class=\"ok\"><b>OK</b></span><br />\n";
}
print " * Setting correct user_level for moderators ::";
flush();
$sql = "SELECT DISTINCT u.user_id
FROM " . USERS_TABLE . " u, " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa
WHERE aa.auth_mod = 1
AND ug.group_id = aa.group_id
AND u.user_id = ug.user_id
AND u.user_level <> " . ADMIN;
$result = query($sql, "Couldn't obtain list of moderators");
if ( $row = $db->sql_fetchrow($result) )
{
$ug_sql = '';
do
{
$ug_sql .= ( ( $ug_sql != '' ) ? ', ' : '' ) . $row['user_id'];
}
while ( $row = $db->sql_fetchrow($result) );
$sql = "UPDATE " . USERS_TABLE . "
SET user_level = " . MOD . "
WHERE user_id IN ($ug_sql)";
query($sql, "Couldn't set moderator status for users");
}
print "<span class=\"ok\"><b>OK</b></span><br />\n";
end_step('convert_privforums');
case 'convert_privforums':
$sql = "SELECT fa.*, f.forum_name
FROM forum_access fa
LEFT JOIN " . FORUMS_TABLE . " f ON fa.forum_id = f.forum_id
ORDER BY fa.forum_id, fa.user_id";
$forum_access = query($sql, "Couldn't get list with special forum access (forum_access)");
$forum_id = -1;
while( $row = $db->sql_fetchrow($forum_access) )
{
// Iterate trough access table
if ( $row['forum_id'] != $forum_id )
{
// This is a new forum, create new group.
$forum_id = $row['forum_id'];
print " * Creating new group for forum $forum_id :: ";
flush();
$sql = "INSERT INTO " . GROUPS_TABLE . " (group_type, group_name, group_description, group_moderator, group_single_user)
VALUES (" . GROUP_HIDDEN . ", '" . addslashes($row['forum_name']) . " Group', 'Converted Private Forum Group', " . $row['user_id'] . ", 0)";
$result = query($sql, "Couldn't create group for ".$row['forum_name']);
$group_id = $db->sql_nextid();
if ( $group_id <= 0 )
{
print "<font color=\"red\">Group creation failed. Aborting creation of groups...<br></font>\n";
continue 2;
}
print "<span class=\"ok\"><b>OK</b></span><br />\n";
print " * Creating auth_access group for forum $forum_id :: ";
flush();
$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)
VALUES ($group_id, $forum_id, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1)";
$result = query($sql, "Unable to set group auth access.");
if ( $db->sql_affectedrows($result) <= 0 )
{
print "<font color=\"red\">Group creation failed. Aborting creation of groups...</font><br>\n";
continue 2;
}
print "<span class=\"ok\"><b>OK</b></span><br />\n";
}
// Add user to the group
$user_id = $row['user_id'];
$sql = "INSERT INTO " . USER_GROUP_TABLE . " (group_id, user_id, user_pending)
VALUES ($group_id, $user_id, 0)";
query($sql, "Unable to add user_id $user_id to group_id $group_id <br>\n");
}
end_step('update_schema');
case 'update_schema':
$rename = array(
$table_prefix . "users" => array(
"user_interests" => "user_intrest",
"user_allowsmile" => "user_desmile",
"user_allowhtml" => "user_html",
"user_allowbbcode" => "user_bbcode",
"user_style" => "user_theme"
),
$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'];
// Loop tables in schema
while (list($table, $table_def) = @each($field_def))
{
// Loop fields in table
print " * Updating table '$table' :: ";
flush();
$sql = "SHOW FIELDS
FROM $table";
$result = query($sql, "Can't get definition of current $table table");
while( $row = $db->sql_fetchrow($result) )
{
$current_fields[] = $row['Field'];
}
$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'];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -