extract MD5sum handling using TokyoCabinet
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 11 Dec 2011 22:56:23 +0000 (23:56 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 11 Dec 2011 22:56:23 +0000 (23:56 +0100)
lib/CloudStore/MD5sum.pm [new file with mode: 0644]
lib/CloudStore/Store.pm
t/MD5sum.t [new file with mode: 0755]

diff --git a/lib/CloudStore/MD5sum.pm b/lib/CloudStore/MD5sum.pm
new file mode 100644 (file)
index 0000000..dd147bf
--- /dev/null
@@ -0,0 +1,70 @@
+package CloudStore::MD5sum;
+use warnings;
+use strict;
+
+use TokyoCabinet;
+use Carp qw(confess);
+
+sub new {
+       my ($class) = @_;
+       my $self = {};
+       bless $self, $class;
+       return $self;
+}
+
+sub md5sum {
+       my ( $self, $data ) = @_;
+
+       my $login = $data;
+          $login = $data->{login} if ref $data eq 'HASH' && exists $data->{login};
+
+       return $self->{md5sum}->{$login} if exists $self->{md5sum}->{$login};
+
+       my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
+               getpwnam $login;
+
+       my $md5_path = "$dir/.md5";
+
+       my $db = TokyoCabinet::HDB->new();
+       $db->open($md5_path, $db->OWRITER | $db->OCREAT)
+       or die "can't open $md5_path: ",$db->errmsg( $db->ecode );
+
+       warn "open $md5_path";
+
+       $self->{md5sum}->{$login} = $db;
+       return $db;
+}
+
+sub md5sum_dump {
+       my ( $self, $login ) = @_;
+
+       my @lines;
+
+       my $hdb = $self->md5sum( $login );
+        $hdb->iterinit();
+        while(defined(my $key = $hdb->iternext())){
+            my $value = $hdb->get($key);
+            if(defined($value)){
+               push @lines, "$key  $value";
+            }
+        }
+       return @lines;
+}
+
+
+sub md5sum_close {
+       my ( $self, $login ) = @_;
+
+       my @logins;
+#           @logins = keys %${ $self->{md5sum} } if exists $self->{md5sum} and ref $self->{md5sum} eq 'HASH';
+          @logins = ( $login ) if $login;
+
+       foreach my $login ( @logins ) {
+               # FIXME only login's?
+               $self->{md5sum}->{$login}->close;
+               warn "close md5sum $login";
+       }
+       delete $self->{md5sum};
+}
+
+1;
index 83a13c2..f1528fc 100644 (file)
@@ -3,6 +3,7 @@ use warnings;
 use strict;
 
 use lib 'lib';
+use base 'CloudStore::MD5sum';
 use CloudStore::API;
 
 use autodie;
@@ -12,7 +13,6 @@ use File::Slurp qw();
 use Digest::MD5 qw(md5_base64);
 use Data::Dump qw(dump);
 use Carp qw(confess);
-use TokyoCabinet;
 
 use WarnColor;
 
@@ -225,28 +225,6 @@ sub new_link {
        }
 }
 
-sub md5sum {
-       my ( $self, $data ) = @_;
-
-       my $login = $data->{login} || confess "missing login in ",dump $data;
-
-       return $self->{md5sum}->{$login} if exists $self->{md5sum}->{$login};
-
-       my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
-               getpwnam $login;
-
-       my $md5_path = "$dir/.md5";
-
-       my $db = TokyoCabinet::HDB->new();
-       $db->open($md5_path, $db->OWRITER | $db->OCREAT)
-       or die "can't open $md5_path: ",$db->errmsg( $db->ecode );
-
-       warn "open $md5_path";
-
-       $self->{md5sum}->{$login} = $db;
-       return $db;
-}
-
 sub init_pid_login {
        my ( $self, $pid, $login ) = @_;
 
@@ -268,12 +246,8 @@ sub init_pid_login {
 
 sub cleanup_pid {
        my ( $self, $pid ) = @_;
-       foreach my $login ( keys %{ $self->{md5sum} } ) {
-               # FIXME only login's?
-               $self->{md5sum}->{$login}->close;
-               warn "close md5sum $login";
-       }
-       delete $self->{md5sum};
+
+       $self->md5sum_close;
 
        delete $self->{pid}->{$pid};
        warn "removed $pid";
diff --git a/t/MD5sum.t b/t/MD5sum.t
new file mode 100755 (executable)
index 0000000..d6ac13f
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+use Data::Dump qw(dump);
+
+use lib 'lib';
+
+use_ok 'CloudStore::MD5sum';
+
+my $login = $ENV{LOGIN} || 'u2002';
+
+ok my $o = CloudStore::MD5sum->new, 'new';
+
+ok my $db = $o->md5sum($login), 'md5sum';
+diag dump $db;
+
+ok my $l = [ $o->md5sum_dump($login) ], 'md5sum_dump';
+diag dump $l;
+
+ok $o->md5sum_close($login), 'md5sum_close';
+