public static function parseKills() { if (Util::isMaintenanceMode()) { return; } $timer = new Timer(); $maxTime = 65 * 1000; Db::execute("set session wait_timeout = 120000"); Db::execute("create temporary table if not exists zz_participants_temporary select * from zz_participants where 1 = 0"); $numKills = 0; while ($timer->stop() < $maxTime) { if (Util::isMaintenanceMode()) { self::removeTempTables(); return; } Db::execute("delete from zz_participants_temporary"); //Log::log("Fetching kills for processing..."); $result = Db::query("select * from zz_killmails where processed = 0 order by killID desc limit 100", array(), 0); if (sizeof($result) == 0) { $currentSecond = (int) date("s"); $sleepTime = max(1, 15 - $currentSecond % 15); sleep($sleepTime); continue; } //Log::log("Processing fetched kills..."); $processedKills = array(); $cleanupKills = array(); foreach ($result as $row) { $numKills++; $kill = json_decode($row['kill_json'], true); if (!isset($kill["killID"])) { Log::log("Problem with kill " . $row["killID"]); Db::execute("update zz_killmails set processed = 2 where killid = :killid", array(":killid" => $row["killID"])); continue; } $killID = $kill["killID"]; Db::execute("insert ignore into zz_killid values(:killID, 0)", array(":killID" => $killID)); // Cleanup if we're reparsing $cleanupKills[] = $killID; // Do some validation on the kill if (!self::validKill($kill)) { Db::execute("update zz_killmails set processed = 3 where killid = :killid", array(":killid" => $row["killID"])); continue; } $totalCost = 0; $itemInsertOrder = 0; $totalCost += self::processItems($kill, $killID, $kill["items"], $itemInsertOrder); $totalCost += self::processVictim($kill, $killID, $kill["victim"], false); foreach ($kill["attackers"] as $attacker) { self::processAttacker($kill, $killID, $attacker, $kill["victim"]["shipTypeID"], $totalCost); } $points = Points::calculatePoints($killID, true); Db::execute("update zz_participants_temporary set points = :points, number_involved = :numI, total_price = :tp where killID = :killID", array(":killID" => $killID, ":points" => $points, ":numI" => sizeof($kill["attackers"]), ":tp" => $totalCost)); $processedKills[] = $killID; } if (sizeof($cleanupKills)) { Db::execute("delete from zz_participants where killID in (" . implode(",", $cleanupKills) . ")"); } Db::execute("insert into zz_participants select * from zz_participants_temporary"); if (sizeof($processedKills)) { Db::execute("update zz_killmails set processed = 1 where killID in (" . implode(",", $processedKills) . ")"); } foreach ($processedKills as $killID) { Stats::calcStats($killID, true); // Add points and total value to the json stored in the database $raw = Db::queryField("select kill_json from zz_killmails where killID = :killID", "kill_json", array(":killID" => $killID), 0); $json = json_decode($raw, true); unset($json["_stringValue"]); unset($json["zkb"]); $stuff = Db::queryRow("select * from zz_participants where killID = :killID and isVictim = 1", array(":killID" => $killID), 0); if ($stuff != null) { $zkb = array(); $zkb["totalValue"] = $stuff["total_price"]; $zkb["points"] = $stuff["points"]; $json["zkb"] = $zkb; } $raw = json_encode($json); Db::execute("update zz_killmails set kill_json = :raw where killID = :killID", array(":killID" => $killID, ":raw" => $raw)); } } if ($numKills > 0) { Log::log("Processed {$numKills} kills"); } self::removeTempTables(); }