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