Пример #1
0
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>";
}
Пример #2
0
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>";
    }