1 package Gruntmaster
::Data
;
4 use parent qw
/Exporter/;
6 use JSON qw
/encode_json decode_json/;
8 use Sub
::Name qw
/subname/;
10 our $VERSION = '5999.000_001';
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 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";
98 HGET
'lastjob', $_[0];
102 HSET
'lastjob', $_[0], time;
107 grep { $_ =~ /^[a-zA-Z]/ and exists &$_ } keys %{__PACKAGE__
. '::'};
117 Gruntmaster::Data - Gruntmaster 6000 Online Judge -- database interface and tools
121 for my $problem (problems) {
122 say "Problem name: " . problem_name $problem;
123 say "Problem level: " . problem_level $problem;
129 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.
131 The current contest is selected by setting the C<< $Gruntmaster::Data::contest >> variable.
133 local $Gruntmaster::Data::contest = 'mycontest';
134 say 'There are' . jobcard . ' jobs in my contest';
140 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>.
142 These functions correspond to Redis commands. The current list is: B<< MULTI EXEC SMEMBERS GET HGET HDEL HSET SADD SREM INCR HMSET HSETNX DEL PUBLISH SUBSCRIBE WAIT_FOR_MESSAGES >>.
150 Returns a list of problems in the current contest.
152 =item B<problem_meta> I<$problem>
154 Returns a problem's meta.
156 =item B<set_problem_meta> I<$problem>, I<$meta>
158 Sets a problem's meta.
160 =item B<problem_name> I<$problem>
162 Returns a problem's name.
164 =item B<set_problem_name> I<$problem>, I<$name>
166 Sets a problem's name.
168 =item B<problem_level> I<$problem>
170 Returns a problem's level. The levels are beginner, easy, medium, hard.
172 =item B<set_problem_level> I<$problem>, I<$level>
174 Sets a problem's level. The levels are beginner, easy, medium, hard.
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<get_open> I<$problem>, I<$user>
202 Returns the time when I<$user> opened I<$problem>.
204 =item B<mark_open> I<$problem>, I<$user>
206 Sets the time when I<$user> opened I<$problem> to the current time. Does nothing if I<$user> has already opened I<$problem>.
208 =item B<insert_problem> I<$id>, I<$key> => I<$value>, ...
210 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.
212 =item B<edit_problem> I<$id>, I<$key> => I<$value>, ...
214 Updates the configuration of a problem. The values of the given keys are updated. All other keys/values are left intact.
216 =item B<remove_problem> I<$id>
224 B<<< WARNING: these functions only work correctly when C<< $Gruntmaster::Data::contest >> is undef >>>
230 Returns a list of contests.
232 =item B<contest_start> I<$contest>
234 Returns a contest's start time.
236 =item B<set_contest_start> I<$contest>, I<$start>
238 Sets a contest's start time.
240 =item B<contest_end> I<$contest>
242 Returns a contest's end time.
244 =item B<set_contest_end> I<$contest>, I<$end>
246 Sets a contest's end time.
248 =item B<contest_name> I<$contest>
250 Returns a contest's name.
252 =item B<set_contest_name> I<$contest>, I<$name>
254 Sets a contest's name.
256 =item B<contest_owner> I<$contest>
258 Returns a contest's owner.
260 =item B<set_contest_owner> I<$contest>, I<$owner>
262 Sets a contest's owner.
264 =item B<insert_contest> I<$id>, I<$key> => I<$value>, ...
266 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.
268 =item B<edit_contest> I<$id>, I<$key> => I<$value>, ...
270 Updates the configuration of a contest. The values of the given keys are updated. All other keys/values are left intact.
272 =item B<remove_contest> I<$id>
284 Returns the number of jobs in the database.
286 =item B<job_results> I<$job>
288 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).
290 =item B<set_job_results> I<$job>, I<$results>
292 Sets a job's results.
294 =item B<job_inmeta> I<$job>
296 Returns a job's meta.
298 =item B<set_job_inmeta> I<$job>, I<$meta>
302 =item B<job_daemon> I<$job>
304 Returns the hostname:pid of the daemon which ran this job.
306 =item B<set_job_daemon> I<$job>, I<$hostname_and_pid>
308 If the job has no associated daemon, it sets the daemon and returns true. Otherwise it returns false without setting the daemon.
310 =item B<job_date> I<$job>
312 Returns a job's submit date.
314 =item B<set_job_date> I<$job>, I<$date>
316 Sets a job's submit date.
318 =item B<job_errors> I<$job>
320 Returns a job's compile errors.
322 =item B<set_job_errors> I<$job>, I<$errors>
324 Sets a job's compile errors.
326 =item B<job_extension> I<$job>
328 Returns a job's file name extension (e.g. "cpp", "pl", "java").
330 =item B<set_job_extension> I<$job>, I<$extension>
332 Sets a job's file name extension.
334 =item B<job_filesize> I<$job>
336 Returns a job's source file size, in bytes.
338 =item B<set_job_filesize> I<$job>, I<$filesize>
340 Sets a job's source file size, in bytes.
342 =item B<job_private> I<$job>
344 Returns the value of a job's private flag.
346 =item B<set_job_private> I<$job>, I<$private>
348 Sets the value of a job's private flag.
350 =item B<job_problem> I<$job>
352 Returns a job's problem.
354 =item B<set_job_problem> I<$job>, I<$problem>
356 Sets a job's problem.
358 =item B<job_result> I<$job>
360 Returns a job's result code. Possible result codes are described in L<Gruntmaster::Daemon::Constants>
362 =item B<set_job_result> I<$job>, I<$result>
364 Sets a job's result code.
366 =item B<job_result_text> I<$job>
368 Returns a job's result text.
370 =item B<set_job_result_text> I<$job>, I<$result_text>
372 Sets a job's result text.
374 =item B<job_user> I<$job>
376 Returns the user who submitted a job.
378 =item B<set_job_user> I<$job>, I<$user>
380 Sets the suer who submitted a job.
382 =item B<clean_job> I<$job>
384 Removes a job's daemon, result code, result text and result array.
386 =item B<push_job> I<$key> => I<$value>, ...
388 Inserts a job with a given initial configuration. Returns the id of the newly-added job.
390 =item B<edit_job> I<$id>, I<$key> => I<$value>, ...
392 Updates the configuration of a job. The values of the given keys are updated. All other keys/values are left intact.
394 =item B<remove_job> I<$id>
402 B<<< WARNING: these functions only work correctly when C<< $Gruntmaster::Data::contest >> is undef >>>
408 Returns a list of users.
410 =item B<user_name> I<$user>
412 Returns a user's full name.
414 =item B<set_user_name> I<$user>, I<$name>
416 Sets a user's full name.
418 =item B<user_email> I<$user>
420 Returns a user's email address.
422 =item B<set_user_email> I<$user>, I<$email>
424 Sets a user's email address.
426 =item B<user_town> I<$user>
428 Returns a user's town.
430 =item B<set_user_town> I<$user>, I<$town>
434 =item B<user_university> I<$user>
436 Returns a user's university/highschool/place of work/etc.
438 =item B<set_user_university> I<$user>, I<$university>
440 Sets a user's university, highschool/place of work/etc.
442 =item B<user_level> I<$user>
444 Returns a user's current level of study. One of 'Highschool', 'Undergraduate', 'Master', 'Doctorate' or 'Other'.
446 =item B<set_user_level> I<$user>, I<$level>
448 Sets a user's current level of study.
450 =item B<insert_user> I<$id>, I<$key> => I<$value>, ...
452 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.
454 =item B<edit_user> I<$id>, I<$key> => I<$value>, ...
456 Updates the configuration of a user. The values of the given keys are updated. All other keys/values are left intact.
458 =item B<remove_user> I<$id>
466 Marius Gavrilescu E<lt>marius@ieval.roE<gt>
468 =head1 COPYRIGHT AND LICENSE
470 Copyright (C) 2014 by Marius Gavrilescu
472 This library is free software: you can redistribute it and/or modify
473 it under the terms of the GNU Affero General Public License as published by
474 the Free Software Foundation, either version 3 of the License, or
475 (at your option) any later version.
This page took 0.041714 seconds and 4 git commands to generate.