public static function apiDownload(Request $r) { self::authenticateRequest($r); self::validateStats($r); // Get our runs $relevant_columns = array('run_id', 'guid', 'language', 'status', 'verdict', 'runtime', 'penalty', 'memory', 'score', 'contest_score', 'time', 'submit_delay', 'Users.username', 'Problems.alias'); try { $runs = RunsDAO::search(new Runs(array('contest_id' => $r['contest']->getContestId())), 'time', 'DESC', $relevant_columns); } catch (Exception $e) { // Operation failed in the data layer throw new InvalidDatabaseOperationException($e); } $zip = new ZipStream($r['contest_alias'] . '.zip'); // Add runs to zip $table = "guid,user,problem,verdict,points\n"; foreach ($runs as $run) { $zip->add_file_from_path('runs/' . $run->getGuid(), RunController::getSubmissionPath($run)); $columns[0] = 'username'; $columns[1] = 'alias'; $usernameProblemData = $run->asFilteredArray($columns); $table .= $run->getGuid() . ',' . $usernameProblemData['username'] . ',' . $usernameProblemData['alias'] . ',' . $run->getVerdict() . ',' . $run->getContestScore(); $table .= "\n"; } $zip->add_file('summary.csv', $table); // Add problem cases to zip $contest_problems = ContestProblemsDAO::GetRelevantProblems($r['contest']->getContestId()); foreach ($contest_problems as $problem) { $zip->add_file_from_path($problem->getAlias() . '_cases.zip', PROBLEMS_PATH . '/' . $problem->getAlias() . '/cases.zip'); } // Return zip $zip->finish(); die; }
public static function apiDownload(Request $r) { self::authenticateRequest($r); self::validateStats($r); // Get our runs $relevant_columns = array("run_id", "guid", "language", "status", "verdict", "runtime", "penalty", "memory", "score", "contest_score", "time", "submit_delay", "Users.username", "Problems.alias"); try { $runs = RunsDAO::search(new Runs(array("contest_id" => $r["contest"]->getContestId())), "time", "DESC", $relevant_columns); } catch (Exception $e) { // Operation failed in the data layer throw new InvalidDatabaseOperationException($e); } $zip = new ZipStream($r["contest_alias"] . '.zip'); // Add runs to zip $table = "guid,user,problem,verdict,points\n"; foreach ($runs as $run) { $zip->add_file_from_path("runs/" . $run->getGuid(), RunController::getSubmissionPath($run)); $columns[0] = 'username'; $columns[1] = 'alias'; $usernameProblemData = $run->asFilteredArray($columns); $table .= $run->getGuid() . "," . $usernameProblemData['username'] . "," . $usernameProblemData['alias'] . "," . $run->getVerdict() . "," . $run->getContestScore(); $table .= "\n"; } $zip->add_file("summary.csv", $table); // Add problem cases to zip $contest_problems = ContestProblemsDAO::GetRelevantProblems($r["contest"]->getContestId()); foreach ($contest_problems as $problem) { $zip->add_file_from_path($problem->getAlias() . "_cases.zip", PROBLEMS_PATH . "/" . $problem->getAlias() . "/cases.zip"); } // Return zip $zip->finish(); die; }
/** * Entry point for Problem runs API * * @param Request $r * @throws InvalidFilesystemOperationException * @throws InvalidDatabaseOperationException */ public static function apiRuns(Request $r) { // Get user self::authenticateRequest($r); // Validate request self::validateRuns($r); $response = array(); if ($r['show_all']) { if (!Authorization::CanEditProblem($r['current_user_id'], $r['problem'])) { throw new ForbiddenAccessException(); } if (!is_null($r['username'])) { try { $r['user'] = UsersDAO::FindByUsername($r['username']); } catch (Exception $e) { throw new NotFoundException('userNotFound'); } } try { $runs = RunsDAO::GetAllRuns(null, $r['status'], $r['verdict'], $r['problem']->problem_id, $r['language'], !is_null($r['user']) ? $r['user']->user_id : null, $r['offset'], $r['rowcount']); $result = array(); foreach ($runs as $run) { $run['time'] = (int) $run['time']; $run['score'] = round((double) $run['score'], 4); if ($run['contest_score'] != null) { $run['contest_score'] = round((double) $run['contest_score'], 2); } array_push($result, $run); } $response['runs'] = $result; } catch (Exception $e) { // Operation failed in the data layer throw new InvalidDatabaseOperationException($e); } } else { $keyrun = new Runs(array('user_id' => $r['current_user_id'], 'problem_id' => $r['problem']->getProblemId())); // Get all the available runs try { $runs_array = RunsDAO::search($keyrun); // Create array of relevant columns for list of runs $relevant_columns = array('guid', 'language', 'status', 'verdict', 'runtime', 'penalty', 'memory', 'score', 'contest_score', 'time', 'submit_delay'); // Add each filtered run to an array $response['runs'] = array(); if (count($runs_array) >= 0) { $runs_filtered_array = array(); foreach ($runs_array as $run) { $filtered = $run->asFilteredArray($relevant_columns); $filtered['time'] = strtotime($filtered['time']); $filtered['username'] = $r['current_user']->username; $filtered['alias'] = $r['problem']->alias; array_push($response['runs'], $filtered); } } } catch (Exception $e) { // Operation failed in the data layer throw new InvalidDatabaseOperationException($e); } } $response['status'] = 'ok'; return $response; }