';
$step();
if ($step != 'doStep0')
echo '
';
show_footer();
// Step 0 - Do they have everything ready?
function doStep0()
{
global $boarddir, $sourcedir, $db_prefix, $language, $modSettings;
if (!php_version_check(SMF_PHP_VERSION))
{
echo '
Warning! You do not appear to have a version of PHP installed on your webserver that meets SMF' . "'" . 's minimum installations requirements.
';
return false;
}
// Check for some key files - one template, one language, and a new and an old source file.
$check = @file_exists($boarddir . '/Themes/default/index.template.php')
&& @file_exists($sourcedir . '/QueryString.php')
&& @file_exists($sourcedir . '/ManageBoards.php');
if (!$check && !isset($modSettings['smfVersion']))
{
// Don't tell them what files exactly because it's a spot check - just like teachers don't tell which problems they are spot checking, that's dumb.
echo '
The upgrader was unable to find some crucial files.
Please make sure you uploaded all of the files included in the package, including the Themes, Sources, and other directories.
';
return false;
}
// Make sure Settings.php is writable.
if (!is_writable($boarddir . '/Settings.php'))
@chmod($boarddir . '/Settings.php', 0777);
if (!is_writable($boarddir . '/Settings.php'))
{
echo '
The upgrader was unable to obtain write access to Settings.php.
If you are using a linux or unix based server, please ensure that the file is chmod\'d to 777.
If your server is running Windows, please ensure that the internet guest account has the proper permissions on it.
';
return false;
}
// Make sure Settings.php is writable.
if (!is_writable($boarddir . '/Settings_bak.php'))
@chmod($boarddir . '/Settings_bak.php', 0777);
if (!is_writable($boarddir . '/Settings_bak.php'))
{
echo '
The upgrader was unable to obtain write access to Settings_bak.php.
If you don\'t have a Settings_bak.php, you can make a copy of Settings.php and name it Settings_bak.php.
If you are using a linux or unix based server, please ensure that the file is chmod\'d to 777.
If your server is running Windows, please ensure that the internet guest account has the proper permissions on it.
';
return false;
}
// Check agreement.txt. (it may not exist, in which case $boarddir must be writable.)
if (isset($modSettings['agreement']) && (!is_writable($boarddir) || file_exists($boarddir . '/agreement.txt')) && !is_writable($boarddir . '/agreement.txt'))
{
echo '
The upgrader was unable to obtain write access to agreement.txt.
If you are using a linux or unix based server, please ensure that the file is chmod\'d to 777, or if it does not exist that the directory this upgrader is in is 777.
If your server is running Windows, please ensure that the internet guest account has the proper permissions on it or its folder.
';
return false;
}
// Upgrade the agreement.
elseif (isset($modSettings['agreement']))
{
$fp = fopen($boarddir . '/agreement.txt', 'w');
fwrite($fp, $modSettings['agreement']);
fclose($fp);
}
// Make sure Themes is writable.
if (!is_writable($boarddir . '/Themes'))
@chmod($boarddir . '/Themes', 0777);
if (!is_writable($boarddir . '/Themes') && !isset($modSettings['smfVersion']))
{
echo '
The upgrader was unable to obtain write access to the Themes folder.
If you are using a linux or unix based server, please ensure that the file is chmod\'d to 777.
If your server is running Windows, please ensure that the internet guest account has the proper permissions on it.
The upgrader was unable to find language files for the language specified in Settings.php.
SMF will not work without the primary language files installed.
', isset($modSettings['smfVersion']) ? 'Updating Your SMF Install' : 'Upgrading from YaBB SE', '!
Thank you for choosing to upgrade to SMF ', SMF_VERSION, '. All files appear to be in place, please click continue below.
';
// All ready.
return;
}
// Step 1: Do the maintenance and backup.
function doStep1()
{
global $db_error, $db_prefix;
global $boarddir, $sourcedir, $maintenance, $GodPostNum, $HeroPostNum;
if (!empty($_GET['backup']) || isset($_GET['t']))
{
echo '
Backing up old table data... ';
$result = idb_query("
SHOW TABLES LIKE '" . strtr($db_prefix, array('_' => '\_', '%' => '\%')) . "%'");
if ($db_error) return;
$table_names = array();
while ($row = mysql_fetch_row($result))
$table_names[] = $row[0];
if (!isset($_GET['t']))
$_GET['t'] = 0;
for ($stepnum = (int) $_GET['t'], $n = count($table_names); $stepnum < $n; $stepnum++)
{
$table_name = $table_names[$stepnum];
if (strncasecmp('backup_', $table_name, 7) == 0)
continue;
pastTime('t=' . $stepnum);
debug_info('
Backing up "' . str_replace($db_prefix, '', $table_name) . '"... ');
$result2 = idb_query("
SHOW CREATE TABLE $table_name");
if ($db_error) return;
list (, $create) = mysql_fetch_row($result2);
$create = preg_split('/[\n\r]/', $create);
$auto_inc = '';
foreach ($create as $k => $l)
{
// Get the name of the auto_increment column.
if (strpos($l, 'auto_increment'))
$auto_inc = trim($l);
if (strpos($l, 'KEY') === false)
unset($create[$k]);
}
idb_query("
DROP TABLE IF EXISTS backup_$table_name");
if ($db_error) return;
idb_query("
CREATE TABLE backup_$table_name" . (!empty($create) ? ' (
' . implode('
', $create) . ')' : '') . "
SELECT *
FROM $table_name");
if ($db_error) return;
if ($auto_inc != '')
{
// Get the column name.
preg_match('~\`(.+?)\`\s~', $auto_inc, $match);
if (substr($auto_inc, -1, 1) == ',')
$auto_inc = substr($auto_inc, 0, -1);
//if (isset($match[1]))
mysql_query("
ALTER TABLE backup_$table_name
CHANGE COLUMN $match[1] $auto_inc");
}
debug_info('done.');
}
debug_info(' ');
echo '
Successful.
';
}
$changes = array();
if (isset($_GET['lang']))
{
echo '
Setting the default language to English... ';
$changes['language'] = '\'english\'';
echo '
Successful.
';
}
if (!empty($_GET['maint']) && !isset($_GET['t']))
{
echo '
Putting your forum into maintenance mode... ';
$changes['maintenance'] = '2';
$changes['mtitle'] = '\'Upgrading the forum...\'';
$changes['mmessage'] = '\'Don\\\'t worry, we will be back shortly with an updated forum. It will only be a minute ;).\'';
echo '
Successful.
';
}
echo '
Updating Settings.php with changes... ';
copy($boarddir . '/Settings.php', $boarddir . '/Settings_bak.php');
if (substr($boarddir, 0, 1) == '.')
$changes['boarddir'] = '\'' . fixRelativePath($boarddir) . '\'';
if (substr($sourcedir, 0, 1) == '.')
$changes['sourcedir'] = '\'' . fixRelativePath($sourcedir) . '\'';
// Update Settings.php with the new settings.
changeSettings($changes);
echo '
Successful.
';
$_GET['t'] = 0;
return doStep2();
}
// Step 2: Default tables not in 1.5.x.
function doStep2()
{
global $db_error, $db_prefix;
global $boardurl, $boarddir, $doSettingsTableFix;
$_GET['step'] = '2';
if (!isset($_GET['t']))
$_GET['t'] = 0;
else
$_GET['t'] = (int) $_GET['t'];
echo '
Creating new tables and inserting default data... ';
debug_info(' ');
if ($_GET['t'] <= 0)
{
pastTime('t=0');
debug_info(' Creating "themes"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}themes (
ID_MEMBER mediumint(8) NOT NULL default '0',
ID_THEME tinyint(4) unsigned NOT NULL default '1',
variable tinytext NOT NULL default '',
value tinytext NOT NULL default '',
PRIMARY KEY (ID_MEMBER, ID_THEME, variable(30))
) TYPE=MyISAM");
if ($db_error) return;
idb_query("
ALTER TABLE {$db_prefix}themes
CHANGE COLUMN ID_MEMBER ID_MEMBER mediumint(8) NOT NULL default '0'");
idb_query("
ALTER TABLE {$db_prefix}themes
CHANGE COLUMN value value text NOT NULL default ''");
// Set up the default theme. (only the basic stuff NOT in settings or Settings.php.)
$values = array(
'name' => 'SMF Default Theme',
'theme_url' => $boardurl . '/Themes/default',
'images_url' => $boardurl . '/Themes/default/images',
'theme_dir' => $boarddir . '/Themes/default',
'allow_no_censored' => '0',
'additional_options_collapsable' => '1'
);
$setString = '';
foreach ($values as $variable => $value)
$setString .= "
(0, 1, '" . $variable . "', '" . $value . "'),";
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
$request = idb_query("
SELECT ID_THEME
FROM {$db_prefix}themes
WHERE (variable = 'theme_dir' AND value = '" . $boardurl . "/Themes/classic')
OR (variable = 'name' AND value = 'Classic YaBB SE Theme')");
if (mysql_num_rows($request) == 0 && file_exists($boarddir . '/Themes/classic'))
{
// Now set up the classic theme.
$values = array(
'name' => 'Classic YaBB SE Theme',
'theme_url' => $boardurl . '/Themes/classic',
'images_url' => $boardurl . '/Themes/classic/images',
'theme_dir' => $boarddir . '/Themes/classic'
);
// Get an available ID_THEME. (in case they are upgrading from a beta and had themes installed.)
$request = idb_query("
SELECT MAX(ID_THEME) + 1
FROM {$db_prefix}themes");
list ($ID_THEME) = mysql_fetch_row($request);
mysql_free_result($request);
$setString = '';
foreach ($values as $variable => $value)
$setString .= "
(0, " . $ID_THEME . ", '" . $variable . "', '" . $value . "'),";
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
idb_query("
UPDATE {$db_prefix}settings
SET value = CONCAT(value, '," . $ID_THEME . "')
WHERE variable = 'knownThemes'
LIMIT 1");
if ($db_error) return;
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES ('theme_guests', $ID_THEME),
('smiley_sets_default', 'classic')");
if ($db_error) return;
}
debug_info('done. ');
}
if ($_GET['t'] <= 1)
{
pastTime('t=1');
debug_info(' Creating "permissions"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}permissions (
ID_GROUP smallint(6) NOT NULL default '0',
permission varchar(30) NOT NULL default '',
PRIMARY KEY (ID_GROUP, permission)
) TYPE=MyISAM");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}permissions
ADD addDeny tinyint(4) NOT NULL default '1'");
mysql_query("
ALTER TABLE {$db_prefix}permissions
CHANGE COLUMN permission permission varchar(30) NOT NULL default ''");
// Insert the non-default permissions. (guest and moderator ones.)
mysql_query("
INSERT INTO {$db_prefix}permissions
(ID_GROUP, permission)
VALUES (-1, 'search_posts'), (-1, 'calendar_view'), (-1, 'view_stats'), (-1, 'profile_view_any'),
(2, 'calendar_post'), (2, 'calendar_edit_any'), (2, 'calendar_edit_own')");
if ($db_error) return;
// Convert some permissions that got renamed.
mysql_query("
UPDATE {$db_prefix}permissions
SET
permission = REPLACE(permission, 'profile_own_identity', 'profile_identity_own'),
permission = REPLACE(permission, 'profile_any_identity', 'profile_identity_any'),
permission = REPLACE(permission, 'profile_own_extra', 'profile_extra_own'),
permission = REPLACE(permission, 'profile_any_extra', 'profile_extra_any'),
permission = REPLACE(permission, 'profile_own_title', 'profile_title_own'),
permission = REPLACE(permission, 'profile_any_title', 'profile_title_any'),
permission = REPLACE(permission, 'im_read', 'pm_read'),
permission = REPLACE(permission, 'im_send', 'pm_send')");
debug_info('done. ');
}
if ($_GET['t'] <= 2)
{
pastTime('t=2');
debug_info(' Creating "board_permissions"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}board_permissions (
ID_GROUP smallint(6) NOT NULL default '0',
ID_BOARD smallint(5) unsigned NOT NULL default '0',
permission varchar(30) NOT NULL default '',
PRIMARY KEY (ID_GROUP, ID_BOARD, permission)
) TYPE=MyISAM");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}board_permissions
ADD addDeny tinyint(4) NOT NULL default '1'");
mysql_query("
ALTER TABLE {$db_prefix}board_permissions
CHANGE COLUMN permission permission varchar(30) NOT NULL default ''");
mysql_query("
INSERT INTO {$db_prefix}board_permissions
(ID_GROUP, ID_BOARD, permission)
VALUES (-1, 0, 'poll_view'), (3, 0, 'make_sticky'), (3, 0, 'lock_any'),
(3, 0, 'delete_any'), (3, 0, 'move_any'), (3, 0, 'merge_any'), (3, 0, 'split_any'),
(3, 0, 'remove_any'), (3, 0, 'modify_any'), (2, 0, 'make_sticky'), (2, 0, 'lock_any'),
(2, 0, 'delete_any'), (2, 0, 'move_any'), (2, 0, 'merge_any'), (2, 0, 'split_any'),
(2, 0, 'remove_any'), (2, 0, 'modify_any'), (2, 0, 'poll_lock_any'), (2, 0, 'poll_lock_any'),
(2, 0, 'poll_add_any'), (2, 0, 'poll_remove_any'), (2, 0, 'poll_remove_any')");
// Moderators need these permissions ;).
mysql_query("
INSERT IGNORE INTO {$db_prefix}board_permissions
(ID_GROUP, ID_BOARD, permission)
VALUES (3, 0, 'moderate_board'), (2, 0, 'moderate_board')");
debug_info('done. ');
}
if ($_GET['t'] <= 3)
{
pastTime('t=3');
debug_info(' Creating "moderators"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}moderators (
ID_BOARD smallint(5) unsigned NOT NULL default '0',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (ID_BOARD, ID_MEMBER)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 4)
{
pastTime('t=4');
debug_info(' Creating "attachments"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}attachments (
ID_ATTACH int(11) unsigned NOT NULL auto_increment,
ID_MSG int(10) unsigned NOT NULL default '0',
ID_MEMBER int(10) unsigned NOT NULL default '0',
filename tinytext NOT NULL default '',
size int(10) unsigned NOT NULL default '0',
downloads mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (ID_ATTACH),
UNIQUE ID_MEMBER (ID_MEMBER, ID_ATTACH),
KEY ID_MSG (ID_MSG)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 5)
{
pastTime('t=5');
debug_info(' Creating "log_notify"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}log_notify (
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
ID_TOPIC mediumint(8) unsigned NOT NULL default '0',
ID_BOARD smallint(5) unsigned NOT NULL default '0',
sent tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (ID_MEMBER, ID_TOPIC, ID_BOARD)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 6)
{
pastTime('t=6');
debug_info(' Creating "log_polls"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}log_polls (
ID_POLL mediumint(8) unsigned NOT NULL default '0',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
ID_CHOICE tinyint(4) unsigned NOT NULL default '0',
PRIMARY KEY (ID_POLL, ID_MEMBER, ID_CHOICE)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 7)
{
pastTime('t=7');
debug_info(' Creating "poll_choices"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}poll_choices (
ID_POLL mediumint(8) unsigned NOT NULL default '0',
ID_CHOICE tinyint(4) unsigned NOT NULL default '0',
label tinytext NOT NULL default '',
votes smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (ID_POLL, ID_CHOICE)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 8)
{
pastTime('t=8');
debug_info(' Creating "log_actions"... ');
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}log_actions (
ID_ACTION int(10) unsigned NOT NULL auto_increment,
logTime int(10) unsigned NOT NULL default '0',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
IP tinytext NOT NULL default '',
action varchar(30) NOT NULL default '',
extra text NOT NULL default '',
PRIMARY KEY (ID_ACTION),
KEY logTime (logTime),
KEY ID_MEMBER (ID_MEMBER)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 9)
{
pastTime('t=9');
debug_info(' Creating "log_search"... ');
mysql_query("
DROP TABLE {$db_prefix}log_search");
idb_query("
CREATE TABLE {$db_prefix}log_search (
ID_SEARCH tinyint(3) unsigned NOT NULL default '0',
ID_TOPIC mediumint(8) unsigned NOT NULL default '0',
ID_MSG int(10) unsigned NOT NULL default '0',
relevance smallint(5) unsigned NOT NULL default '0',
num_matches smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (ID_SEARCH, ID_TOPIC)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 10)
{
pastTime('t=10');
debug_info(' Creating "smileys"... ');
$create_smileys = "
CREATE TABLE {$db_prefix}smileys (
ID_SMILEY smallint(5) unsigned NOT NULL auto_increment,
code varchar(30) NOT NULL default '',
filename varchar(48) NOT NULL default '',
description varchar(80) NOT NULL default '',
smileyRow tinyint(4) unsigned NOT NULL default '0',
smileyOrder tinyint(4) unsigned NOT NULL default '0',
hidden tinyint(4) unsigned NOT NULL default '0',
PRIMARY KEY (ID_SMILEY),
KEY smileyOrder (smileyOrder)
) TYPE=MyISAM";
mysql_query($create_smileys) or $db_error = true;
// The table was probably already created.
if (!$db_error)
{
idb_query("
INSERT INTO {$db_prefix}smileys
(code, filename, description, smileyOrder, hidden)
VALUES (':)', 'smiley.gif', 'Smiley', 0, 0),
(';)', 'wink.gif', 'Wink', 1, 0),
(':D', 'cheesy.gif', 'Cheesy', 2, 0),
(';D', 'grin.gif', 'Grin', 3, 0),
('>:(', 'angry.gif', 'Angry', 4, 0),
(':(', 'sad.gif', 'Sad', 5, 0),
(':o', 'shocked.gif', 'Shocked', 6, 0),
('8)', 'cool.gif', 'Cool', 7, 0),
('???', 'huh.gif', 'Huh', 8, 0),
('::)', 'rolleyes.gif', 'Roll Eyes', 9, 0),
(':P', 'tongue.gif', 'Tongue', 10, 0),
(':-[', 'embarassed.gif', 'Embarrassed', 11, 0),
(':-X', 'lipsrsealed.gif', 'Lips Sealed', 12, 0),
(':-\\\\', 'undecided.gif', 'Undecided', 13, 0),
(':-*', 'kiss.gif', 'Kiss', 14, 0),
(':\\'(', 'cry.gif', 'Cry', 15, 0),
('>:D', 'evil.gif', 'Evil', 16, 1),
('^-^', 'azn.gif', 'Azn', 17, 1),
('O0', 'afro.gif', 'Afro', 18, 1)");
if ($db_error) return;
}
else
$db_error = false;
debug_info('done. ');
}
if ($_GET['t'] <= 11)
{
pastTime('t=11');
debug_info(' Creating "sessions"... ');
mysql_query("
DROP TABLE {$db_prefix}sessions");
idb_query("
CREATE TABLE {$db_prefix}sessions (
session_id char(32) NOT NULL,
last_update int(10) unsigned NOT NULL,
data text NOT NULL,
PRIMARY KEY (session_id)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 12 && $doSettingsTableFix)
{
pastTime('t=12');
debug_info(' Creating temporary "fix_settings"... ');
idb_query("
CREATE TABLE {$db_prefix}fix_settings (
variable tinytext NOT NULL default '',
value text,
PRIMARY KEY (variable(30))
) TYPE=MyISAM");
if ($db_error) return;
idb_query("
INSERT INTO {$db_prefix}fix_settings
(variable, value)
SELECT variable, value
FROM {$db_prefix}settings
GROUP BY variable");
if ($db_error) return;
idb_query("
RENAME TABLE
{$db_prefix}settings TO {$db_prefix}old_settings,
{$db_prefix}fix_settings TO {$db_prefix}settings");
if ($db_error) return;
idb_query("
DROP TABLE {$db_prefix}old_settings");
if ($db_error) return;
debug_info('done. ');
}
echo '
Successful.
';
$_GET['t'] = 0;
return doStep3();
}
// Step 3: Logs and such.
function doStep3()
{
global $db_error, $db_prefix;
$_GET['step'] = '3';
if (!isset($_GET['t']))
$_GET['t'] = 0;
else
$_GET['t'] = (int) $_GET['t'];
echo '
Converting activity logs...';
debug_info(' ');
if ($_GET['t'] <= 0)
{
pastTime('t=0');
debug_info(' Converting "log_online" and "log_floodcontrol"... ');
// Just drop the old who's online log, it only matters for 15 minutes...
idb_query("
DROP TABLE IF EXISTS {$db_prefix}log_online");
if ($db_error) return;
idb_query("
CREATE TABLE {$db_prefix}log_online (
session char(32) NOT NULL default ' ',
logTime timestamp(14),
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
ip int(11) unsigned NOT NULL default '0',
url text NOT NULL default '',
PRIMARY KEY (session),
KEY online (logTime, ID_MEMBER),
KEY ID_MEMBER (ID_MEMBER)
) TYPE=MyISAM");
if ($db_error) return;
// Same with floodcontrol.
idb_query("
DROP TABLE IF EXISTS {$db_prefix}log_floodcontrol");
if ($db_error) return;
idb_query("
CREATE TABLE {$db_prefix}log_floodcontrol (
ip tinytext NOT NULL default '',
logTime int(10) unsigned NOT NULL default '0',
PRIMARY KEY (ip(16)),
KEY logTime (logTime)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 1)
{
pastTime('t=1');
debug_info(' Converting "log_karma"... ');
// Just drop the old karma log too...
idb_query("
DROP TABLE IF EXISTS {$db_prefix}log_karma");
if ($db_error) return;
idb_query("
CREATE TABLE {$db_prefix}log_karma (
ID_TARGET mediumint(8) unsigned NOT NULL default '0',
ID_EXECUTOR mediumint(8) unsigned NOT NULL default '0',
logTime int(10) unsigned NOT NULL default '0',
action tinyint(4) NOT NULL default '0',
PRIMARY KEY (ID_TARGET, ID_EXECUTOR),
KEY logTime (logTime)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 2)
{
pastTime('t=2');
debug_info(' Retiring "log_clicks"... ');
// Sianara, oh table of slowness and automatic locking.
idb_query("
DROP TABLE IF EXISTS {$db_prefix}log_clicks");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['t'] <= 3)
{
pastTime('t=3');
debug_info(' Converting "log_activity"... ');
// DATE is faster than all this day, month, year junk.
mysql_query("
ALTER TABLE {$db_prefix}log_activity
DROP PRIMARY KEY,
ADD date date NOT NULL default '0000-00-00'") or $db_error = true;
// Perhaps they've already run the installer? If so, no need to convert the old stats.
if (!$db_error)
{
// Update the date.
idb_query("
UPDATE {$db_prefix}log_activity
SET date = year * 10000 + month * 100 + day");
if ($db_error) return;
idb_query("
ALTER TABLE {$db_prefix}log_activity
DROP day,
DROP month,
DROP year");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}log_activity
ADD INDEX hits (hits)");
mysql_query("
ALTER TABLE {$db_prefix}log_activity
ADD PRIMARY KEY (date)");
// Show me a forum that gets a kabillion hits/topics per day. Just show me /one/.
idb_query("
ALTER TABLE {$db_prefix}log_activity
CHANGE COLUMN hits hits mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN topics topics smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN posts posts smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN registers registers smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN mostOn mostOn smallint(5) unsigned NOT NULL default '0'");
if ($db_error) return;
}
else
$db_error = false;
debug_info('done. ');
}
if ($_GET['t'] <= 4)
{
pastTime('t=4');
debug_info(' Converting "log_notify"... ');
mysql_query("
INSERT IGNORE INTO {$db_prefix}log_notify
SELECT ID_MEMBER, ID_TOPIC, 0, notificationSent
FROM {$db_prefix}log_topics
WHERE notificationSent != 0");
mysql_query("
ALTER TABLE {$db_prefix}log_topics
DROP notificationSent");
debug_info('done. ');
}
if ($_GET['t'] <= 5)
{
pastTime('t=5');
debug_info(' Converting "log_errors"... ');
mysql_query("
ALTER TABLE {$db_prefix}log_errors
CHANGE COLUMN ID_ERROR ID_ERROR mediumint(8) unsigned NOT NULL auto_increment,
ADD session char(32) NOT NULL default ' '");
debug_info('done. ');
}
if ($_GET['t'] <= 6)
{
pastTime('t=6');
debug_info(' Converting "log_boards"... ');
// Update log_boards to optimize the board index query.
$query = idb_query("
SELECT lmr.ID_BOARD, lmr.ID_MEMBER, lmr.logTime
FROM {$db_prefix}log_mark_read AS lmr
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = lmr.ID_BOARD AND lb.ID_MEMBER = lmr.ID_MEMBER)
WHERE lb.logTime < lmr.logTime");
if ($db_error) return;
$setString = '';
while ($row = mysql_fetch_assoc($query))
$setString .= "
($row[ID_BOARD], $row[ID_MEMBER], $row[logTime]),";
if (strlen($setString) > 0)
{
idb_query("
REPLACE INTO {$db_prefix}log_boards
(ID_BOARD, ID_MEMBER, logTime)
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
debug_info('done. ');
}
echo '
Successful.
';
$_GET['t'] = 0;
return doStep4();
}
// Step 4: Boards and Categories.
function doStep4()
{
global $db_error, $db_prefix, $modSettings;
global $member_groups, $boardList;
$_GET['step'] = '4';
if (!isset($_GET['p']))
$_GET['p'] = 0;
else
$_GET['p'] = (int) $_GET['p'];
echo '
Converting Boards and Categories... ';
debug_info(' ');
if ($_GET['p'] <= 0)
{
pastTime('p=0');
debug_info(' Converting "boards" (part 1)... ');
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD lastUpdated int(11) unsigned NOT NULL default '0',
ADD ID_PARENT smallint(5) unsigned NOT NULL default '0',
ADD ID_LAST_MSG int(10) unsigned NOT NULL default '0',
CHANGE COLUMN count countPosts tinyint(4) NOT NULL default '0',
ADD childLevel tinyint(4) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}boards
CHANGE COLUMN boardOrder boardOrder smallint(5) NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}boards
DROP isAnnouncement");
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD ID_THEME tinyint(4) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD use_local_permissions tinyint(4) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD override_theme tinyint(4) unsigned NOT NULL default '0'");
// Check to see if some permissions need upgrading (this can only be done once.)
$request = mysql_query("
SHOW COLUMNS
FROM {$db_prefix}boards
LIKE 'notifyAnnouncements'");
$need_permission_split = mysql_num_rows($request) > 0;
mysql_free_result($request);
if ($need_permission_split)
{
$conversions = array(
'moderate_forum' => array('manage_membergroups', 'manage_bans'),
'admin_forum' => array('manage_permissions'),
'edit_forum' => array('manage_boards', 'manage_smileys', 'manage_attachments'),
);
foreach ($conversions as $original_permission => $new_permissions)
{
$setString = '';
$result = idb_query("
SELECT ID_GROUP, addDeny
FROM {$db_prefix}permissions
WHERE permission = '$original_permission'");
while ($row = mysql_fetch_assoc($result))
$setString .= "
('" . implode("', $row[ID_GROUP], $row[addDeny]),
('", $new_permissions) . "', $row[ID_GROUP], $row[addDeny]),";
mysql_free_result($result);
if ($setString != '')
idb_query("
INSERT IGNORE INTO {$db_prefix}permissions
(permission, ID_GROUP, addDeny)
VALUES" . substr($setString, 0, -1));
}
if ($db_error) return;
idb_query("
DELETE FROM {$db_prefix}permissions
WHERE permission = 'edit_forum'");
if ($db_error) return;
idb_query("
ALTER TABLE {$db_prefix}boards
DROP COLUMN notifyAnnouncements");
if ($db_error) return;
}
debug_info('done. ');
}
if ($_GET['p'] <= 1)
{
pastTime('p=1');
debug_info(' Converting "boards" (part 2)... ');
mysql_query("
ALTER TABLE {$db_prefix}boards
DROP INDEX ID_CAT,
DROP ID_LAST_TOPIC");
mysql_query("
ALTER TABLE {$db_prefix}boards
DROP INDEX memberGroups");
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD INDEX lastUpdated (lastUpdated),
ADD INDEX boardOrder (boardOrder),
ADD INDEX memberGroups (memberGroups(48)),
ADD UNIQUE INDEX categories (ID_CAT, ID_BOARD),
ADD UNIQUE INDEX children (childLevel, ID_PARENT, boardOrder, ID_BOARD)");
debug_info('done. ');
}
if ($_GET['p'] <= 2)
{
pastTime('p=2');
debug_info(' Converting "boards" (part 3)... ');
idb_query("
ALTER TABLE {$db_prefix}boards
DROP PRIMARY KEY,
CHANGE COLUMN ID_CAT ID_CAT tinyint(4) unsigned NOT NULL default '0',
CHANGE COLUMN numTopics numTopics mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN numPosts numPosts mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN description description text NOT NULL default '',
CHANGE COLUMN ID_BOARD ID_BOARD smallint(5) unsigned NOT NULL auto_increment PRIMARY KEY");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 3)
{
pastTime('p=3');
debug_info(' Converting access permissions... ');
getMemberGroups();
mysql_query("
ALTER TABLE {$db_prefix}boards
ADD memberGroups varchar(128) NOT NULL default '-1,0'") or $db_error = true;
if (!$db_error)
{
$result = idb_query("
SELECT memberGroups, ID_CAT
FROM {$db_prefix}categories");
if ($db_error) return;
while ($row = mysql_fetch_assoc($result))
{
if (trim($row['memberGroups']) != '')
{
$membergroups = array_unique(explode(',', $row['memberGroups']));
foreach ($membergroups as $k => $check)
{
$membergroups[$k] = trim($membergroups[$k]);
if ($membergroups[$k] == '' || !isset($member_groups[$membergroups[$k]]) || $member_groups[$membergroups[$k]] == 8)
{
unset($membergroups[$k]);
continue;
}
$membergroups[$k] = $member_groups[$membergroups[$k]];
}
$membergroups[] = 2;
$groups = implode(',', array_unique($membergroups));
}
else
$groups = '-1,0,2';
idb_query("
UPDATE {$db_prefix}boards
SET memberGroups = '$groups', lastUpdated = " . time() . "
WHERE ID_CAT = $row[ID_CAT]");
if ($db_error) return;
}
// Now unnecessary.
idb_query("
ALTER TABLE {$db_prefix}categories
DROP memberGroups");
if ($db_error) return;
}
else
{
mysql_query("
ALTER TABLE {$db_prefix}boards
CHANGE COLUMN memberGroups memberGroups varchar(128) NOT NULL default '-1,0'");
$db_error = false;
}
debug_info('done. ');
}
if ($_GET['p'] <= 4)
{
pastTime('p=4');
debug_info(' Converting board statistics... ');
// Update the last message stored for each board.
$result = idb_query("
SELECT MAX(m.ID_MSG) AS ID_LAST_MSG, t.ID_BOARD
FROM {$db_prefix}messages AS m, {$db_prefix}topics AS t
WHERE m.ID_MSG = t.ID_LAST_MSG
GROUP BY t.ID_BOARD");
if ($db_error) return;
$last_msgs = array();
while ($row = mysql_fetch_assoc($result))
$last_msgs[] = $row['ID_LAST_MSG'];
if (!empty($last_msgs))
{
$result = idb_query("
SELECT m.ID_MSG, m.posterTime, t.ID_BOARD
FROM {$db_prefix}messages AS m, {$db_prefix}topics AS t
WHERE t.ID_TOPIC = m.ID_TOPIC
AND m.ID_MSG IN (" . implode(',', $last_msgs) . ")
LIMIT " . count($last_msgs));
if ($db_error) return;
while ($row = mysql_fetch_assoc($result))
{
idb_query("
UPDATE {$db_prefix}boards
SET ID_LAST_MSG = $row[ID_MSG], lastUpdated = $row[posterTime]
WHERE ID_BOARD = $row[ID_BOARD]");
if ($db_error) return;
}
}
debug_info('done. ');
}
if ($_GET['p'] <= 5)
{
pastTime('p=5');
debug_info(' Converting "moderators"... ');
// Change over the moderators as well.
$result = mysql_query("
SELECT moderators, ID_BOARD
FROM {$db_prefix}boards
WHERE moderators != ''") or $db_error = true;
if (!$db_error)
{
$setString = '';
while ($row = mysql_fetch_assoc($result))
{
$moderators = array_unique(explode(',', $row['moderators']));
foreach ($moderators as $k => $check)
{
$moderators[$k] = addslashes(trim($moderators[$k]));
if ($moderators[$k] == '')
unset($moderators[$k]);
}
if (!empty($moderators))
{
$resultMod = idb_query("
SELECT ID_MEMBER
FROM {$db_prefix}members
WHERE memberName IN ('" . implode("','", $moderators) . "')
LIMIT " . count($moderators));
if ($db_error) return;
while ($rowMod = mysql_fetch_assoc($resultMod))
$setString .= "
($row[ID_BOARD], $rowMod[ID_MEMBER]),";
mysql_free_result($resultMod);
}
}
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}moderators
(ID_BOARD, ID_MEMBER)
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
idb_query("
ALTER TABLE {$db_prefix}boards
DROP moderators");
if ($db_error) return;
}
else
$db_error = false;
debug_info('done. ');
}
if ($_GET['p'] <= 6)
{
pastTime('p=6');
debug_info(' Converting "categories"... ');
mysql_query("
ALTER TABLE {$db_prefix}categories
DROP PRIMARY KEY,
CHANGE COLUMN ID_CAT ID_CAT tinyint(4) unsigned NOT NULL auto_increment PRIMARY KEY,
ADD canCollapse tinyint(1) NOT NULL default '1'");
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}collapsed_categories (
ID_CAT tinyint(4) unsigned NOT NULL default '0',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (ID_CAT, ID_MEMBER)
) TYPE=MyISAM");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 7)
{
pastTime('p=7');
debug_info(' Converting board and category order... ');
getBoardTree();
if ($db_error) return;
$catOrder = 0;
$boardOrder = 0;
foreach ($boardList as $id_cat => $list)
{
idb_query("
UPDATE {$db_prefix}categories
SET catOrder = " . $catOrder++ . "
WHERE ID_CAT = $id_cat
LIMIT 1");
foreach ($list as $id_board)
idb_query("
UPDATE {$db_prefix}boards
SET boardOrder = " . $boardOrder++ . "
WHERE ID_BOARD = $id_board
LIMIT 1");
}
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 8 && (!isset($modSettings['smfVersion']) || (substr($modSettings['smfVersion'], 0, 9) == '1.0 Beta ' && $modSettings['smfVersion']{9} <= 5)))
{
pastTime('p=8');
debug_info(' Converting board access... ');
$all_groups = array();
$result = idb_query("
SELECT ID_GROUP
FROM {$db_prefix}membergroups");
while ($row = mysql_fetch_assoc($result))
$all_groups[] = $row['ID_GROUP'];
mysql_free_result($result);
if ($db_error) return;
$result = idb_query("
SELECT ID_BOARD, memberGroups
FROM {$db_prefix}boards
WHERE FIND_IN_SET(0, memberGroups)");
if ($db_error) return;
while ($row = mysql_fetch_assoc($result))
{
idb_query("
UPDATE {$db_prefix}boards
SET memberGroups = '" . implode(',', array_unique(array_merge(explode(',', $row['memberGroups']), $all_groups))) . "'
WHERE ID_BOARD = $row[ID_BOARD]
LIMIT 1");
if ($db_error) return;
}
mysql_free_result($result);
// The following fix possible errors in memberGroups.
idb_query("
UPDATE {$db_prefix}boards
SET memberGroups = SUBSTRING(memberGroups, 2)
WHERE SUBSTRING(memberGroups, 1, 1) = ','");
idb_query("
UPDATE {$db_prefix}boards
SET memberGroups = SUBSTRING(memberGroups, 1, LENGTH(memberGroups) - 1)
WHERE SUBSTRING(memberGroups, LENGTH(memberGroups)) = ','");
idb_query("
UPDATE {$db_prefix}boards
SET memberGroups = REPLACE(',,', ',', REPLACE(',,', ',', memberGroups))
WHERE LOCATE(',,', memberGroups)");
debug_info('done. ');
}
echo '
Successful.
';
$_GET['p'] = 0;
return doStep5();
}
// Step 5: Attachments and Messages.
function doStep5()
{
global $db_error, $db_prefix;
$_GET['step'] = '5';
if (!isset($_GET['p']))
$_GET['p'] = 0;
else
$_GET['p'] = (int) $_GET['p'];
echo '
Converting attachments, topics, and messages... ';
debug_info(' ');
// Find out what needs to be done to the messages table...
$result = idb_query("
SHOW FIELDS
FROM {$db_prefix}messages");
$current_fields = array();
while ($row = mysql_fetch_assoc($result))
$current_fields[$row['Field']] = $row['Type'];
mysql_free_result($result);
if ($_GET['p'] <= 0 && isset($current_fields['attachmentFilename']))
{
pastTime('p=0');
debug_info(' Converting "attachments"... ');
mysql_query("
INSERT INTO {$db_prefix}attachments
(ID_MSG, filename, size)
SELECT ID_MSG, attachmentFilename, attachmentSize
FROM {$db_prefix}messages
WHERE attachmentFilename IS NOT NULL
AND attachmentFilename != ''");
mysql_query("
ALTER TABLE {$db_prefix}messages
DROP attachmentSize,
DROP attachmentFilename");
debug_info('done. ');
}
elseif ($_GET['p'] <= 0)
{
pastTime('p=0');
debug_info(' Updating keys on "attachments"... ');
mysql_query("
ALTER TABLE {$db_prefix}attachments
DROP INDEX ID_MEMBER,
ADD UNIQUE ID_MEMBER (ID_MEMBER, ID_ATTACH)");
debug_info('done. ');
}
if ($_GET['p'] <= 1 && $current_fields['ID_MSG'] != 'int(10) unsigned')
{
pastTime('p=1');
debug_info(' Converting "messages" (part 1)... ');
// Not technically for messages, but bleh.
mysql_query("
ALTER TABLE {$db_prefix}attachments
CHANGE COLUMN size size int(10) unsigned NOT NULL default '0'");
idb_query("
ALTER TABLE {$db_prefix}messages
DROP PRIMARY KEY,
CHANGE COLUMN ID_MSG ID_MSG int(10) unsigned NOT NULL auto_increment PRIMARY KEY");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 2)
{
pastTime('p=2');
debug_info(' Converting "messages" (part 2)... ');
if ($current_fields['ID_TOPIC'] != 'mediumint(8) unsigned')
idb_query("
ALTER TABLE {$db_prefix}messages
CHANGE COLUMN ID_TOPIC ID_TOPIC mediumint(8) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}messages
CHANGE COLUMN smiliesEnabled smileysEnabled tinyint(4) NOT NULL default '1'");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 3)
{
pastTime('p=3');
debug_info(' Converting "messages" (part 3)... ');
if ($current_fields['posterTime'] != 'int(10) unsigned')
{
idb_query("
ALTER TABLE {$db_prefix}messages
CHANGE COLUMN posterTime posterTime int(10) unsigned NOT NULL default '0',
CHANGE COLUMN modifiedTime modifiedTime int(10) unsigned NOT NULL default '0'");
if ($db_error) return;
}
mysql_query("
ALTER TABLE {$db_prefix}messages
ADD INDEX participation (ID_MEMBER, ID_TOPIC)");
mysql_query("
ALTER TABLE {$db_prefix}messages
ADD INDEX ipIndex (posterIP(15), ID_TOPIC)");
debug_info('done. ');
}
if ($_GET['p'] <= 4)
{
pastTime('p=4');
debug_info(' Converting "messages" (part 4)... ');
if ($current_fields['ID_MEMBER'] != 'mediumint(8) unsigned')
mysql_query("
ALTER TABLE {$db_prefix}messages
CHANGE COLUMN ID_MEMBER ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN icon icon varchar(16) NOT NULL default 'xx'");
mysql_query("
ALTER TABLE {$db_prefix}messages
ADD INDEX ID_MEMBER (ID_MEMBER)");
mysql_query("
ALTER TABLE {$db_prefix}messages
ADD UNIQUE INDEX topic (ID_TOPIC, ID_MSG)");
debug_info('done. ');
}
if ($_GET['p'] <= 5 && !isset($current_fields['ID_BOARD']))
{
pastTime('p=5');
debug_info(' Converting "messages" (part 5)... ');
idb_query("
ALTER TABLE {$db_prefix}messages
ADD COLUMN ID_BOARD smallint(5) unsigned NOT NULL default '0'");
if ($db_error) return;
debug_info('done ');
}
if ($_GET['p'] <= 6)
{
debug_info(' Converting "messages" (part 6)... ');
while (true)
{
pastTime('p=6');
$request = idb_query("
SELECT DISTINCT t.ID_BOARD, t.ID_TOPIC
FROM {$db_prefix}messages AS m, {$db_prefix}topics AS t
WHERE t.ID_TOPIC = m.ID_TOPIC
AND m.ID_BOARD = 0
LIMIT 1400");
if ($db_error) return;
$boards = array();
while ($row = mysql_fetch_assoc($request))
$boards[$row['ID_BOARD']][] = $row['ID_TOPIC'];
foreach ($boards as $board => $topics)
idb_query("
UPDATE {$db_prefix}messages
SET ID_BOARD = $board
WHERE ID_TOPIC IN (" . implode(', ', $topics) . ')');
if (mysql_num_rows($request) < 1400)
break;
mysql_free_result($request);
$request = idb_query("
SELECT DISTINCT t.ID_BOARD, t.ID_TOPIC
FROM {$db_prefix}messages AS m, {$db_prefix}topics AS t
WHERE t.ID_TOPIC = m.ID_TOPIC
AND m.ID_BOARD != t.ID_BOARD
LIMIT 1000");
if ($db_error) return;
$boards = array();
while ($row = mysql_fetch_assoc($request))
$boards[$row['ID_BOARD']][] = $row['ID_TOPIC'];
foreach ($boards as $board => $topics)
idb_query("
UPDATE {$db_prefix}messages
SET ID_BOARD = $board
WHERE ID_TOPIC IN (" . implode(', ', $topics) . ')');
if (mysql_num_rows($request) < 1000)
break;
mysql_free_result($request);
}
pastTime('p=6');
mysql_query("
ALTER TABLE {$db_prefix}messages
ADD INDEX ID_BOARD (ID_BOARD)");
debug_info('done ');
}
// Find out what needs to be done to the topics table...
$result = idb_query("
SHOW FIELDS
FROM {$db_prefix}topics");
$current_fields = array();
while ($row = mysql_fetch_assoc($result))
$current_fields[$row['Field']] = $row['Type'];
mysql_free_result($result);
if ($_GET['p'] <= 7 && $current_fields['ID_BOARD'] != 'smallint(5) unsigned')
{
pastTime('p=7');
debug_info(' Converting "topics" (part 1)... ');
idb_query("
ALTER TABLE {$db_prefix}topics
DROP PRIMARY KEY,
CHANGE COLUMN ID_TOPIC ID_TOPIC mediumint(8) unsigned NOT NULL auto_increment PRIMARY KEY,
CHANGE COLUMN ID_BOARD ID_BOARD smallint(5) unsigned NOT NULL default '0'");
if ($db_error) return;
debug_info('done ');
}
if ($_GET['p'] <= 8 && $current_fields['ID_MEMBER_STARTED'] != 'mediumint(8) unsigned')
{
pastTime('p=8');
debug_info(' Converting "topics" (part 2)... ');
idb_query("
ALTER TABLE {$db_prefix}topics
CHANGE COLUMN ID_MEMBER_STARTED ID_MEMBER_STARTED mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN ID_MEMBER_UPDATED ID_MEMBER_UPDATED mediumint(8) unsigned NOT NULL default '0'");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 9 && $current_fields['ID_FIRST_MSG'] != 'int(10) unsigned')
{
pastTime('p=9');
debug_info(' Converting "topics" (part 3)... ');
idb_query("
ALTER TABLE {$db_prefix}topics
CHANGE COLUMN ID_FIRST_MSG ID_FIRST_MSG int(10) unsigned NOT NULL default '0',
CHANGE COLUMN ID_LAST_MSG ID_LAST_MSG int(10) unsigned NOT NULL default '0'");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 10)
{
pastTime('p=10');
debug_info(' Converting "topics" (part 4)... ');
mysql_query("
ALTER TABLE {$db_prefix}topics
DROP INDEX ID_FIRST_MSG");
mysql_query("
ALTER TABLE {$db_prefix}topics
DROP INDEX ID_LAST_MSG");
mysql_query("
ALTER TABLE {$db_prefix}topics
ADD INDEX isSticky (isSticky)");
debug_info('done. ');
}
if ($_GET['p'] <= 10)
{
pastTime('p=10');
debug_info(' Converting "topics" (part 4)... ');
mysql_query("
ALTER IGNORE TABLE {$db_prefix}topics
ADD UNIQUE INDEX lastMessage (ID_LAST_MSG, ID_BOARD),
ADD UNIQUE INDEX firstMessage (ID_FIRST_MSG, ID_BOARD),
ADD UNIQUE INDEX poll (ID_POLL, ID_TOPIC)");
debug_info('done. ');
}
if ($_GET['p'] <= 12 && $current_fields['ID_POLL'] != 'mediumint(8) unsigned')
{
pastTime('p=12');
debug_info(' Converting "topics" (part 6)... ');
mysql_query("
ALTER TABLE {$db_prefix}topics
CHANGE COLUMN ID_POLL ID_POLL mediumint(8) unsigned NOT NULL default '0'");
debug_info('done. ');
}
if ($_GET['p'] <= 13)
{
pastTime('p=13');
debug_info(' Cleaning up "messages"... ');
mysql_query("
ALTER TABLE {$db_prefix}messages
DROP INDEX posterTime_2,
DROP INDEX posterTime_3");
debug_info('done. ');
}
echo '
Successful.
';
$_GET['p'] = 0;
return doStep6();
}
// Step 6: Members and Personal Messages.
function doStep6()
{
global $db_error, $db_prefix;
global $memberChunkSize;
global $JrPostNum, $FullPostNum, $SrPostNum, $HeroPostNum, $GodPostNum;
$_GET['step'] = '6';
if (!isset($_GET['p']))
$_GET['p'] = 0;
else
$_GET['p'] = (int) $_GET['p'];
echo '
Converting members and personal messages... ';
debug_info(' ');
if ($_GET['p'] <= 0)
{
pastTime('p=0');
debug_info(' Converting "members" (part 1)... ');
mysql_query("
ALTER TABLE {$db_prefix}members
DROP INDEX memberID");
mysql_query("
ALTER TABLE {$db_prefix}members
DROP INDEX memberID_2");
mysql_query("
ALTER TABLE {$db_prefix}members
DROP PRIMARY KEY,
CHANGE COLUMN ID_MEMBER ID_MEMBER mediumint(8) unsigned NOT NULL auto_increment PRIMARY KEY,
ADD instantMessages smallint(5) NOT NULL default 0,
ADD unreadMessages smallint(5) NOT NULL default 0,
ADD ID_THEME tinyint(4) unsigned NOT NULL default 0,
ADD ID_GROUP smallint(5) unsigned NOT NULL default 0,
ADD is_activated tinyint(3) unsigned NOT NULL default '1',
ADD validation_code varchar(10) NOT NULL default '',
ADD ID_MSG_LAST_VISIT int(10) unsigned NOT NULL default '0',
ADD additionalGroups tinytext NOT NULL default ''");
mysql_query("
ALTER TABLE {$db_prefix}members
CHANGE COLUMN ID_THEME ID_THEME tinyint(4) unsigned NOT NULL default 0");
mysql_query("
ALTER TABLE {$db_prefix}members
ADD showOnline tinyint(4) NOT NULL default '1'");
mysql_query("
ALTER TABLE {$db_prefix}members
ADD smileySet varchar(48) NOT NULL default ''");
mysql_query("
ALTER TABLE {$db_prefix}members
ADD totalTimeLoggedIn int(10) unsigned NOT NULL default '0'");
// We now support vBulletin 3 and Invision 2 converted passwords!!
mysql_query("
ALTER TABLE {$db_prefix}members
ADD passwordSalt varchar(5) NOT NULL default ''");
debug_info('done. ');
}
if ($_GET['p'] <= 1)
{
pastTime('p=1');
debug_info(' Converting "members" (part 2)... ');
$request = mysql_query("
SELECT COUNT(ID_MEMBER)
FROM {$db_prefix}members");
list ($memberCount) = mysql_fetch_row($request);
if (!isset($_GET['m']))
$_GET['m'] = 0;
else
$_GET['m'] = (int) $_GET['m'];
while ($_GET['m'] < $memberCount)
{
pastTime('p=1;m=' . $_GET['m']);
debug_info(' Members #' . ($_GET['m'] + 1) . ' - #' . min($_GET['m'] + 1 + $memberChunkSize, $memberCount) . '... ');
// Update each person's ignore list.
$mrequest = idb_query("
SELECT ID_MEMBER, im_ignore_list, gender, secretAnswer
FROM {$db_prefix}members
LIMIT $_GET[m], $memberChunkSize");
if ($db_error) return;
while ($row = mysql_fetch_assoc($mrequest))
{
if (preg_match('~[[:alpha:]]~', $row['im_ignore_list']) == 0)
$im_ignore_list = $row['im_ignore_list'];
elseif (preg_match('~(\A|,|\n)\*(\Z|,|\n)~s', $row['im_ignore_list']) == 0)
{
$result = idb_query("
SELECT ID_MEMBER
FROM {$db_prefix}members
WHERE FIND_IN_SET(memberName, '" . addslashes($row['im_ignore_list']) . "')");
if ($db_error) return;
$im_ignore_list = '';
while ($row2 = mysql_fetch_assoc($result))
$im_ignore_list .= ',' . $row2['ID_MEMBER'];
mysql_free_result($result);
$im_ignore_list = substr($im_ignore_list, 1);
}
else
$im_ignore_list = '*';
$secretAnswer = $row['secretAnswer'] == '' ? '' : md5($row['secretAnswer']);
if (is_numeric($row['gender']))
{
$gender = $row['gender'];
$secretAnswer = $row['secretAnswer'];
}
elseif ($row['gender'] == 'Male')
$gender = 1;
elseif ($row['gender'] == 'Female')
$gender = 2;
else
$gender = 0;
if ($im_ignore_list != $row['im_ignore_list'] || $gender != $row['gender'])
idb_query("
UPDATE {$db_prefix}members
SET im_ignore_list = '$im_ignore_list', gender = $gender, secretAnswer = '$secretAnswer'
WHERE ID_MEMBER = $row[ID_MEMBER]
LIMIT 1");
}
$_GET['m'] += $memberChunkSize;
}
debug_info('done. ');
$_GET['m'] = 0;
}
if ($_GET['p'] <= 2)
{
pastTime('p=2');
debug_info(' Converting "members" (part 3)... ');
mysql_query("
ALTER TABLE {$db_prefix}members
CHANGE COLUMN timeOffset timeOffset float NOT NULL default '0',
CHANGE COLUMN posts posts mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN timeFormat timeFormat varchar(80) NOT NULL default '',
CHANGE COLUMN lastLogin lastLogin int(11) NOT NULL default '0',
CHANGE COLUMN karmaBad karmaBad smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN karmaGood karmaGood smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN gender gender tinyint(4) unsigned NOT NULL default '0',
CHANGE COLUMN hideEmail hideEmail tinyint(4) NOT NULL default '0'");
debug_info('done. ');
}
if ($_GET['p'] <= 3)
{
pastTime('p=3');
debug_info(' Converting "members" (part 3)... ');
mysql_query("
ALTER TABLE {$db_prefix}members
CHANGE COLUMN AIM AIM varchar(16) NOT NULL default '',
CHANGE COLUMN YIM YIM varchar(32) NOT NULL default '',
CHANGE COLUMN ICQ ICQ tinytext NOT NULL default '',
CHANGE COLUMN realName realName tinytext NOT NULL default '',
CHANGE COLUMN emailAddress emailAddress tinytext NOT NULL default '',
CHANGE COLUMN dateRegistered dateRegistered int(10) unsigned NOT NULL default '0',
CHANGE COLUMN passwd passwd varchar(64) NOT NULL default '',
CHANGE COLUMN personalText personalText tinytext NOT NULL default '',
CHANGE COLUMN websiteTitle websiteTitle tinytext NOT NULL default ''");
debug_info('done. ');
}
if ($_GET['p'] <= 4)
{
pastTime('p=4');
debug_info(' Converting "members" (part 3)... ');
mysql_query("
ALTER TABLE {$db_prefix}members
CHANGE COLUMN websiteUrl websiteUrl tinytext NOT NULL default '',
CHANGE COLUMN location location tinytext NOT NULL default '',
CHANGE COLUMN avatar avatar tinytext NOT NULL default '',
CHANGE COLUMN im_ignore_list im_ignore_list tinytext NOT NULL default '',
CHANGE COLUMN usertitle usertitle tinytext NOT NULL default '',
CHANGE COLUMN lngfile lngfile tinytext NOT NULL default '',
CHANGE COLUMN MSN MSN tinytext NOT NULL default '',
CHANGE COLUMN memberIP memberIP tinytext NOT NULL default ''");
mysql_query("
ALTER TABLE {$db_prefix}members
ADD INDEX ID_GROUP (ID_GROUP),
ADD INDEX birthdate (birthdate),
ADD INDEX lngfile (lngfile(30))");
debug_info('done. ');
}
if ($_GET['p'] <= 5)
{
pastTime('p=5');
debug_info(' Converting member statistics... ');
// Update the latest member. (it's now an ID not name...)
$result = idb_query("
SELECT ID_MEMBER, IFNULL(realName, memberName) AS realName
FROM {$db_prefix}members
ORDER BY dateRegistered DESC
LIMIT 1");
if ($db_error) return;
list ($latestmember, $latestRealName) = mysql_fetch_row($result);
$result = idb_query("
SELECT MAX(ID_MSG)
FROM {$db_prefix}messages");
if ($db_error) return;
list ($maxMsgID) = mysql_fetch_row($result);
mysql_free_result($result);
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES
('latestMember', '$latestmember'),
('latestRealName', '$latestRealName'),
('maxMsgID', '$maxMsgID')");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 6)
{
pastTime('p=6');
debug_info(' Converting "instant_messages" (part 1)... ');
idb_query("
ALTER TABLE {$db_prefix}instant_messages
CHANGE COLUMN ID_MEMBER_FROM ID_MEMBER_FROM mediumint(8) unsigned NOT NULL default 0,
CHANGE COLUMN msgtime msgtime int(10) unsigned NOT NULL default '0',
CHANGE COLUMN subject subject tinytext NOT NULL");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP PRIMARY KEY,
CHANGE COLUMN ID_IM ID_PM int(10) unsigned NOT NULL auto_increment PRIMARY KEY");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP INDEX fromName,
DROP INDEX ID_MEMBER_FROM");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
ADD INDEX msgtime (msgtime)");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
ADD COLUMN deletedBySender tinyint(3) unsigned NOT NULL default '0' AFTER ID_MEMBER_FROM");
// I hate duplicate keys...
for ($i = 2; $i <= 9; $i++)
{
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP INDEX ID_MEMBER_FROM_" . $i . ",
DROP INDEX ID_MEMBER_TO_" . $i . ",
DROP INDEX deletedBy_" . $i . "");
}
// A new table to store all recipients of an IM in.
idb_query("
CREATE TABLE IF NOT EXISTS {$db_prefix}im_recipients (
ID_PM int(10) unsigned NOT NULL default '0',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
bcc tinyint(3) unsigned NOT NULL default '0',
is_read tinyint(3) unsigned NOT NULL default '0',
deleted tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (ID_PM, ID_MEMBER),
KEY ID_MEMBER (ID_MEMBER, deleted)
) TYPE=MyISAM", __FILE__, __LINE__);
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}im_recipients
DROP PRIMARY KEY,
CHANGE COLUMN ID_IM ID_PM int(10) unsigned NOT NULL default '0',
ADD PRIMARY KEY (ID_PM, ID_MEMBER)");
debug_info('done. ');
}
if ($_GET['p'] <= 7)
{
pastTime('p=7');
debug_info(' Converting "instant_messages"... (part 2) ');
// Determine whether a PM upgrade is necessary or not.
$request = mysql_query("
SHOW COLUMNS
FROM {$db_prefix}instant_messages
LIKE 'deletedBy'");
$need_upgrade = mysql_num_rows($request) > 0;
mysql_free_result($request);
if ($need_upgrade)
{
// Determine whether this was an old beta or an original YaBB SE board.
$request = mysql_query("
SHOW COLUMNS
FROM {$db_prefix}instant_messages
LIKE 'toMembers'");
$from_beta = mysql_num_rows($request) > 0;
mysql_free_result($request);
if ($from_beta)
{
$request = idb_query("
SELECT ID_PM, ID_MEMBER_FROM, receivedMembers, deletedBy, readBy, toMembers
FROM {$db_prefix}instant_messages");
if ($db_error) return;
$insertRows = array();
$updateIDs = array();
while ($row = mysql_fetch_assoc($request))
{
$receivedMembers = explode(',', $row['receivedMembers']);
$toMembers = explode(',', $row['toMembers']);
$deletedBy = explode(',', $row['deletedBy']);
$readBy = explode(',', $row['readBy']);
if (empty($row['receivedMembers']))
$receivedMembers = $toMembers;
foreach ($toMembers as $toMember)
if (!empty($toMember))
$insertRows[] = "($row[ID_PM], $toMember, " . (in_array($toMember, $receivedMembers) ? '0' : '1') . ', ' . (in_array($toMember, $readBy) ? '1' : '0') . ', ' . (in_array($toMember, $deletedBy) && $toMember != $row['ID_MEMBER_FROM'] ? '1' : '0') . ')';
if (in_array($row['ID_MEMBER_FROM'], $deletedBy) && !in_array($row['ID_MEMBER_FROM'], $toMembers))
$updateIDs[] = $row['ID_PM'];
}
mysql_free_result($request);
$numRows = count($insertRows);
for ($i = 0; $i < $numRows; $i += 1000)
idb_query("
INSERT IGNORE INTO {$db_prefix}im_recipients
(ID_PM, ID_MEMBER, bcc, is_read, deleted)
VALUES " . implode(', ', array_slice($insertRows, $i, 1000)));
if (count($updateIDs) > 0)
idb_query("
UPDATE {$db_prefix}instant_messages
SET deletedBySender = 1
WHERE ID_PM IN (" . implode(', ', $updateIDs) . ')');
if ($db_error) return;
idb_query("
ALTER TABLE {$db_prefix}instant_messages
DROP COLUMN toMembers,
DROP COLUMN receivedMembers,
DROP COLUMN deletedBy");
mysql_query("
DROP COLUMN readBy");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
ADD INDEX ID_MEMBER (ID_MEMBER_FROM, deletedBySender)");
}
// Apparently you came from YaBB SE.
else
{
// Determine whether this was an old beta or an original YaBB SE board.
$request = idb_query("
SHOW COLUMNS
FROM {$db_prefix}instant_messages
LIKE 'readBy'");
if ($db_error) return;
$adv_im = mysql_num_rows($request) == 0;
mysql_free_result($request);
$request = idb_query("
SELECT ID_PM, ID_MEMBER_FROM, ID_MEMBER_TO, deletedBy, " . (!$adv_im ? 'readBy' : 'alerted AS readBy') . "
FROM {$db_prefix}instant_messages");
if ($db_error) return;
$insertRows = array();
$updateIDs = array();
while ($row = mysql_fetch_assoc($request))
{
$insertRows[] = "($row[ID_PM], $row[ID_MEMBER_TO], 0, " . (!empty($row['readBy']) ? '1' : '0') . ', ' . ($row['deletedBy'] == 1 ? '1' : '0') . ')';
if ($row['deletedBy'] == 0)
$updateIDs[] = $row['ID_PM'];
}
$numRows = count($insertRows);
for ($i = 0; $i < $numRows; $i += 1000)
idb_query("
INSERT IGNORE INTO {$db_prefix}im_recipients
(ID_PM, ID_MEMBER, bcc, is_read, deleted)
VALUES " . implode(', ', array_slice($insertRows, $i, 1000)));
if ($db_error) return;
if (count($updateIDs) > 0)
idb_query("
UPDATE {$db_prefix}instant_messages
SET deletedBySender = 1
WHERE ID_PM IN (" . implode(', ', $updateIDs) . ')');
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP INDEX ID_MEMBER_TO");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP INDEX deletedBy");
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
DROP INDEX readBy");
idb_query("
ALTER TABLE {$db_prefix}instant_messages
DROP COLUMN ID_MEMBER_TO,
DROP COLUMN deletedBy,
DROP COLUMN toName");
mysql_query("
DROP COLUMN readBy");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}instant_messages
ADD INDEX ID_MEMBER (ID_MEMBER_FROM, deletedBySender)");
}
}
debug_info('done. ');
}
mysql_query("
SELECT memberGroup
FROM {$db_prefix}members
LIMIT 1") or $db_error = true;
if ($_GET['p'] <= 8 && !$db_error)
{
pastTime('p=8');
$request = idb_query("
SELECT ID_GROUP, memberGroup
FROM {$db_prefix}membergroups");
if ($db_error) return;
$groups = array();
while ($row = mysql_fetch_assoc($request))
$groups[$row['memberGroup']] = $row['ID_GROUP'];
$groups['Administrator'] = 1;
$groups['Global Moderator'] = 2;
$request = mysql_query("
SELECT COUNT(ID_MEMBER)
FROM {$db_prefix}members");
list ($memberCount) = mysql_fetch_row($request);
if (!isset($_GET['m']))
$_GET['m'] = 0;
else
$_GET['m'] = (int) $_GET['m'];
while ($_GET['m'] < $memberCount)
{
pastTime('p=8;m=' . $_GET['m']);
debug_info(' Members #' . ($_GET['m'] + 1) . ' - #' . min($_GET['m'] + 1 + $memberChunkSize, $memberCount) . '... ');
// Update each person's language file, ID_GROUP, IMs, and make sure realName is set.
$mrequest = idb_query("
SELECT
mem.ID_MEMBER, mem.lngfile, mem.memberGroup, IFNULL(mem.realName, '') AS realName,
mem.memberName, COUNT(pmr.ID_PM) AS instantMessages
FROM {$db_prefix}members AS mem
LEFT JOIN {$db_prefix}im_recipients AS pmr ON (pmr.ID_MEMBER = mem.ID_MEMBER AND pmr.deleted = 0)
GROUP BY mem.ID_MEMBER
LIMIT $_GET[m], $memberChunkSize");
if ($db_error) return;
while ($row = mysql_fetch_assoc($mrequest))
{
$request = idb_query("
SELECT COUNT(ID_PM)
FROM {$db_prefix}im_recipients
WHERE ID_MEMBER = $row[ID_MEMBER]
AND deleted = 0
AND is_read = 0");
if ($db_error) return;
list ($row['unreadMessages']) = mysql_fetch_row($request);
mysql_free_result($request);
$extraStuff = '';
if (substr($row['lngfile'], -4) == '.lng')
$extraStuff .= ", lngfile = '" . substr($row['lngfile'], 0, -4) . "'";
if ($row['realName'] == '')
$extraStuff .= ", realName = '$row[memberName]'";
if (!empty($groups[$row['memberGroup']]))
$extraStuff .= ', ID_GROUP = ' . $groups[$row['memberGroup']];
idb_query("
UPDATE {$db_prefix}members
SET instantMessages = $row[instantMessages], unreadMessages = $row[unreadMessages]$extraStuff
WHERE ID_MEMBER = $row[ID_MEMBER]
LIMIT 1");
if ($db_error) return;
}
debug_info('done. ');
$_GET['m'] += $memberChunkSize;
}
idb_query("
ALTER TABLE {$db_prefix}members
DROP memberGroup");
if ($db_error) return;
}
else
$db_error = false;
if ($_GET['p'] <= 9)
{
pastTime('p=9');
debug_info(' Converting "membergroups"... ');
mysql_query("
SELECT minPosts
FROM {$db_prefix}membergroups
LIMIT 1") or $db_error = true;
if ($db_error)
{
$db_error = false;
idb_query("
RENAME TABLE {$db_prefix}membergroups TO {$db_prefix}old_membergroups");
if ($db_error) return;
mysql_query("
CREATE TABLE {$db_prefix}membergroups (
ID_GROUP smallint(5) unsigned NOT NULL auto_increment,
groupName varchar(80) NOT NULL default '',
onlineColor varchar(20) NOT NULL default '',
minPosts mediumint(9) NOT NULL default '-1',
maxMessages smallint(5) unsigned NOT NULL default '0',
stars tinytext NOT NULL default '',
PRIMARY KEY (ID_GROUP),
KEY minPosts (minPosts)
) TYPE=MyISAM") or $db_error = true;
}
else
$db_error = true;
// Table was already renamed or created.
if (!$db_error)
{
$request = mysql_query("
SELECT ID_GROUP, membergroup
FROM {$db_prefix}old_membergroups");
$membergroups = array();
$setString = ',';
while ($row = mysql_fetch_assoc($request))
{
$membergroups[$row['ID_GROUP']] = addslashes($row['membergroup']);
if ($row['ID_GROUP'] > 8)
$setString .= "
($row[ID_GROUP], '" . $membergroups[$row['ID_GROUP']] . "', '', -1, ''),";
}
mysql_free_result($request);
idb_query("
INSERT IGNORE INTO {$db_prefix}membergroups
(ID_GROUP, groupName, onlineColor, minPosts, stars)
VALUES (1, '$membergroups[1]', '#FF0000', -1, '5#staradmin.gif'),
(2, '$membergroups[8]', '#0000FF', -1, '5#stargmod.gif'),
(3, '$membergroups[2]', '', -1, '5#starmod.gif'),
(4, '$membergroups[3]', '', 0, '1#star.gif'),
(5, '$membergroups[4]', '', '$JrPostNum', '2#star.gif'),
(6, '$membergroups[5]', '', '$FullPostNum', '3#star.gif'),
(7, '$membergroups[6]', '', '$SrPostNum', '4#star.gif'),
(8, '$membergroups[7]', '', '" . (isset($HeroPostNum) ? $HeroPostNum : $GodPostNum) . "', '5#star.gif')" .
substr($setString, 0, -1));
if ($db_error) return;
$do_permissions = true;
}
else
$db_error = false;
mysql_query("
DROP TABLE {$db_prefix}old_membergroups");
debug_info('done. ');
}
if ($_GET['p'] <= 10)
{
pastTime('t=10');
debug_info(' Inserting default permissions... ');
// Convert these after all groups have been converted. For 0 and >= 8.
$permissions = array(
'view_mlist', 'search_posts', 'profile_view_own', 'profile_view_any', 'pm_read',
'pm_send', 'calendar_view', 'view_stats', 'who_view', 'profile_identity_own',
'profile_extra_own', 'profile_remote_avatar', 'profile_remove_own'
);
$board_permissions = array(
'delete_own', 'lock_own', 'mark_any_notify', 'mark_notify', 'modify_own',
'poll_add_own', 'poll_edit_own', 'poll_lock_own', 'poll_post', 'poll_view',
'poll_vote', 'post_attachment', 'post_new', 'post_reply_any', 'post_reply_own',
'remove_own', 'report_any', 'send_topic', 'view_attachments'
);
$result = idb_query("
SELECT ID_GROUP
FROM {$db_prefix}membergroups
WHERE minPosts = -1
AND ID_GROUP >= 4");
if ($db_error) return;
$groups = array();
while ($row = mysql_fetch_row($result))
$groups[] = $row[0];
mysql_free_result($result);
$groups[] = 0;
$groups[] = 2;
$groups = array_unique($groups);
$setString = '';
foreach ($groups as $group)
{
foreach ($permissions as $permission)
$setString .= "
($group, '$permission'),";
}
mysql_query("
INSERT INTO {$db_prefix}permissions
(ID_GROUP, permission)
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
$groups[] = 3;
$setString = '';
foreach ($groups as $group)
{
foreach ($board_permissions as $permission)
$setString .= "
($group, 0, '$permission'),";
}
mysql_query("
INSERT INTO {$db_prefix}board_permissions
(ID_GROUP, ID_BOARD, permission)
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
debug_info('done. ');
}
$request = mysql_query("
SELECT setting, value
FROM {$db_prefix}reserved_names") or $db_error = true;
if ($_GET['p'] <= 11 && !$db_error)
{
pastTime('p=11');
debug_info(' Converting "reserved_names"... ');
$words = array();
while ($row = mysql_fetch_assoc($request))
{
if (substr($row['setting'], 0, 5) == 'match')
${$row['setting']} = $row['value'];
else
$words[] = $row['value'];
}
mysql_free_result($request);
idb_query("
INSERT IGNORE INTO {$db_prefix}settings
VALUES ('reserveWord', '" . (isset($matchword) ? $matchword : 0) . "'),
('reserveCase', '" . (isset($matchcase) ? $matchcase : 0) . "'),
('reserveUser', '" . (isset($matchuser) ? $matchuser : 0) . "'),
('reserveName', '" . (isset($matchname) ? $matchname : 0) . "'),
('reserveNames', '" . implode("\n", $words) . "')");
idb_query("
DROP TABLE {$db_prefix}reserved_names");
debug_info('done. ');
}
else
$db_error = false;
if ($_GET['p'] <= 12)
{
pastTime('p=12');
debug_info(' Converting member\'s groups... ');
mysql_query("
ALTER TABLE {$db_prefix}members
ADD COLUMN ID_POST_GROUP smallint(5) unsigned NOT NULL default '0',
ADD INDEX ID_POST_GROUP (ID_POST_GROUP)");
$request = idb_query("
SELECT ID_GROUP, minPosts
FROM {$db_prefix}membergroups
WHERE minPosts != -1
ORDER BY minPosts DESC");
$post_groups = array();
while ($row = mysql_fetch_assoc($request))
$post_groups[$row['minPosts']] = $row['ID_GROUP'];
mysql_free_result($request);
$request = idb_query("
SELECT ID_MEMBER, posts
FROM {$db_prefix}members");
$mg_updates = array();
while ($row = mysql_fetch_assoc($request))
{
$group = 4;
foreach ($post_groups as $min_posts => $group_id)
if ($row['posts'] > $min_posts)
{
$group = $group_id;
break;
}
$mg_updates[$group][] = $row['ID_MEMBER'];
}
mysql_free_result($request);
foreach ($mg_updates as $group_to => $update_members)
idb_query("
UPDATE {$db_prefix}members
SET ID_POST_GROUP = $group_to
WHERE ID_MEMBER IN (" . implode(', ', $update_members) . ")
LIMIT " . count($update_members));
debug_info('done. ');
}
echo '
Successful.
';
$_GET['p'] = 0;
return doStep7();
}
// Step 7: Calendar, etc.
function doStep7()
{
global $db_error, $db_prefix;
global $notifyChunkSize, $modSettings;
$_GET['step'] = '7';
if (!isset($_GET['p']))
$_GET['p'] = 0;
else
$_GET['p'] = (int) $_GET['p'];
echo '
Converting the calendar, notifications, and miscellaneous... ';
debug_info(' ');
if ($_GET['p'] <= 0)
{
pastTime('p=0');
debug_info(' Converting "censored" and "banned"... ');
if (!isset($modSettings['censor_vulgar']) || !isset($modSettings['censor_proper']))
{
$request = idb_query("
SELECT vulgar, proper
FROM {$db_prefix}censor");
if ($db_error) return;
$censor_vulgar = array();
$censor_proper = array();
while ($row = mysql_fetch_row($request))
{
$censor_vulgar[] = trim($row[0]);
$censor_proper[] = trim($row[1]);
}
$modSettings['censor_vulgar'] = addslashes(implode("\n", $censor_vulgar));
$modSettings['censor_proper'] = addslashes(implode("\n", $censor_proper));
idb_query("
INSERT IGNORE INTO {$db_prefix}settings
(variable, value)
VALUES
('censor_vulgar', '$modSettings[censor_vulgar]'),
('censor_proper', '$modSettings[censor_proper]')");
if ($db_error) return;
}
// Get values from old ban table...
$request = mysql_query("
SELECT type, value
FROM {$db_prefix}banned") or $db_error = true;
// If the table was already replaced, skip this part.
if (!$db_error)
{
// Import old ban entries if any...
$insertEntry = array();
while ($row = mysql_fetch_assoc($request))
{
if ($row['type'] == 'ip' && preg_match("/^\d{1,3}\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)$/", $row['value']))
{
$ip_parts = ip2range($row['value']);
$insertEntry[] = "('ip_ban', {$ip_parts[0]['low']}, {$ip_parts[0]['high']}, {$ip_parts[1]['low']}, {$ip_parts[1]['high']}, {$ip_parts[2]['low']}, {$ip_parts[2]['high']}, {$ip_parts[3]['low']}, {$ip_parts[3]['high']}, '', '', 0, " . time() . ", NULL, 'full_ban', '', 'Imported from YaBB SE')";
}
elseif ($row['type'] == 'email')
$insertEntry[] = "('email_ban', 0, 0, 0, 0, 0, 0, 0, 0, '', '$row[value]', 0, " . time() . ", NULL, 'full_ban', '', 'Imported from YaBB SE')";
elseif ($row['type'] == 'username')
{
$request2 = idb_query("
SELECT ID_MEMBER
FROM {$db_prefix}members
WHERE memberName = '" . addslashes($row['value']) . "'
LIMIT 1");
if (mysql_num_rows($request2) > 0)
{
list ($memberid) = mysql_fetch_row($request2);
$insertEntry[] = "('user_ban', 0, 0, 0, 0, 0, 0, 0, 0, '', '', $memberid, " . time() . ", NULL, 'full_ban', '', 'Imported from YaBB SE')";
}
}
}
// Rename old ban table and create a new one.
idb_query("
DROP TABLE {$db_prefix}banned");
idb_query("
CREATE TABLE {$db_prefix}banned (
ID_BAN mediumint(8) unsigned NOT NULL auto_increment,
ban_type varchar(30) NOT NULL default '',
ip_low1 tinyint(3) unsigned NOT NULL default '0',
ip_high1 tinyint(3) unsigned NOT NULL default '0',
ip_low2 tinyint(3) unsigned NOT NULL default '0',
ip_high2 tinyint(3) unsigned NOT NULL default '0',
ip_low3 tinyint(3) unsigned NOT NULL default '0',
ip_high3 tinyint(3) unsigned NOT NULL default '0',
ip_low4 tinyint(3) unsigned NOT NULL default '0',
ip_high4 tinyint(3) unsigned NOT NULL default '0',
hostname tinytext NOT NULL default '',
email_address tinytext NOT NULL default '',
ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
ban_time int(10) unsigned NOT NULL default '0',
expire_time int(10) unsigned,
restriction_type varchar(30) NOT NULL default '',
reason tinytext NOT NULL default '',
notes text NOT NULL default '',
PRIMARY KEY (ID_BAN)
) TYPE=MyISAM");
// If there were values in the old table, insert them.
if (!empty($insertEntry))
{
idb_query("
INSERT INTO {$db_prefix}banned
(ban_type, ip_low1, ip_high1, ip_low2, ip_high2, ip_low3, ip_high3, ip_low4, ip_high4, hostname, email_address, ID_MEMBER, ban_time, expire_time, restriction_type, reason, notes)
VALUES " . implode(',', $insertEntry));
}
}
else
$db_error = false;
debug_info('done. ');
}
if ($_GET['p'] <= 1)
{
pastTime('p=1');
debug_info(' Converting "log_banned"... ');
mysql_query("
ALTER TABLE {$db_prefix}log_banned
CHANGE COLUMN logTime logTime int(10) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}log_banned
ADD COLUMN ID_BAN_LOG mediumint(8) unsigned NOT NULL auto_increment PRIMARY KEY FIRST,
ADD COLUMN ID_MEMBER mediumint(8) unsigned NOT NULL default '0' AFTER ID_BAN_LOG,
ADD INDEX logTime (logTime)");
debug_info('done. ');
}
if ($_GET['p'] <= 2)
{
pastTime('p=2');
debug_info(' Converting "calendar"... ');
idb_query("
DROP TABLE IF EXISTS {$db_prefix}censor");
if ($db_error) return;
mysql_query("
ALTER TABLE {$db_prefix}calendar
DROP PRIMARY KEY,
CHANGE COLUMN id ID_EVENT smallint(5) unsigned NOT NULL auto_increment PRIMARY KEY,
CHANGE COLUMN id_board ID_BOARD smallint(5) unsigned NOT NULL default '0',
CHANGE COLUMN id_topic ID_TOPIC mediumint(8) unsigned NOT NULL default '0',
CHANGE COLUMN id_member ID_MEMBER mediumint(8) unsigned NOT NULL default '0'");
mysql_query("
ALTER TABLE {$db_prefix}calendar
CHANGE COLUMN title title varchar(48) NOT NULL default ''");
mysql_query("
ALTER TABLE {$db_prefix}calendar
DROP INDEX idx_year_month");
mysql_query("
ALTER TABLE {$db_prefix}calendar
DROP INDEX year");
mysql_query("
ALTER TABLE {$db_prefix}calendar
ADD eventDate date NOT NULL default '0000-00-00'");
mysql_query("
UPDATE {$db_prefix}calendar
SET eventDate = CONCAT(year, '-', month + 1, '-', day)");
mysql_query("
ALTER TABLE {$db_prefix}calendar
DROP year,
DROP month,
DROP day,
ADD INDEX eventDate (eventDate)");
debug_info('done. ');
}
if ($_GET['p'] <= 3)
{
pastTime('p=3');
debug_info(' Converting "calendar_holidays"... ');
// In the case of this table, it's simpler to just create a new table and insert the data in.
// This is because there isn't much data, but the table is being redone a lot.
mysql_query("
CREATE TABLE {$db_prefix}calendar_holidays (
ID_HOLIDAY smallint(5) unsigned NOT NULL auto_increment,
eventDate date NOT NULL default '0000-00-00',
title varchar(30) NOT NULL default '',
PRIMARY KEY (ID_HOLIDAY),
KEY eventDate (eventDate)
) TYPE=MyISAM") or $db_error = true;
// Don't INSERT it twice!
if (!$db_error)
mysql_query("
INSERT INTO {$db_prefix}calendar_holidays
(eventDate, title)
SELECT IF(year IS NULL, CONCAT('0000-', month, '-', day), CONCAT(year, '-', month, '-', day)), title
FROM {$db_prefix}calendar_holiday");
else
$db_error = false;
$result = idb_query("
SELECT ID_HOLIDAY
FROM {$db_prefix}calendar_holidays
WHERE eventDate = '0000-06-06'
LIMIT 1");
if (mysql_num_rows($result) == 0)
idb_query("
INSERT INTO {$db_prefix}calendar_holidays
(title, eventDate)
VALUES ('D-Day', '0000-06-06')");
mysql_free_result($result);
idb_query("
UPDATE {$db_prefix}calendar_holidays
SET title = 'New Year\'s'
WHERE title = 'New Years'");
debug_info('done. ');
}
$result = mysql_query("
SELECT COUNT(ID_TOPIC)
FROM {$db_prefix}topics
WHERE notifies != ''") or $db_error = true;
if ($_GET['p'] <= 4 && !$db_error)
{
pastTime('p=4');
list ($numNotifies) = mysql_fetch_row($result);
if (!isset($_GET['t']))
$_GET['t'] = 0;
for ($stepnum = (int) $_GET['t']; $stepnum < $numNotifies; $stepnum += $notifyChunkSize)
{
pastTime('p=4;t=' . $stepnum);
debug_info(' log_notify (topics #' . ($stepnum + 1) . ' - #' . min($stepnum + 1 + $notifyChunkSize, $numNotifies) . ')... ');
$result = idb_query("
SELECT ID_TOPIC, notifies
FROM {$db_prefix}topics
WHERE notifies != ''
LIMIT $stepnum, $notifyChunkSize");
$setString = '';
while ($row = mysql_fetch_assoc($result))
{
$row['notifies'] = explode(',', $row['notifies']);
foreach ($row['notifies'] as $notify)
$setString .= '
(' . $notify . ', ' . $row['ID_TOPIC'] . ', 0, 0),';
}
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}log_notify
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
debug_info('done. ');
}
mysql_query("
ALTER TABLE {$db_prefix}topics
DROP notifies");
}
else
$db_error = false;
echo '
Successful.
';
$_GET['p'] = 0;
return doStep8();
}
// Step 8: Polls.
function doStep8()
{
global $db_error, $db_prefix, $sourcedir, $boarddir;
global $pollChunkSize, $modSettings, $language, $boardurl, $member_groups, $timeout, $timeoffset, $MembersPerPage, $Show_RecentBar;
global $userpic_width, $userpic_height, $facesdir, $facesurl, $maxmessagedisplay, $maxdisplay, $Cookie_Length, $RegAgree;
global $emailpassword, $emailnewpass, $emailwelcome, $allow_hide_email, $timeformatstring, $guestaccess, $MaxMessLen, $MaxSigLen, $enable_ubbc;
$_GET['step'] = '8';
if (!isset($_GET['p']))
$_GET['p'] = 0;
else
$_GET['p'] = (int) $_GET['p'];
echo '
Converting polls and settings... ';
debug_info(' ');
mysql_query("
SELECT votedMemberIDs
FROM {$db_prefix}polls
LIMIT 1") or $db_error = true;
if ($_GET['p'] <= 0 && !$db_error)
{
pastTime('p=0');
$query = mysql_query("
SELECT COUNT(ID_POLL)
FROM {$db_prefix}polls");
list ($numPolls) = mysql_fetch_row($query);
if (!isset($_GET['t']))
$_GET['t'] = 0;
for ($stepnum = (int) $_GET['t']; $stepnum < $numPolls; $stepnum += $pollChunkSize)
{
pastTime('p=0;t=' . $stepnum);
debug_info(' poll #' . ($stepnum + 1) . ' - #' . min($stepnum + 1 + $pollChunkSize, $numPolls) . '... ');
$query = idb_query("
SELECT
ID_POLL, votedMemberIDs,
option1, option2, option3, option4, option5, option6, option7, option8,
votes1, votes2, votes3, votes4, votes5, votes6, votes7, votes8
FROM {$db_prefix}polls
LIMIT $stepnum, $pollChunkSize");
if ($db_error) return;
$setStringChoices = '';
$setStringLog = '';
while ($row = mysql_fetch_assoc($query))
{
for ($j = 0; $j < 8; $j++)
if (trim($row['option' . ($j + 1)]) != '')
$setStringChoices .= "
($row[ID_POLL], " . $j . ", '" . addslashes($row['option' . ($j + 1)]) . "', " . ($row['votes' . ($j + 1)] > 0 ? $row['votes' . ($j + 1)] : '0') . "),";
$members = explode(',', $row['votedMemberIDs']);
foreach ($members as $member)
if (is_numeric($member))
$setStringLog .= "
($row[ID_POLL], $member, 0),";
}
if (!empty($setStringChoices))
{
$setStringChoices = substr($setStringChoices, 0, -1);
idb_query("
INSERT IGNORE INTO {$db_prefix}poll_choices
(ID_POLL, ID_CHOICE, label, votes)
VALUES $setStringChoices");
if ($db_error) return;
}
if (!empty($setStringLog))
{
$setStringLog = substr($setStringLog, 0, -1);
idb_query("
INSERT INTO {$db_prefix}log_polls
(ID_POLL, ID_MEMBER, ID_CHOICE)
VALUES $setStringLog");
if ($db_error) return;
}
debug_info('done. ');
}
}
else
$db_error = false;
if ($_GET['p'] <= 1)
{
pastTime('p=1');
debug_info(' Converting "polls"... ');
mysql_query("
ALTER TABLE {$db_prefix}polls
DROP option1, DROP option2, DROP option3, DROP option4, DROP option5, DROP option6, DROP option7, DROP option8,
DROP votes1, DROP votes2, DROP votes3, DROP votes4, DROP votes5, DROP votes6, DROP votes7, DROP votes8,
DROP votedMemberIDs,
DROP PRIMARY KEY,
CHANGE COLUMN ID_POLL ID_POLL mediumint(8) unsigned NOT NULL auto_increment PRIMARY KEY,
CHANGE COLUMN votingLocked votingLocked tinyint(1) NOT NULL default '0',
CHANGE COLUMN question question tinytext NOT NULL default '',
ADD maxVotes tinyint(4) unsigned NOT NULL default '1',
ADD expireTime int(10) unsigned NOT NULL default '0',
ADD hideResults tinyint(4) unsigned NOT NULL default '0'");
// This needs its own alter to cope with upgrades from previous versions.
mysql_query("
ALTER TABLE {$db_prefix}polls
ADD ID_MEMBER mediumint(8) unsigned NOT NULL default '0',
ADD posterName tinytext NOT NULL default ''");
// Yet another column added to the polls table - its own alter again to cope with previous versions.
mysql_query("
ALTER TABLE {$db_prefix}polls
ADD changeVote tinyint(4) unsigned NOT NULL default '0'");
debug_info('done. ');
}
if ($_GET['p'] <= 2)
{
pastTime('p=2');
debug_info(' Converting "polls" (step 2)... ');
while (true)
{
pastTime('p=2');
// Guests cannot start polls.
$result = idb_query("
SELECT t.ID_POLL, t.ID_MEMBER_STARTED, m.posterName
FROM {$db_prefix}topics AS t, {$db_prefix}messages AS m, {$db_prefix}polls AS p
WHERE m.ID_MSG = t.ID_FIRST_MSG
AND p.ID_POLL = t.ID_POLL
AND p.ID_MEMBER = 0
AND t.ID_MEMBER_STARTED != 0
LIMIT $pollChunkSize");
if (mysql_num_rows($result) == 0)
break;
while ($row = mysql_fetch_assoc($result))
idb_query("
UPDATE {$db_prefix}polls
SET ID_MEMBER = $row[ID_MEMBER_STARTED], posterName = '$row[posterName]'
WHERE ID_POLL = $row[ID_POLL]
LIMIT 1");
mysql_free_result($result);
}
debug_info('done. ');
}
if ($_GET['p'] <= 3)
{
pastTime('p=3');
debug_info(' Converting "settings"... ');
convertSettingsToTheme();
if ($db_error) return;
if (!isset($modSettings['smfVersion']))
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES
('news', '" . htmlspecialchars(stripslashes($modSettings['news']), ENT_QUOTES) . "')");
// Setting display_recent_bar is now defunct... replaced with number_recent_posts.
$request = idb_query("
SELECT ID_THEME, value
FROM {$db_prefix}themes
WHERE variable = 'display_recent_bar'", __FILE__, __LINE__);
$setString = '';
while ($row = mysql_fetch_assoc($request))
$setString .= "
($row[ID_THEME], 'number_recent_posts', '" . ($row['value'] == 2 ? 5 : $row['value']) . "'),";
mysql_free_result($request);
if (!empty($setString))
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
(ID_THEME, variable, value)
VALUES" . substr($setString, 0, -1), __FILE__, __LINE__);
// Registration method replaces several previous settings.
if (!empty($modSettings['registration_disabled']))
$regMethod = 3;
elseif (!empty($modSettings['approve_registration']))
$regMethod = 2;
elseif (!empty($emailpassword) || !empty($modSettings['send_validation']))
$regMethod = 1;
else
$regMethod = 0;
mysql_query("
ALTER TABLE {$db_prefix}settings
DROP INDEX variable");
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES
('smfVersion', '" . SMF_VERSION . "')");
idb_query("
UPDATE IGNORE {$db_prefix}settings
SET variable = 'guest_hideContacts'
WHERE variable = 'guest_hideEmail'
LIMIT 1", __FILE__, __LINE__);
idb_query("
INSERT IGNORE INTO {$db_prefix}settings
(variable, value)
VALUES
('news', ''),
('compactTopicPagesContiguous', '5'),
('compactTopicPagesEnable', '1'),
('enableStickyTopics', '1'),
('todayMod', '1'),
('karmaMode', '0'),
('karmaTimeRestrictAdmins', '1'),
('enablePreviousNext', '1'),
('pollMode', '1'),
('enableVBStyleLogin', '1'),
('enableCompressedOutput', '1'),
('karmaWaitTime', '1'),
('karmaMinPosts', '0'),
('karmaLabel', 'Karma:'),
('karmaSmiteLabel', '[smite]'),
('karmaApplaudLabel', '[applaud]'),
('attachmentSizeLimit', '128'),
('attachmentPostLimit', '192'),
('attachmentNumPerPostLimit', '4'),
('attachmentDirSizeLimit', '10240'),
('attachmentUploadDir', '{$boarddir}/attachments'),
('attachmentExtensions', 'txt,doc,pdf,jpg,gif,mpg,png'),
('attachmentCheckExtensions', '1'),
('attachmentShowImages', '1'),
('attachmentEnable', '1'),
('attachmentEncryptFilenames', '1'),
('censorWholeWord', '0'),
('censorIgnoreCase', '1'),
('mostOnline', '1'),
('mostOnlineToday', '1'),
('mostDate', UNIX_TIMESTAMP()),
('notifyAnncmnts_UserDisable', '1'),
('trackStats', '1'),
('hitStats', '0'),
('userLanguage', '1'),
('titlesEnable', '1'),
('topicSummaryPosts', '15'),
('enableReportToMod', '1'),
('enableErrorLogging', '1'),
('maxwidth', '0'),
('maxheight', '0'),
('onlineEnable', '0'),
('topbottomEnable', '0'),
('cal_holidaycolor', '000080'),
('cal_bdaycolor', '920AC4'),
('cal_eventcolor', '078907'),
('cal_enabled', '0'),
('cal_maxyear', '2010'),
('cal_minyear', '2002'),
('cal_daysaslink', '0'),
('cal_defaultboard', ''),
('cal_showeventsonindex', '0'),
('cal_showbdaysonindex', '0'),
('cal_showholidaysonindex', '0'),
('cal_showweeknum', '0'),
('cal_allowspan', '0'),
('cal_maxspan', '7'),
('smtp_host', ''),
('smtp_username', ''),
('smtp_password', ''),
('mail_type', 'sendmail'),
('timeLoadPageEnable', '0'),
('totalTopics', '1'),
('totalMessages', '1'),
('removeNestedQuotes', '0'),
('simpleSearch', '0'),
('localCookies', '0'),
('censor_vulgar', ''),
('censor_proper', ''),
('enablePostHTML', '0'),
('theme_allow', '1'),
('theme_default', '1'),
('theme_guests', '1'),
('enableEmbeddedFlash', '0'),
('xmlnews_enable', '1'),
('xmlnews_maxlen', '255'),
('hotTopicPosts', '15'),
('hotTopicVeryPosts', '25'),
('globalCookies', '0'),
('registration_method', '$regMethod'),
('send_validation_onChange', '$emailnewpass'),
('send_welcomeEmail', '$emailwelcome'),
('allow_editDisplayName', '1'),
('allow_hideOnline', '1'),
('allow_hideEmail', '$allow_hide_email'),
('guest_hideContacts', '0'),
('allow_guestAccess', '$guestaccess'),
('number_format', '1234.00'),
('time_format', '" . (!empty($timeformatstring) ? $timeformatstring : '%B %d, %Y, %I:%M:%S %p') . "'),
('enableBBC', '" . (!isset($enable_ubbc) ? 1 : $enable_ubbc) . "'),
('enableNewReplyWarning', '1'),
('max_messageLength', '" . (empty($MaxMessLen) ? 10000 : $MaxMessLen) . "'),
('max_signatureLength', '$MaxSigLen'),
('attachmentEncryptFilenames', '1'),
('spamWaitTime', '$timeout'),
('autoLinkUrls', '1'),
('avatar_allow_server_stored', '1'),
('avatar_directory', '" . fixRelativePath($facesdir) . "'),
('avatar_url', '$facesurl'),
('avatar_divide_categories', '0'),
('avatar_allow_external_url', '1'),
('avatar_max_height_external', '$userpic_height'),
('avatar_max_width_external', '$userpic_width'),
('avatar_check_size', '0'),
('avatar_action_too_large', 'option_user_resize'),
('avatar_allow_upload', '0'),
('avatar_max_height_upload', '$userpic_height'),
('avatar_max_width_upload', '$userpic_width'),
('avatar_resize_upload', '1'),
('avatar_download_png', '1'),
('failed_login_threshold', '3'),
('enableSpellChecking', '1'),
('edit_wait_time', '90'),
('autoFixDatabase', '1'),
('autoOptDatabase', '7'),
('autoOptMaxOnline', '0'),
('autoOptLastOpt', '0'),
('queryless_urls', '0'),
('defaultMaxMessages', '" . (empty($maxmessagedisplay) ? 15 : $maxmessagedisplay) . "'),
('defaultMaxTopics', '" . (empty($maxdisplay) ? 20 : $maxdisplay) . "'),
('defaultMaxMembers', '" . (empty($MembersPerPage) ? 20 : $MembersPerPage) . "'),
('enableParticipation', '1'),
('recycle_enable', '0'),
('recycle_board', '0'),
('banLastUpdated', '0'),
('enableAllMessages', '0'),
('fixLongWords', '0'),
('knownThemes', '1,2'),
('who_enabled', '1'),
('time_offset', '$timeoffset'),
('cookieTime', '" . (empty($Cookie_Length) ? 60 : $Cookie_Length) . "'),
('lastActive', '15'),
('smileys_dir', '$boarddir/Smileys'),
('smileys_url', '$boardurl/Smileys'),
('smiley_sets_enable', '0'),
('smiley_sets_known', 'default,classic'),
('smiley_sets_names', 'Default\\nClassic'),
('smiley_sets_default', 'default'),
('smiley_enable', '1'),
('censorIgnoreCase', '1'),
('modlog_enabled', '0'),
('cal_days_for_index', '7'),
('requireAgreement', '$RegAgree'),
('unapprovedMembers', '0'),
('default_personalText', ''),
('attachmentPostLimit', '192'),
('attachmentNumPerPostLimit', '4'),
('package_make_backups', '1'),
('databaseSession_loose', '1'),
('databaseSession_lifetime', '2880'),
('smtp_port', '25'),
('search_match_complete_words', '0'),
('disableTemporaryTables', '0'),
('search_cache_size', '50'),
('search_results_per_page', '30'),
('search_weight_frequency', '30'),
('search_weight_age', '25'),
('search_weight_length', '20'),
('search_weight_subject', '15'),
('search_weight_first_message', '10')");
if ($db_error) return;
idb_query("
DELETE FROM {$db_prefix}settings
WHERE variable = 'agreement'
OR variable = 'search_max_cached_results'
LIMIT 1");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 4)
{
pastTime('p=4');
debug_info(' Transferring "settings"... ');
if (convertSettingsToOptions() == false)
return;
debug_info('done. ');
}
if ($_GET['p'] <= 5)
{
pastTime('p=5');
debug_info(' Updating"settings"... ');
// Update the latest member (highest ID_MEMBER) and count.
$result = idb_query("
SELECT COUNT(ID_MEMBER), MAX(ID_MEMBER)
FROM {$db_prefix}members", __FILE__, __LINE__);
if ($db_error) return;
list ($memberCount, $latestmember) = mysql_fetch_row($result);
mysql_free_result($result);
// Get the latest member's display name.
$result = idb_query("
SELECT IFNULL(realName, memberName) AS realName
FROM {$db_prefix}members
WHERE ID_MEMBER = " . (int) $latestmember . "
LIMIT 1", __FILE__, __LINE__);
if ($db_error) return;
list ($latestRealName) = mysql_fetch_row($result);
mysql_free_result($result);
// Update the amount of members awaiting approval.
$result = idb_query("
SELECT COUNT(ID_MEMBER)
FROM {$db_prefix}members
WHERE is_activated = 0
AND validation_code = ''", __FILE__, __LINE__);
if ($db_error) return;
list ($unapprovedCount) = mysql_fetch_row($result);
mysql_free_result($result);
// Get the number of messages...
$result = idb_query("
SELECT COUNT(ID_MSG) AS totalMessages, MAX(ID_MSG) AS maxMsgID
FROM {$db_prefix}messages", __FILE__, __LINE__);
if ($db_error) return;
$row = mysql_fetch_assoc($result);
mysql_free_result($result);
// Get the number of topics.
$result = idb_query("
SELECT COUNT(ID_TOPIC) AS totalTopics
FROM {$db_prefix}topics", __FILE__, __LINE__);
if ($db_error) return;
$row += mysql_fetch_assoc($result);
mysql_free_result($result);
$changeArray = array(
'latestMember' => $latestmember,
'latestRealName' => $latestRealName,
'memberCount' => $memberCount,
'unapprovedMembers' => $unapprovedCount,
'totalMessages' => $row['totalMessages'],
'maxMsgID' => $row['maxMsgID'],
'totalTopics' => $row['totalTopics'],
'cal_today_updated' => '00000000'
);
$replaceArray = array();
foreach ($changeArray as $variable => $value)
$replaceArray[] = "('$variable', '$value')";
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES " . implode(',
', $replaceArray), __FILE__, __LINE__);
if ($db_error) return;
debug_info('done. ');
}
echo '
Successful.
';
// Almost done... convert the template.php or template.html file?
if ($_GET['p'] <= 6 && isset($_GET['conv']) && !file_exists($boarddir . '/Themes/converted'))
{
pastTime('p=6');
debug_info(' Converting the template... ');
require_once($sourcedir . '/Themes.php');
mkdir($boarddir . '/Themes/converted', 0777);
convert_template($boarddir . '/Themes/converted');
// Copy over the default non-theme files.
$to_copy = array('/index.php', '/BoardIndex.template.php', '/Display.template.php', '/MessageIndex.template.php', '/Recent.template.php', '/Search.template.php', '/Post.template.php');
foreach ($to_copy as $file)
{
copy($boarddir . '/Themes/classic' . $file, $boarddir . '/Themes/converted' . $file);
@chmod($boarddir . '/Themes/converted' . $file, 0777);
}
// Now set up the "converted" theme.
$values = array(
'name' => 'Converted Theme from YaBB SE',
'theme_url' => $boardurl . '/Themes/classic',
'images_url' => $boardurl . '/Themes/classic/images',
'theme_dir' => strtr($boarddir, array('\\' => '/')) . '/Themes/converted'
);
// Get an available ID_THEME first...
$request = idb_query("
SELECT MAX(ID_THEME) + 1
FROM {$db_prefix}themes");
list ($ID_THEME) = mysql_fetch_row($request);
mysql_free_result($request);
$setString = '';
foreach ($values as $variable => $value)
$setString .= "
(0, " . $ID_THEME . ", '" . $variable . "', '" . $value . "'),";
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
VALUES " . substr($setString, 0, -1));
if ($db_error) return;
}
idb_query("
UPDATE {$db_prefix}settings
SET value = CONCAT(value, ',$ID_THEME')
WHERE variable = 'knownThemes'
LIMIT 1");
if ($db_error) return;
idb_query("
REPLACE INTO {$db_prefix}settings
(variable, value)
VALUES ('theme_guests', $ID_THEME),
('smiley_sets_default', 'classic')");
if ($db_error) return;
debug_info('done. ');
}
if ($_GET['p'] <= 7)
{
pastTime('p=7');
if (!empty($_GET['maint']))
echo '
Taking the forum out of maintenance mode... ';
$change = array(
'language' => '\'' . (substr($language, -4) == '.lng' ? substr($language, 0, -4) : $language) . '\'',
'db_last_error' => '0',
'db_error_send' => '1'
);
if (!empty($_GET['maint']))
$change['maintenance'] = '0';
changeSettings($change);
if (!empty($_GET['maint']))
echo '
Successful. ';
}
echo '
Upgrade Complete
That wasn\'t so hard, was it? Now you are ready to use your installation of SMF. Hope you like it!
';
if (is_writable(__FILE__))
echo '
(doesn\'t work on all servers.) ';
echo '
If you had any problems with this upgrade, or have any problems using SMF, please don\'t hesitate to look to us for assistance.
Best of luck,
Simple Machines';
return true;
}
function convertSettingsToTheme()
{
global $db_prefix, $db_error, $modSettings, $color, $MenuType, $temp_MenuType, $showyabbcbutt;
if (!isset($GLOBALS['curposlinks']))
$GLOBALS['curposlinks'] = 1;
$temp_MenuType = empty($MenuType) ? 1 : 0;
$values = array(
'show_latest_member' => 'showlatestmember',
'show_bbc' => isset($showyabbcbutt) ? 'showyabbcbutt' : 'showbbcbutt',
'show_modify' => 'showmodify',
'show_user_images' => 'showuserpic',
'show_blurb' => 'showusertext',
'show_gender' => 'showgenderimage',
'show_newsfader' => 'shownewsfader',
'display_recent_bar' => 'Show_RecentBar',
'show_member_bar' => 'Show_MemberBar',
'linktree_link' => 'curposlinks',
'show_profile_buttons' => 'profilebutton',
'show_mark_read' => 'showmarkread',
'show_board_desc' => 'ShowBDescrip',
'newsfader_time' => 'fadertime',
'use_image_buttons' => 'temp_MenuType',
'enable_news' => 'enable_news',
'show_sp1_info' => array('modSettings', 'enableSP1Info'),
'linktree_inline' => array('modSettings', 'enableInlineLinks'),
'return_to_post' => array('modSettings', 'returnToPost'),
);
$setString = '';
foreach ($values as $variable => $value)
{
if (is_array($value))
{
$var_name = &$value[0];
global ${$var_name};
if (isset(${$var_name}[$value[1]]))
$setString .= '
(0, 1, \'' . $variable . '\', \'' . ${$var_name}[$value[1]] . '\'),';
}
else
{
global $$value;
if (!isset($$value))
$$value = 1;
$setString .= '
(0, 1, \'' . $variable . '\', \'' . $$value . '\'),';
}
}
if (!empty($setString))
{
$setString = substr($setString, 0, -1);
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
VALUES $setString");
if ($db_error) return;
}
unset($setString);
}
function convertSettingstoOptions()
{
global $db_prefix, $db_error, $modSettings;
// Format: new_setting -> old_setting_name.
$values = array(
'calendar_start_day' => 'cal_startmonday',
'view_newest_first' => 'viewNewestFirst',
'view_newest_pm_first' => 'viewNewestFirst',
);
$setString = '';
// Do a row for guests and defaults on register...
foreach ($values as $variable => $value)
{
if (isset($modSettings[$value[0]]) && !empty($modSettings[$value[0]]))
$setString .= '
(-1, 1, \'' . $variable . '\', \'' . $modSettings[$value[0]] . '\'),';
else
unset($values[$variable]);
}
// Do the actual (monster) insert.
if (!empty($setString))
{
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
(ID_MEMBER, ID_THEME, variable, value)
VALUES" . substr($setString, 0, -1));
if ($db_error)
return false;
}
// Redo it now for the members.
$setString = array();
foreach ($values as $variable => $value)
{
idb_query("
INSERT IGNORE INTO {$db_prefix}themes
(ID_MEMBER, ID_THEME, variable, value)
SELECT ID_MEMBER, 1 AS ID_THEME, '$variable' AS variable, '" . $modSettings[$value[0]] . "' AS value
FROM {$db_prefix}members");
if ($db_error)
return false;
}
return true;
}
function idb_query($string)
{
global $db_error, $db_connection;
$result = mysql_query($string);
if (!$result)
{
echo '
Unsuccessful!
This query: