]>
iEval git - gruntmaster-data.git/blob - lib/Gruntmaster/OldData.pm
d873516673d0525ef88a5f77a93504dfe2cb1b3f
1 package Gruntmaster
:: OldData
;
4 use parent qw
/Exporter/ ;
6 use JSON qw
/encode_json decode_json/ ;
8 use Sub
:: Name qw
/subname/ ;
10 our $VERSION = '5999.000_002' ;
13 my $redis = Redis
-> new ;
14 my $pubsub = Redis
-> new ;
17 our ( $name , $sub ) = @_ ;
19 * $name = subname
$name => $sub
23 for my $cmd ( qw
/multi exec smembers get hget hgetall hdel hset sadd srem incr hmset hsetnx publish del/ ) {
24 dynsub
uc $cmd , sub { $redis -> $cmd ( @_ ) };
27 for my $cmd ( qw
/subscribe wait_for_messages/ ) {
28 dynsub
uc $cmd , sub { $pubsub -> $cmd ( @_ ) };
32 sub cp
{ defined $contest ?
"contest. $contest ." : '' }
34 sub problems
() { SMEMBERS cp
. 'problem' }
35 sub contests
() { SMEMBERS cp
. 'contest' }
36 sub users
() { SMEMBERS cp
. 'user' }
37 sub jobcard
() { GET cp
. 'job' }
39 sub job_results
( _
) { decode_json HGET cp
. "job. $_ [0]" , 'results' }
40 sub set_job_results
($+) { HSET cp
. "job. $_ [0]" , 'results' , encode_json
$_ [ 1 ] }
41 sub job_inmeta
( _
) { decode_json HGET cp
. "job. $_ [0]" , 'inmeta' }
42 sub set_job_inmeta
($+) { HSET cp
. "job. $_ [0]" , 'inmeta' , encode_json
$_ [ 1 ] }
43 sub problem_meta
( _
) { decode_json HGET cp
. "problem. $_ [0]" , 'meta' }
44 sub set_problem_meta
($+) { HSET cp
. "problem. $_ [0]" , 'meta' , encode_json
$_ [ 1 ] }
45 sub job_daemon
( _
) { HGET cp
. "job. $_ [0]" , 'daemon' }
46 sub set_job_daemon
($$) { HSETNX cp
. "job. $_ [0]" , 'daemon' , $_ [ 1 ] };
49 my ( $name , @keys ) = @_ ;
51 dynsub
"${name}_ $key " , sub ( _
) { HGET cp
. " $name . $_ [0]" , $key };
52 dynsub
"set_${name}_ $key " , sub ($$) { HSET cp
. " $name . $_ [0]" , $key , $_ [ 1 ] };
55 dynsub
"edit_ $name " , sub {
56 my ( $key , %values ) = @_ ;
57 HMSET cp
. " $name . $key " , %values ;
60 dynsub
"insert_ $name " , sub {
61 my ( $key , %values ) = @_ ;
62 SADD cp
. $name , $key or return ;
63 HMSET cp
. " $name . $key " , %values ;
65 dynsub
"remove_ $name " , sub ( _
) {
67 SREM cp
. $name , $key ;
68 DEL cp
. " $name . $key " ;
71 dynsub
"push_ $name " , sub {
72 my $nr = INCR cp
. $name ;
73 HMSET cp
. " $name . $nr " , @_ ;
78 defhash problem
=> qw
/name level difficulty statement owner author private generator runner judge testcnt timeout olimit/ ;
79 defhash contest
=> qw
/start end name owner/ ;
80 defhash job
=> qw
/date errors extension filesize private problem result result_text user/ ;
81 defhash user
=> qw
/name email lastjob phone town university level/ ;
84 HDEL cp
. "job. $_ [0]" , qw
/result result_text results daemon/
88 my ( $problem , $user ) = @_ ;
89 HSETNX cp
. 'open' , " $problem . $user " , time ;
93 my ( $problem , $user ) = @_ ;
94 HGET cp
. 'open' , " $problem . $user " ;
99 grep { $_ =~ /^[a-zA-Z]/ and exists & $_ } keys %{ __PACKAGE__
. '::' };
109 Gruntmaster::Data - Gruntmaster 6000 Online Judge -- database interface and tools
113 for my $problem (problems) {
114 say "Problem name: " . problem_name $problem;
115 say "Problem level: " . problem_level $problem;
121 Gruntmaster::Data is the Redis interface used by the Gruntmaster 6000 Online Judge. It exports many functions for talking to the database. All functions are exported by default.
123 The current contest is selected by setting the C<< $Gruntmaster::Data::contest >> variable.
125 local $Gruntmaster::Data::contest = 'mycontest';
126 say 'There are' . jobcard . ' jobs in my contest';
132 Gruntmaster::Data exports some functions for talking directly to the Redis server. These functions should not normally be used, except for B<MULTI>, B<EXEC>, B<PUBLISH>, B<SUBSCRIBE> and B<WAIT_FOR_MESSAGES>.
134 These functions correspond to Redis commands. The current list is: B<< MULTI EXEC SMEMBERS GET HGET HGETALL HDEL HSET SADD SREM INCR HMSET HSETNX DEL PUBLISH SUBSCRIBE WAIT_FOR_MESSAGES >>.
142 Returns a list of problems in the current contest.
144 =item B<problem_meta> I<$problem>
146 Returns a problem's meta.
148 =item B<set_problem_meta> I<$problem>, I<$meta>
150 Sets a problem's meta.
152 =item B<problem_name> I<$problem>
154 Returns a problem's name.
156 =item B<set_problem_name> I<$problem>, I<$name>
158 Sets a problem's name.
160 =item B<problem_level> I<$problem>
162 Returns a problem's level. The levels are beginner, easy, medium, hard.
164 =item B<set_problem_level> I<$problem>, I<$level>
166 Sets a problem's level. The levels are beginner, easy, medium, hard.
168 =item B<problem_difficulty> I<$problem>
170 Returns a problem's difficulty.
172 =item B<set_problem_difficulty> I<$problem>, I<$name>
174 Sets a problem's difficulty.
176 =item B<problem_statement> I<$problem>
178 Returns a problem's statement.
180 =item B<set_problem_statement> I<$problem>, I<$statement>
182 Sets a problem's statement.
184 =item B<problem_owner> I<$problem>
186 Returns a problem's owner.
188 =item B<set_problem_owner> I<$problem>, I<$owner>
190 Sets a problem's owner.
192 =item B<problem_author> I<$problem>
194 Returns a problem's author.
196 =item B<set_problem_author> I<$problem>, I<$author>
198 Sets a problem's author.
200 =item B<problem_private> I<$problem>
202 Returns a problem's private flag (true if the problem is private, false otherwise).
204 =item B<set_problem_private> I<$problem>, I<$private>
206 Sets a problem's private flag.
208 =item B<problem_generator> I<$problem>
210 Returns a problem's generator. The generators are File, Run and Undef. More might be added in the future.
212 =item B<set_problem_generator> I<$problem>, I<$generator>
214 Sets a problem's generator.
216 =item B<problem_runner> I<$problem>
218 Returns a problem's runner. The runners are File, Verifier and Interactive. More might be added in the future.
220 =item B<set_problem_runner> I<$problem>, I<$runner>
222 Sets a problem's runner.
224 =item B<problem_judge> I<$problem>
226 Returns a problem's judge. The judges are Absolute and Points. More might be added in the future.
228 =item B<set_problem_judge> I<$problem>, I<$judge>
230 Sets a problem's judge.
232 =item B<problem_testcnt> I<$problem>
234 Returns a problem's test count.
236 =item B<set_problem_testcnt> I<$problem>, I<$testcnt>
238 Sets a problem's test count.
240 =item B<problem_timeout> I<$problem>
242 Returns a problem's time limit, in seconds.
244 =item B<set_problem_timeout> I<$problem>, I<$timeout>
246 Sets a problem's time limit, in seconds.
248 =item B<problem_olimit> I<$problem>
250 Returns a problem's output limit, in bytes.
252 =item B<set_problem_olimit> I<$problem>, I<$olimit>
254 Sets a problem's output limit, in bytes.
256 =item B<get_open> I<$problem>, I<$user>
258 Returns the time when I<$user> opened I<$problem>.
260 =item B<mark_open> I<$problem>, I<$user>
262 Sets the time when I<$user> opened I<$problem> to the current time. Does nothing if I<$user> has already opened I<$problem>.
264 =item B<insert_problem> I<$id>, I<$key> => I<$value>, ...
266 Inserts a problem with id I<$id> and the given initial configuration. Does nothing if a problem with id I<$id> already exists. Returns true if the problem was added, false otherwise.
268 =item B<edit_problem> I<$id>, I<$key> => I<$value>, ...
270 Updates the configuration of a problem. The values of the given keys are updated. All other keys/values are left intact.
272 =item B<remove_problem> I<$id>
280 B<<< WARNING: these functions only work correctly when C<< $Gruntmaster::Data::contest >> is undef >>>
286 Returns a list of contests.
288 =item B<contest_start> I<$contest>
290 Returns a contest's start time.
292 =item B<set_contest_start> I<$contest>, I<$start>
294 Sets a contest's start time.
296 =item B<contest_end> I<$contest>
298 Returns a contest's end time.
300 =item B<set_contest_end> I<$contest>, I<$end>
302 Sets a contest's end time.
304 =item B<contest_name> I<$contest>
306 Returns a contest's name.
308 =item B<set_contest_name> I<$contest>, I<$name>
310 Sets a contest's name.
312 =item B<contest_owner> I<$contest>
314 Returns a contest's owner.
316 =item B<set_contest_owner> I<$contest>, I<$owner>
318 Sets a contest's owner.
320 =item B<insert_contest> I<$id>, I<$key> => I<$value>, ...
322 Inserts a contest with id I<$id> and the given initial configuration. Does nothing if a contest with id I<$id> already exists. Returns true if the contest was added, false otherwise.
324 =item B<edit_contest> I<$id>, I<$key> => I<$value>, ...
326 Updates the configuration of a contest. The values of the given keys are updated. All other keys/values are left intact.
328 =item B<remove_contest> I<$id>
340 Returns the number of jobs in the database.
342 =item B<job_results> I<$job>
344 Returns an array of job results. Each element corresponds to a test and is a hashref with keys B<id> (test number), B<result> (result code, see L<Gruntmaster::Daemon::Constants>), B<result_text> (result description) and B<time> (time taken).
346 =item B<set_job_results> I<$job>, I<$results>
348 Sets a job's results.
350 =item B<job_inmeta> I<$job>
352 Returns a job's meta.
354 =item B<set_job_inmeta> I<$job>, I<$meta>
358 =item B<job_daemon> I<$job>
360 Returns the hostname:pid of the daemon which ran this job.
362 =item B<set_job_daemon> I<$job>, I<$hostname_and_pid>
364 If the job has no associated daemon, it sets the daemon and returns true. Otherwise it returns false without setting the daemon.
366 =item B<job_date> I<$job>
368 Returns a job's submit date.
370 =item B<set_job_date> I<$job>, I<$date>
372 Sets a job's submit date.
374 =item B<job_errors> I<$job>
376 Returns a job's compile errors.
378 =item B<set_job_errors> I<$job>, I<$errors>
380 Sets a job's compile errors.
382 =item B<job_extension> I<$job>
384 Returns a job's file name extension (e.g. "cpp", "pl", "java").
386 =item B<set_job_extension> I<$job>, I<$extension>
388 Sets a job's file name extension.
390 =item B<job_filesize> I<$job>
392 Returns a job's source file size, in bytes.
394 =item B<set_job_filesize> I<$job>, I<$filesize>
396 Sets a job's source file size, in bytes.
398 =item B<job_private> I<$job>
400 Returns the value of a job's private flag.
402 =item B<set_job_private> I<$job>, I<$private>
404 Sets the value of a job's private flag.
406 =item B<job_problem> I<$job>
408 Returns a job's problem.
410 =item B<set_job_problem> I<$job>, I<$problem>
412 Sets a job's problem.
414 =item B<job_result> I<$job>
416 Returns a job's result code. Possible result codes are described in L<Gruntmaster::Daemon::Constants>
418 =item B<set_job_result> I<$job>, I<$result>
420 Sets a job's result code.
422 =item B<job_result_text> I<$job>
424 Returns a job's result text.
426 =item B<set_job_result_text> I<$job>, I<$result_text>
428 Sets a job's result text.
430 =item B<job_user> I<$job>
432 Returns the user who submitted a job.
434 =item B<set_job_user> I<$job>, I<$user>
436 Sets the suer who submitted a job.
438 =item B<clean_job> I<$job>
440 Removes a job's daemon, result code, result text and result array.
442 =item B<push_job> I<$key> => I<$value>, ...
444 Inserts a job with a given initial configuration. Returns the id of the newly-added job.
446 =item B<edit_job> I<$id>, I<$key> => I<$value>, ...
448 Updates the configuration of a job. The values of the given keys are updated. All other keys/values are left intact.
450 =item B<remove_job> I<$id>
458 B<<< WARNING: these functions only work correctly when C<< $Gruntmaster::Data::contest >> is undef >>>
464 Returns a list of users.
466 =item B<user_name> I<$user>
468 Returns a user's full name.
470 =item B<set_user_name> I<$user>, I<$name>
472 Sets a user's full name.
474 =item B<user_email> I<$user>
476 Returns a user's email address.
478 =item B<set_user_email> I<$user>, I<$email>
480 Sets a user's email address.
482 =item B<user_lastjob> I<$user>
484 Returns the time (seconds since epoch) when the user last submitted a solution.
486 =item B<set_user_lastjob> I<$user>, I<$lastjob>
488 Sets the time (seconds since epoch) when the user last submitted a solution.
490 =item B<user_town> I<$user>
492 Returns a user's town.
494 =item B<set_user_town> I<$user>, I<$town>
498 =item B<user_university> I<$user>
500 Returns a user's university/highschool/place of work/etc.
502 =item B<set_user_university> I<$user>, I<$university>
504 Sets a user's university, highschool/place of work/etc.
506 =item B<user_level> I<$user>
508 Returns a user's current level of study. One of 'Highschool', 'Undergraduate', 'Master', 'Doctorate' or 'Other'.
510 =item B<set_user_level> I<$user>, I<$level>
512 Sets a user's current level of study.
514 =item B<insert_user> I<$id>, I<$key> => I<$value>, ...
516 Inserts a user with id I<$id> and the given initial configuration. Does nothing if a user with id I<$id> already exists. Returns true if the user was added, false otherwise.
518 =item B<edit_user> I<$id>, I<$key> => I<$value>, ...
520 Updates the configuration of a user. The values of the given keys are updated. All other keys/values are left intact.
522 =item B<remove_user> I<$id>
530 Marius Gavrilescu E<lt>marius@ieval.roE<gt>
532 =head1 COPYRIGHT AND LICENSE
534 Copyright (C) 2014 by Marius Gavrilescu
536 This library is free software: you can redistribute it and/or modify
537 it under the terms of the GNU Affero General Public License as published by
538 the Free Software Foundation, either version 3 of the License, or
539 (at your option) any later version.
This page took 0.144307 seconds and 3 git commands to generate.