]> iEval git - gruntmaster-page.git/blame - lib/Gruntmaster/Data.pm
Add article support
[gruntmaster-page.git] / lib / Gruntmaster / Data.pm
CommitLineData
cd9af27e
MG
1package Gruntmaster::Data;
2use v5.14;
3use warnings;
4use parent qw/Exporter/;
5
6use JSON qw/encode_json decode_json/;
7
8use Redis;
9
10our $contest;
11my $redis = Redis->new;
22642746 12my $pubsub = Redis->new;
cd9af27e
MG
13
14sub dynsub{
15 no strict 'refs';
16 *{$_[0]} = $_[1];
17}
18
19BEGIN {
c83f6017 20 for my $cmd (qw/multi exec smembers get hget hdel hset sadd srem incr hmset hsetnx publish/) {
1e683a56 21 dynsub uc $cmd, sub { $redis->$cmd(@_) };
cd9af27e 22 }
22642746 23
c83f6017 24 for my $cmd (qw/subscribe wait_for_messages/) {
1e683a56 25 dynsub uc $cmd, sub { $pubsub->$cmd(@_) };
22642746 26 }
cd9af27e
MG
27}
28
29sub cp { defined $contest ? "contest.$contest." : '' }
30
31sub multi () { MULTI }
32sub rexec () { EXEC }
33
34sub problems () { SMEMBERS cp . 'problem' }
35sub contests () { SMEMBERS cp . 'contest' }
4aa8ba86 36sub users () { SMEMBERS cp . 'user' }
3da9c3c2 37sub jobcard () { GET cp . 'job' }
cd9af27e 38
3da9c3c2
MG
39sub job_results (_) { decode_json HGET cp . "job.$_[0]", 'results' }
40sub set_job_results ($+) { HSET cp . "job.$_[0]", 'results', encode_json $_[1] }
41sub job_inmeta (_) { decode_json HGET cp . "job.$_[0]", 'inmeta' }
42sub set_job_inmeta ($+) { HSET cp . "job.$_[0]", 'inmeta', encode_json $_[1] }
43sub problem_meta (_) { decode_json HGET cp . "problem.$_[0]", 'meta' }
44sub set_problem_meta ($+) { HSET cp . "problem.$_[0]", 'meta', encode_json $_[1] }
45sub job_daemon (_) { HGET cp . "job.$_[0]", 'daemon' }
46sub set_job_daemon ($$) { HSETNX cp . "job.$_[0]", 'daemon', $_[1] };
cd9af27e
MG
47
48sub defhash{
49 my ($name, @keys) = @_;
50 for my $key (@keys) {
51 dynsub "${name}_$key", sub (_) { HGET cp . "$name.$_[0]", $key };
52 dynsub "set_${name}_$key", sub ($$) { HSET cp . "$name.$_[0]", $key, $_[1] };
53 }
54
eafc7f54
MG
55 dynsub "edit_$name", sub {
56 my ($key, %values) = @_;
57 HMSET cp . "$name.$key", %values;
58 };
59
cd9af27e
MG
60 dynsub "insert_$name", sub {
61 my ($key, %values) = @_;
62 SADD cp . $name, $key or return;
63 HMSET cp . "$name.$key", %values;
64 };
3da9c3c2
MG
65 dynsub "remove_$name", sub (_) {
66 my $key = shift;
67 SREM cp . $name, $key;
68 };
69
cd9af27e
MG
70 dynsub "push_$name", sub {
71 my $nr = INCR cp . $name;
72 HMSET cp . "$name.$nr", @_;
e5f2bda6 73 $nr
cd9af27e
MG
74 };
75}
76
2ee6edcf 77defhash problem => qw/name level statement owner author/;
cd9af27e 78defhash contest => qw/start end name owner/;
e5f2bda6 79defhash job => qw/date extension filesize private problem result result_text user/;
4aa8ba86 80defhash user => qw/name email town university level/;
cd9af27e 81
83a8a7d6
MG
82sub clean_job (_){
83 HDEL cp . "job.$_[0]", qw/result result_text results daemon/
84}
85
bb95f538 86our @EXPORT = do {
cd9af27e 87 no strict 'refs';
3da9c3c2 88 grep { $_ =~ /^[a-zA-Z]/ and exists &$_ } keys %{__PACKAGE__ . '::'};
cd9af27e
MG
89};
90
911
This page took 0.034744 seconds and 4 git commands to generate.