re-create md5sum database on fatal error
[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         if ( ! $db->open($md5_path, $db->OWRITER | $db->OCREAT) ) {
32                 warn "FATAL ERROR: md5sum $md5_path: ",$db->errmsg( $db->ecode ),"\n";
33                 rename $md5_path, $md5_path . 'bak' && warn "saved old file in $md5_path.bak and re-created database";
34                 $db->open($md5_path, $db->OWRITER | $db->OCREAT);
35         }
36
37         warn "open $md5_path";
38
39         $md5sum_db->{$login} = $db;
40         return $db;
41 }
42
43 sub md5sum_dump {
44         my ( $self, $login ) = @_;
45
46         my @lines;
47
48         my $hdb = $self->md5sum( $login );
49         $hdb->iterinit();
50         while(defined(my $key = $hdb->iternext())){
51             my $value = $hdb->get($key);
52             if(defined($value)){
53                 push @lines, "$value  $key";
54             }
55         }
56         return @lines;
57 }
58
59
60 sub md5sum_close {
61         my ( $self, $login ) = @_;
62
63         $login = $login->{login} if ref $login eq 'HASH';
64         if ( ! $login ) {
65                 warn "ERROR: md5sum_close no login";
66                 return;
67         }
68
69         if ( exists $md5sum_db->{$login} ) {
70                 $md5sum_db->{$login}->close;
71                 delete $md5sum_db->{$login};
72                 warn "close md5sum $login";
73         } else {
74                 carp "# close md5sum $login IGNORED";
75         }
76 }
77
78 1;