public function ajaxAddProblemAction()
 {
     $contestId = (int) Request::getPOST('contest-id');
     $remote = (int) Request::getPOST('remote');
     $problemCode = Request::getPOST('problem-code');
     if (!array_key_exists($remote, StatusVars::$REMOTE_SCHOOL) || empty($problemCode) || empty($contestId)) {
         $this->renderError('缺少参数!');
     }
     // 默认题库
     Cookie::set('default_remote', $remote);
     $contestInfo = OjContestInterface::getDetail(array('id' => $contestId));
     if (empty($contestInfo)) {
         $this->renderError('竞赛不存在!');
     }
     $problemInfo = OjProblemInterface::getDetail(array('remote' => $remote, 'problem_code' => $problemCode));
     if (empty($problemInfo)) {
         $this->renderError('题目不存在!');
     }
     // 只能添加公开的题目,或者自建私有的题目
     if ($problemInfo['hidden'] && $problemInfo['user_id'] != $this->loginUserInfo['id']) {
         $this->renderError('权限不足,无法添加该题目!');
     }
     $globalIds = $contestInfo['global_ids'];
     if (in_array($problemInfo['id'], $globalIds)) {
         $this->renderError('题目已经添加!');
     }
     // 题目上限
     if (count($globalIds) >= ContestVars::CONTEST_PROBLEM_LIMIT) {
         $this->renderError('题目数量达到上限,无法继续添加!');
     }
     // 更新数据
     OjContestInterface::addProblem(array('id' => $contestId, 'remote' => $remote, 'problem_code' => $problemCode));
     $this->setNotice(FrameworkVars::NOTICE_SUCCESS, '添加成功!');
     $this->renderAjax(0);
 }
 public function __construct()
 {
     parent::__construct();
     // 校验登陆
     if (empty($this->loginUserInfo)) {
         $this->login();
     }
     // 获取$contestId
     $contestId = (int) Request::getREQUEST('contest-id', 0);
     if (empty($contestId)) {
         $this->render404('比赛ID不存在!');
     }
     // 获取$contestInfo
     $this->contestInfo = OjContestInterface::getDetail(array('id' => $contestId));
     if (empty($this->contestInfo) || $this->contestInfo['hidden']) {
         $this->render404('比赛不存在!');
     }
     if ($this->contestInfo['type'] == ContestVars::TYPE_APPLY) {
         $this->applyInfo = OjContestApplyInterface::getDetail(array('contest_id' => $contestId, 'user_id' => $this->loginUserInfo['id']));
     }
     // 管理员
     $isOjAdmin = RootCommonInterface::allowed(array('user_id' => $this->loginUserInfo['id'], 'path' => '/hqoj/admin'));
     if ($isOjAdmin || $this->contestInfo['user_id'] == $this->loginUserInfo['id']) {
         $this->isContestAdmin = true;
     }
     // 如果未注册,未输入密码,比赛未开始,那么跳转到比赛首页
     if (Router::$CONTROLLER != 'index') {
         if ($this->contestInfo['type'] == ContestVars::TYPE_APPLY) {
             if (empty($this->applyInfo) || $this->applyInfo['status'] != ContestVars::APPLY_ACCEPTED) {
                 $this->setNotice('error', '您未通过报名!');
                 $url = '/?contest-id=' . $contestId;
                 Url::redirect($url);
             }
         } else {
             if ($this->contestInfo['type'] == ContestVars::TYPE_PASSWORD) {
                 if ($this->password != $this->contestInfo['password']) {
                     $this->setNotice('error', '请输入密码!');
                     $url = '/?contest-id=' . $contestId;
                     Url::redirect($url);
                 }
             }
         }
         if (time() < $this->contestInfo['begin_time']) {
             $this->setNotice('error', '比赛未开始!');
             $url = '/?contest-id=' . $contestId;
             Url::redirect($url);
         }
     }
     $this->view->assign(array('contestInfo' => $this->contestInfo, 'applyInfo' => $this->applyInfo, 'password' => $this->password, 'isContestAdmin' => $this->isContestAdmin));
 }
 public static function save($data, $id = 0, $trans = null)
 {
     if (0 == $id) {
         $globalId = $data['global_id'];
         $language = $data['language'];
         $userId = $data['user_id'];
         $source = $data['source'];
         $contestId = Arr::get('contest_id', $data, 0);
         // 设置默认语言
         Cookie::set('default_language', $language, time() + 365 * 86400);
         $problemInfo = OjProblemInterface::getById(array('id' => $globalId));
         if (empty($problemInfo)) {
             throw new InterfaceException('题目不存在!');
         }
         if (!array_key_exists($data['language'], StatusVars::$LANGUAGE_SUPPORT[$problemInfo['remote']])) {
             throw new InterfaceException('编译器不支持!');
         }
         // 连续提交判断
         if (self::submitAlready($userId)) {
             throw new InterfaceException('提交频繁!');
         }
         // 非法字符判断
         if ($problemInfo['remote'] == StatusVars::REMOTE_HDU) {
             if (false === iconv('UTF-8', 'GBK', $source)) {
                 throw new InterfaceException('代码中存在非法字符!');
             }
         }
         // 开始事务
         $innerTrans = $trans;
         if (null == $trans) {
             $innerTrans = new Trans(DbConfig::$SERVER_TRANS);
             $innerTrans->begin();
         }
         $solutionModel = new OjSolutionModel($innerTrans);
         $submitTime = time();
         $data = array('problem_global_id' => $globalId, 'remote' => $problemInfo['remote'], 'problem_id' => $problemInfo['problem_id'], 'problem_code' => $problemInfo['problem_code'], 'user_id' => $userId, 'submit_time' => $submitTime, 'submit_ip' => Http::getClientIp(), 'language' => $language, 'result' => StatusVars::QUEUE, 'code_length' => strlen($source), 'remote_uid' => -1);
         $userInfo = UserCommonInterface::getById(array('id' => $userId));
         if (0 == $contestId) {
             $solutionId = $solutionModel->insert($data);
             UserCommonInterface::save(array('trans' => $innerTrans, 'id' => $userId, 'submit_all' => $userInfo['submit_all'] + 1));
             OjProblemInterface::save(array('trans' => $innerTrans, 'id' => $problemInfo['id'], 'submit' => $problemInfo['submit']));
         } else {
             $contestInfo = OjContestInterface::getDetail(array('id' => $contestId));
             if (empty($contestInfo)) {
                 throw new InterfaceException('竞赛不存在!');
             }
             if ($submitTime > $contestInfo['end_time']) {
                 throw new InterfaceException('比赛已经结束!');
             }
             if ($submitTime < $contestInfo['begin_time']) {
                 throw new InterfaceException('比赛未开始!');
             }
             // 获取当前的submit_order
             $lastRow = OjSolutionInterface::getRow(array('where' => array(array('contest_id', '=', $contestId)), 'order' => array('id' => 'DESC')));
             $data['contest_id'] = $contestId;
             $data['contest_submit_order'] = empty($lastRow) ? 1 : intval($lastRow['contest_submit_order']) + 1;
             $data['contest_submit_second'] = $submitTime - $contestInfo['begin_time'];
             $data['contest_end_time'] = $contestInfo['end_time'];
             $solutionId = $solutionModel->insert($data);
             // 激活比赛
             if (!$contestInfo['is_active']) {
                 OjContestInterface::save(array('id' => $contestId, 'trans' => $innerTrans, 'is_active' => 1));
             }
         }
         // 如果是HQU题库,加入队列
         if ($problemInfo['remote'] == StatusVars::REMOTE_HQU) {
             OjJudgeInterface::save(array('trans' => $innerTrans, 'problem_id' => $problemInfo['problem_id'], 'language' => $language, 'source' => $source, 'user_id' => $userId, 'solution_id' => $solutionId));
         }
         // 保存代码
         OjSolutionCodeInterface::save(array('trans' => $innerTrans, 'solution_id' => $solutionId, 'source' => $source));
         if (null == $trans && null != $innerTrans) {
             // 没有外部事务,并且存在内部事务
             $innerTrans->commit();
         }
         // 设置重复提交缓存
         $memcached = MemcachedPool::getMemcached(MemcachedConfig::$SERVER_COMMON);
         $key = MemcachedKeys::OJ_SECOND_SUBMIT_ . $userId;
         $memcached->set($key, true, time() + 5);
         return $solutionId;
     } else {
         // 开始事务
         $innerTrans = $trans;
         if (null == $trans && array_key_exists('result', $data)) {
             // 开启内部事务条件
             $innerTrans = new Trans(DbConfig::$SERVER_TRANS);
             $innerTrans->begin();
         }
         $model = new OjSolutionModel($innerTrans);
         if (array_key_exists('result', $data)) {
             self::updateResult($id, $data['result'], $innerTrans);
             unset($data['result']);
         }
         // 对某些字段特殊处理
         $updateData = $data;
         $affects = $model->updateById($id, $updateData);
         if (null == $trans && null != $innerTrans) {
             // 没有外部事务,并且存在内部事务
             $innerTrans->commit();
         }
         return $affects;
     }
 }