function upgrade_100() { echo "<div class=\"update_version\">" . L("UpdateFrom") . " 1.0.0 " . L("UpdateTo") . " 1.1.0"; $SessionTableCreate = "CREATE TABLE `" . RP_TABLE_PREFIX . "Session` (\n `SessionId` int(10) unsigned NOT NULL AUTO_INCREMENT,\n `UserId` int(10) NOT NULL,\n `SessionName` char(40) NOT NULL,\n `IpAddress` char(40) NOT NULL,\n `Expires` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n `Data` text NOT NULL,\n PRIMARY KEY (`SessionId`),\n UNIQUE KEY `SessionName` (`SessionName`),\n KEY `UserId` (`UserId`)\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"; $Updates = array("Multi class support" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` CHANGE `Class` `Class` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;", "Class attendance" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Attendance` ADD `Class` CHAR(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `Role`;", "User settings fix" => "ALTER TABLE `" . RP_TABLE_PREFIX . "UserSetting` DROP INDEX `Unique_Name`;", "Game bound locations" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Location` ADD `Game` CHAR(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `LocationId`;", "Game bound characters" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` ADD `Game` CHAR(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `UserId`;", "Raid column storage" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Raid` ADD `SlotRoles` VARCHAR(24) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `Description`;" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Raid` ADD `SlotCount` VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `SlotRoles`;", "Roles by identifier" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Attendance` CHANGE `Role` `Role` CHAR(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` CHANGE `Role1` `Role1` CHAR(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` CHANGE `Role2` `Role2` CHAR(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;", "Performance" => "ALTER TABLE `" . RP_TABLE_PREFIX . "Raid` ADD INDEX (`Start`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Location` ADD INDEX (`Game`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` ADD INDEX (`Game`);", "ALTER TABLE `" . RP_TABLE_PREFIX . "Character` ADD INDEX GameUserId (`Game`,`UserId`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Attendance` ADD INDEX (`Status`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Attendance` ADD INDEX UserIdStatus (`UserId`,`Status`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Attendance` ADD INDEX UserIdCharacterId (`UserId`,`CharacterId`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Setting` DROP INDEX Name;" . "ALTER TABLE `" . RP_TABLE_PREFIX . "Setting` ADD INDEX (`Name`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "UserSetting` DROP INDEX Name;" . "ALTER TABLE `" . RP_TABLE_PREFIX . "UserSetting` ADD INDEX (`Name`);" . "ALTER TABLE `" . RP_TABLE_PREFIX . "UserSetting` ADD INDEX UserIdName (`UserId`,`Name`);", "New session handling" => "ALTER TABLE `" . RP_TABLE_PREFIX . "User` DROP SessionKey;" . "CREATE TABLE `" . RP_TABLE_PREFIX . "Session` (\n `SessionId` int(10) unsigned NOT NULL AUTO_INCREMENT,\n `UserId` int(10) NOT NULL,\n `SessionName` char(40) NOT NULL,\n `IpAddress` char(40) NOT NULL,\n `Expires` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n `Data` text NOT NULL,\n PRIMARY KEY (`SessionId`),\n UNIQUE KEY `SessionName` (`SessionName`),\n KEY `UserId` (`UserId`)\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"); // Timezone fix $Connector = Connector::getInstance(); $ConnectorNonUTC = new Connector(SQL_HOST, RP_DATABASE, RP_USER, RP_PASS, false, false); $RaidDateQuery = $ConnectorNonUTC->prepare("SELECT UNIX_TIMESTAMP(Start) AS Timestamp FROM `" . RP_TABLE_PREFIX . "Raid` LIMIT 1"); $RaidDateQuery->setErrorsAsHTML(true); $RaidNonUTC = $RaidDateQuery->fetchFirst(); if ($RaidNonUTC != null) { $RaidDateQuery = $Connector->prepare("SELECT UNIX_TIMESTAMP(Start) AS Timestamp FROM `" . RP_TABLE_PREFIX . "Raid` LIMIT 1"); $RaidDateQuery->setErrorsAsHTML(true); $Raid = $RaidDateQuery->fetchFirst(); if ($Raid != null) { $Offset = $Raid["Timestamp"] - $RaidNonUTC["Timestamp"]; $OffsetString = $Offset >= 0 ? "+" . $Offset : $Offset; $Updates["Timezone fix (" . $OffsetString . ")"] = "UPDATE `" . RP_TABLE_PREFIX . "Raid` SET Start = FROM_UNIXTIME(UNIX_TIMESTAMP(Start)" . $OffsetString . "), End = FROM_UNIXTIME(UNIX_TIMESTAMP(End)" . $OffsetString . ");"; } } doUpgrade($Updates); // Default convert values $Game = "wow"; $GameFile = "wow"; $RoleIdxToId = array("tnk", "med", "dmg"); $ClassNameToId = array("deathknight" => "dkt", "druid" => "dru", "hunter" => "hun", "mage" => "mag", "monk" => "mon", "paladin" => "pal", "priest" => "pri", "rogue" => "rog", "shaman" => "sha", "warlock" => "wlk", "warrior" => "war"); // Gameconfig update echo "<div class=\"update_step\">Gameconfig update"; $GameConfig = dirname(__FILE__) . "/../../lib/private/gameconfig.php"; if (file_exists($GameConfig)) { if (UpdateGameConfig110($GameConfig, $ClassNameToId, $RoleIdxToId, $Game)) { echo "<div class=\"update_step_ok\">OK</div>"; $GameFile = "legacy"; } else { echo "<div class=\"database_error\">" . L("FailedGameconfig") . "</div>"; } } else { echo "<div class=\"update_step_warning\">" . L("GameconfigNotFound") . " (lib/private/gameconfig.php).</div>"; } echo "</div>"; // Insert game setting echo "<div class=\"update_step\">Game setting"; $GameSettingQuery = $Connector->prepare("INSERT INTO `" . RP_TABLE_PREFIX . "Setting` (Name,TextValue) VALUES ('GameConfig', :Game)"); $GameSettingQuery->setErrorsAsHTML(true); $GameSettingQuery->bindValue(":Game", $GameFile, PDO::PARAM_STR); if ($GameSettingQuery->execute()) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Set location game, character game echo "<div class=\"update_step\">Game binding"; $SetGameQuery = $Connector->prepare("UPDATE `" . RP_TABLE_PREFIX . "Location` SET Game = :Game; UPDATE `" . RP_TABLE_PREFIX . "Character` SET Game = :Game;"); $SetGameQuery->setErrorsAsHTML(true); $SetGameQuery->bindValue(":Game", $Game, PDO::PARAM_STR); if ($SetGameQuery->execute()) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Convert roles echo "<div class=\"update_step\">New Role ids"; $RoleQueryString = ""; for ($i = 0; $i < count($RoleIdxToId); ++$i) { $RoleQueryString .= "UPDATE `" . RP_TABLE_PREFIX . "Character` SET Role1 = :Role" . $i . " WHERE Role1 = " . $i . ";"; $RoleQueryString .= "UPDATE `" . RP_TABLE_PREFIX . "Character` SET Role2 = :Role" . $i . " WHERE Role2 = " . $i . ";"; $RoleQueryString .= "UPDATE `" . RP_TABLE_PREFIX . "Attendance` SET Role = :Role" . $i . " WHERE Role = " . $i . ";"; } $RolesQuery = $Connector->prepare($RoleQueryString); $RolesQuery->setErrorsAsHTML(true); for ($i = 0; $i < count($RoleIdxToId); ++$i) { $RolesQuery->bindValue(":Role" . $i, $RoleIdxToId[$i], PDO::PARAM_STR); } if ($RolesQuery->execute()) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Convert classes echo "<div class=\"update_step\">New class ids"; $ClassQueryString = ""; foreach ($ClassNameToId as $Name => $ClassId) { $ClassQueryString .= "UPDATE `" . RP_TABLE_PREFIX . "Character` SET Class = '" . $ClassId . "' WHERE Class = '" . $Name . "';"; } $ClassQuery = $Connector->prepare($ClassQueryString); $ClassQuery->setErrorsAsHTML(true); if ($ClassQuery->execute()) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Convert raid slot data echo "<div class=\"update_step\">Convert old slot data"; $AllRaidsQuery = $Connector->prepare("SELECT RaidId, SlotsRole1, SlotsRole2, SlotsRole3, SlotsRole4, SlotsRole5 FROM `" . RP_TABLE_PREFIX . "Raid`"); $AllRaidsQuery->setErrorsAsHTML(true); $SlotRoles = implode(":", $RoleIdxToId); $NumErrors = 0; $AllRaidsQuery->loop(function ($aRaid) use(&$Connector, $RoleIdxToId, $SlotRoles, &$NumErrors) { $UpdateRaidQuery = $Connector->prepare("UPDATE `" . RP_TABLE_PREFIX . "Raid` SET SlotRoles = :Roles, SlotCount = :Count WHERE RaidId = :RaidId LIMIT 1"); $SlotCount = array(); for ($i = 0; $i < count($RoleIdxToId) && $i < 5; ++$i) { array_push($SlotCount, intval($aRaid["SlotsRole" . ($i + 1)])); } $UpdateRaidQuery->setErrorsAsHTML(true); $UpdateRaidQuery->bindValue(":Roles", $SlotRoles, PDO::PARAM_STR); $UpdateRaidQuery->bindValue(":Count", implode(":", $SlotCount), PDO::PARAM_STR); $UpdateRaidQuery->bindValue(":RaidId", $aRaid["RaidId"], PDO::PARAM_INT); if (!$UpdateRaidQuery->execute()) { ++$NumErrors; } }); if ($NumErrors == 0) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Drop old slots echo "<div class=\"update_step\">Drop old slot data"; $DropOldSlotsQuery = $Connector->prepare("ALTER TABLE `" . RP_TABLE_PREFIX . "Raid` DROP `SlotsRole1`, DROP `SlotsRole2`, DROP `SlotsRole3`, DROP `SlotsRole4`, DROP `SlotsRole5`;"); $DropOldSlotsQuery->setErrorsAsHTML(true); if ($DropOldSlotsQuery->execute()) { echo "<div class=\"update_step_ok\">OK</div>"; } echo "</div>"; // Finish echo "</div>"; }
if (isset($_REQUEST["db"])) { echo "<div class=\"update_step\">" . L("RepairDatabase"); ValidateTableLayout(); InstallDefaultSettings(RP_TABLE_PREFIX); echo "<div class=\"update_step_ok\">OK</div>"; echo "</div>"; } // Convert gameconfig.php if (isset($_REQUEST["conf"])) { echo "<div class=\"update_step\">" . L("TransferGameconfig"); $ClassNameToId = array(); $RoleIdxToId = array(); $Game = ""; $GameConfig = dirname(__FILE__) . "/../lib/private/gameconfig.php"; if (file_exists($GameConfig)) { if (UpdateGameConfig110($GameConfig, $ClassNameToId, $RoleIdxToId, $Game)) { echo "<div class=\"update_step_ok\">OK</div>"; } else { echo "<div class=\"database_error\">" . L("FailedGameconfig") . "</div>"; } } else { echo "<div class=\"update_step_warning\">" . L("GameconfigNotFound") . " (lib/private/gameconfig.php).</div>"; } echo "</div>"; } // Merge two games if (isset($_REQUEST["merge"])) { echo "<div class=\"update_step\">" . L("MergeGames"); if (MergeGames($_REQUEST["source"], $_REQUEST["target"])) { echo "<div class=\"update_step_ok\">OK</div>"; }