md5sum_dump now returns md5(space,space)path
[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);
7
8 sub new {
9         my ($class) = @_;
10         my $self = {};
11         bless $self, $class;
12         return $self;
13 }
14
15 sub md5sum {
16         my ( $self, $data ) = @_;
17
18         my $login = $data;
19            $login = $data->{login} if ref $data eq 'HASH' && exists $data->{login};
20
21         return $self->{md5sum}->{$login} if exists $self->{md5sum}->{$login};
22
23         my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
24                 getpwnam $login;
25
26         my $md5_path = "$dir/.md5";
27
28         my $db = TokyoCabinet::HDB->new();
29         $db->open($md5_path, $db->OWRITER | $db->OCREAT)
30         or die "can't open $md5_path: ",$db->errmsg( $db->ecode );
31
32         warn "open $md5_path";
33
34         $self->{md5sum}->{$login} = $db;
35         return $db;
36 }
37
38 sub md5sum_dump {
39         my ( $self, $login ) = @_;
40
41         my @lines;
42
43         my $hdb = $self->md5sum( $login );
44         $hdb->iterinit();
45         while(defined(my $key = $hdb->iternext())){
46             my $value = $hdb->get($key);
47             if(defined($value)){
48                 push @lines, "$value  $key";
49             }
50         }
51         return @lines;
52 }
53
54
55 sub md5sum_close {
56         my ( $self, $login ) = @_;
57
58         my @logins;
59 #           @logins = keys %${ $self->{md5sum} } if exists $self->{md5sum} and ref $self->{md5sum} eq 'HASH';
60            @logins = ( $login ) if $login;
61
62         foreach my $login ( @logins ) {
63                 # FIXME only login's?
64                 $self->{md5sum}->{$login}->close;
65                 warn "close md5sum $login";
66         }
67         delete $self->{md5sum};
68 }
69
70 1;