function last_submission_to($entity) { if (!$entity->submitable()) { return false; } if ($entity->attribute_bool('keep best')) { static $query; DB::prepare_query($query, "SELECT * FROM `user_submission` LEFT JOIN `submission` ON `user_submission`.`submissionid` = `submission`.`submissionid`" . " WHERE `userid`=? AND `entity_path`=?" . " ORDER BY `status` DESC, `time` DESC" . " LIMIT 1"); $query->execute(array($this->userid, $entity->path())); return Submission::fetch_one($query, '', false); } else { static $query; DB::prepare_query($query, "SELECT * FROM `user_submission` LEFT JOIN `submission` ON `user_submission`.`submissionid` = `submission`.`submissionid`" . " WHERE `userid`=? AND `entity_path`=?" . " ORDER BY `time` DESC" . " LIMIT 1"); $query->execute(array($this->userid, $entity->path())); return Submission::fetch_one($query, '', false); } }
static function get_pending_submission($host) { static $query_check, $query_take, $query_fetch; DB::prepare_query($query_check, "SELECT COUNT(*) FROM `submission`" . " WHERE `status` = " . Status::PENDING . " AND `judge_start` < :old_start"); DB::prepare_query($query_take, "UPDATE `submission` SET `judge_start` = :new_start, `judge_host` = :host" . " WHERE `status` = " . Status::PENDING . " AND `judge_start` < :old_start" . " LIMIT 1"); DB::prepare_query($query_fetch, "SELECT * FROM `submission`" . " WHERE `status` = " . Status::PENDING . " AND `judge_start` = :new_start AND `judge_host` = :host"); // are there pending submissions? // this step is to make things faster $params = array(); $params['old_start'] = time() - REJUDGE_TIMEOUT; $query_check->execute($params); $num = $query_check->fetchColumn(); DB::check_errors($query_check); $query_check->closeCursor(); if ($num == 0) { return false; } // if so, take one $params['new_start'] = time(); $params['host'] = $host; $query_take->execute($params); $num = $query_take->rowCount(); DB::check_errors($query_take); $query_take->closeCursor(); if ($num == 0) { echo "Submission stolen from under our nose\n"; return false; } // and return it unset($params['old_start']); $query_fetch->execute($params); DB::check_errors($query_fetch); return Submission::fetch_one($query_fetch); }