record /.meta/md5sum and correct TokyoCabinet usage
[cloudstore.git] / lib / CloudStore / MD5sum.pm
1 package CloudStore::MD5sum;
2 use warnings;
3 use strict;
4
5 use TokyoCabinet;
6 use Carp qw(confess carp);
7
8 sub new {
9         my ($class) = @_;
10         my $self = {};
11         bless $self, $class;
12         return $self;
13 }
14
15 our $md5sum_db;
16
17 sub md5sum {
18         my ( $self, $data ) = @_;
19
20         my $login = $data;
21            $login = $data->{login} if ref $data eq 'HASH' && exists $data->{login};
22
23         return $md5sum_db->{$login} if exists $md5sum_db->{$login};
24
25         my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
26                 getpwnam $login;
27
28         my $md5_path = "$dir/.md5";
29
30         my $db = TokyoCabinet::HDB->new();
31         $db->open($md5_path, $db->OWRITER | $db->OCREAT)
32         or die "can't open $md5_path: ",$db->errmsg( $db->ecode );
33
34         warn "open $md5_path";
35
36         $md5sum_db->{$login} = $db;
37         return $db;
38 }
39
40 sub md5sum_dump {
41         my ( $self, $login ) = @_;
42
43         my @lines;
44
45         my $hdb = $self->md5sum( $login );
46         $hdb->iterinit();
47         while(defined(my $key = $hdb->iternext())){
48             my $value = $hdb->get($key);
49             if(defined($value)){
50                 push @lines, "$value  $key";
51             }
52         }
53         return @lines;
54 }
55
56
57 sub md5sum_close {
58         my ( $self, $login ) = @_;
59
60         $login = $login->{login} if ref $login eq 'HASH';
61         confess "no login" unless $login;
62
63         if ( exists $md5sum_db->{$login} ) {
64                 $md5sum_db->{$login}->close;
65                 delete $md5sum_db->{$login};
66                 warn "close md5sum $login";
67         } else {
68                 carp "# close md5sum $login IGNORED";
69         }
70 }
71
72 1;