Code: Select all
diff -cr ejudge/new_server_html_4.c ejudge-new/new_server_html_4.c
*** ejudge/new_server_html_4.c 2013-02-13 09:06:04.000000000 +0400
--- ejudge-new/new_server_html_4.c 2013-03-06 14:50:59.227602834 +0400
***************
*** 964,970 ****
FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
if (stop_time)
FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
! if (serve_check_user_quota(cs, phr->user_id, run_size) < 0)
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
if (!serve_is_problem_started(cs, phr->user_id, prob))
FAIL(NEW_SRV_ERR_PROB_UNAVAILABLE);
--- 964,970 ----
FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
if (stop_time)
FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
! if (serve_check_user_quota(cs, prob, phr->user_id, run_size) < 0)
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
if (!serve_is_problem_started(cs, phr->user_id, prob))
FAIL(NEW_SRV_ERR_PROB_UNAVAILABLE);
diff -cr ejudge/new_server_html.c ejudge-new/new_server_html.c
*** ejudge/new_server_html.c 2013-02-13 09:06:04.000000000 +0400
--- ejudge-new/new_server_html.c 2013-03-06 14:50:59.230602834 +0400
***************
*** 10626,10632 ****
if (!admin_mode && stop_time > 0) {
FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
}
! if (!admin_mode && serve_check_user_quota(cs, user_id, run_size) < 0) {
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
}
if (!admin_mode && !serve_is_problem_started(cs, user_id, prob)) {
--- 10626,10632 ----
if (!admin_mode && stop_time > 0) {
FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
}
! if (!admin_mode && serve_check_user_quota(cs, prob, user_id, run_size) < 0) {
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
}
if (!admin_mode && !serve_is_problem_started(cs, user_id, prob)) {
***************
*** 11251,11257 ****
ns_error(log_f, NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
goto done;
}
! if (serve_check_user_quota(cs, phr->user_id, run_size) < 0) {
ns_error(log_f, NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
goto done;
}
--- 11251,11257 ----
ns_error(log_f, NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
goto done;
}
! if (serve_check_user_quota(cs, prob, phr->user_id, run_size) < 0) {
ns_error(log_f, NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
goto done;
}
***************
*** 14775,14781 ****
if (cs->clients_suspended) FAIL(NEW_SRV_ERR_CLIENTS_SUSPENDED);
if (!start_time) FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
if (stop_time) FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
! if (serve_check_user_quota(cs, phr->user_id, run_size) < 0)
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
// problem submit start time
if (!serve_is_problem_started(cs, phr->user_id, prob))
--- 14775,14781 ----
if (cs->clients_suspended) FAIL(NEW_SRV_ERR_CLIENTS_SUSPENDED);
if (!start_time) FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
if (stop_time) FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
! if (serve_check_user_quota(cs, prob, phr->user_id, run_size) < 0)
FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
// problem submit start time
if (!serve_is_problem_started(cs, phr->user_id, prob))
diff -cr ejudge/prepare.c ejudge-new/prepare.c
*** ejudge/prepare.c 2013-02-13 09:06:05.000000000 +0400
--- ejudge-new/prepare.c 2013-03-06 15:18:27.697099053 +0400
***************
*** 5869,5876 ****
case CNTSPROB_max_user_run_count:
if (out->max_user_run_count < 0 && abstr)
out->max_user_run_count = abstr->max_user_run_count;
- if (out->max_user_run_count < 0)
- out->max_user_run_count = 0;
break;
case CNTSPROB_full_score:
--- 5869,5874 ----
***************
*** 7104,7110 ****
.stand_hide_time = 0,
.score_multiplier = 0,
.prev_runs_to_show = 0,
! .max_user_run_count = 0,
.advance_to_next = 0,
.disable_ctrl_chars = 0,
.valuer_sets_marked = 0,
--- 7102,7108 ----
.stand_hide_time = 0,
.score_multiplier = 0,
.prev_runs_to_show = 0,
! .max_user_run_count = -1,
.advance_to_next = 0,
.disable_ctrl_chars = 0,
.valuer_sets_marked = 0,
diff -cr ejudge/runlog.c ejudge-new/runlog.c
*** ejudge/runlog.c 2013-02-13 09:06:04.000000000 +0400
--- ejudge-new/runlog.c 2013-03-06 14:50:59.230602834 +0400
***************
*** 718,723 ****
--- 718,747 ----
if (ps) *ps = sz;
}
+ int run_get_team_problem_usage (
+ runlog_state_t state,
+ int teamid,
+ int prob_id,
+ int skip_ce_flag)
+ {
+ int i, n;
+ n = 0;
+ for (i = 0; i < state->run_u; i++) {
+ if (state->runs[i].status == RUN_VIRTUAL_START
+ || state->runs[i].status == RUN_VIRTUAL_STOP
+ || state->runs[i].status == RUN_EMPTY)
+ continue;
+ if ((state->runs[i].status == RUN_COMPILE_ERR
+ || state->runs[i].status == RUN_STYLE_ERR
+ || state->runs[i].status == RUN_REJECTED)
+ && skip_ce_flag) continue;
+ if (state->runs[i].user_id == teamid && state->runs[i].prob_id == prob_id)
+ n++;
+ }
+ return n;
+ }
+
+
/* FIXME: VERY DUMB */
int
run_get_attempts(
diff -cr ejudge/runlog.h ejudge-new/runlog.h
*** ejudge/runlog.h 2013-02-13 09:06:04.000000000 +0400
--- ejudge-new/runlog.h 2013-03-06 14:50:59.231602834 +0400
***************
*** 161,167 ****
time_t run_get_finish_time(runlog_state_t state);
time_t run_get_duration(runlog_state_t);
!
void run_get_team_usage(runlog_state_t, int, int *, size_t*);
int run_get_attempts(runlog_state_t, int, int *, int *, int);
int run_count_all_attempts(runlog_state_t state, int user_id, int prob_id);
--- 161,167 ----
time_t run_get_finish_time(runlog_state_t state);
time_t run_get_duration(runlog_state_t);
! int run_get_team_problem_usage(runlog_state_t, int, int, int);
void run_get_team_usage(runlog_state_t, int, int *, size_t*);
int run_get_attempts(runlog_state_t, int, int *, int *, int);
int run_count_all_attempts(runlog_state_t state, int user_id, int prob_id);
diff -cr ejudge/serve_2.c ejudge-new/serve_2.c
*** ejudge/serve_2.c 2013-02-13 09:06:04.000000000 +0400
--- ejudge-new/serve_2.c 2013-03-06 15:21:50.245088851 +0400
***************
*** 391,409 ****
}
int
! serve_check_user_quota(serve_state_t state, int user_id, size_t size)
{
int num;
size_t total;
-
if (size > state->global->max_run_size) return -1;
run_get_team_usage(state->runlog_state, user_id, &num, &total);
if (num >= state->global->max_run_num
|| total + size > state->global->max_run_total)
return -1;
return 0;
}
int
serve_check_clar_quota(serve_state_t state, int user_id, size_t size)
{
--- 391,412 ----
}
int
! serve_check_user_quota(serve_state_t state, const struct section_problem_data *prob, int user_id, size_t size)
{
int num;
size_t total;
if (size > state->global->max_run_size) return -1;
run_get_team_usage(state->runlog_state, user_id, &num, &total);
if (num >= state->global->max_run_num
|| total + size > state->global->max_run_total)
return -1;
+ num = run_get_team_problem_usage (state->runlog_state, user_id, prob->id, state->global->ignore_compile_errors);
+ if (num >= prob->max_user_run_count && prob->max_user_run_count>=0)
+ return -1;
return 0;
}
+
int
serve_check_clar_quota(serve_state_t state, int user_id, size_t size)
{
diff -cr ejudge/serve_state.h ejudge-new/serve_state.h
*** ejudge/serve_state.h 2013-02-13 09:06:05.000000000 +0400
--- ejudge-new/serve_state.h 2013-03-06 14:50:59.232602834 +0400
***************
*** 341,347 ****
void serve_load_status_file(serve_state_t state);
void serve_remove_status_file(serve_state_t state);
! int serve_check_user_quota(serve_state_t, int user_id, size_t size);
int serve_check_clar_quota(serve_state_t, int user_id, size_t size);
int serve_check_cnts_caps(serve_state_t state, const struct contest_desc *,
--- 341,347 ----
void serve_load_status_file(serve_state_t state);
void serve_remove_status_file(serve_state_t state);
! int serve_check_user_quota(serve_state_t, const struct section_problem_data*, int user_id, size_t size);
int serve_check_clar_quota(serve_state_t, int user_id, size_t size);
int serve_check_cnts_caps(serve_state_t state, const struct contest_desc *,