new implementation of md5 using attr
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 11 Feb 2012 17:52:11 +0000 (18:52 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 11 Feb 2012 17:52:11 +0000 (18:52 +0100)
lib/CloudStore/API.pm
lib/CloudStore/MD5sum.pm
lib/CloudStore/Store.pm
t/MD5sum.t
t/client.t

index 6b9fccb..ef39524 100644 (file)
@@ -192,17 +192,13 @@ sub send_file {
        if ( $f->{uid} == $self->{md5}->{uid} ) {
                $md5 = $f_path; # we don't have local md5sum db for md5 user!
        } else {
-               $md5 = $self->md5sum($f)->get( $f_path );
-               $self->md5sum_close($f);
+               $md5 = $self->md5_get($f_full);
        }
        if ( ! $md5 ) {
                warn "ERROR: no md5 for $f_path";
                return $ok;
        }
 
-       $self->md5sum($t)->put( $t_path => $md5 );
-       $self->md5sum_close($t);
-
        $self->append_meta('md5sum', $t, $md5 => $t_path ); # md5sum for received files!
 
        return $ok;
@@ -212,19 +208,18 @@ sub rename_file {
        my ( $self, $user, $from, $to ) = @_;
        $user = $self->user_info($user) unless ref $user eq 'HASH';
 
-       $self->mkbasepath( "$user->{dir}/$to", { uid => $user->{uid}, gid => $user->{gid} } );
-       my $ok = rename "$user->{dir}/$from", "$user->{dir}/$to";
+       my $f_full = "$user->{dir}/$from";
+       my $t_full = "$user->{dir}/$to";
+
+       $self->mkbasepath( $t_full, { uid => $user->{uid}, gid => $user->{gid} } );
+       my $ok = rename $f_full, $t_full;
 
-       my $md5 = $self->md5sum($user)->get( $from );
+       my $md5 = $self->md5_get($t_full);
        if ( ! $md5 ) {
                warn "ERROR: no md5sum for $from";
                return $ok; # XXX our internal error
        }
 
-       $self->md5sum($user)->out( $from );
-       $self->md5sum($user)->put( $to => $md5 );
-       $self->md5sum_close($user);
-
        $self->append_meta('md5sum', $user, 'rename' => $from );
        $self->append_meta('md5sum', $user, $md5 => $from );
 
@@ -263,9 +258,6 @@ sub delete {
        $self->append( $user, 'delete', -$deleted_size, $user->{uid}, $path );
        $self->append_meta('md5sum', $user, 'delete', $path );
 
-       $self->md5sum($user)->out( $path );
-       $self->md5sum_close($user);
-
        return $full_path;
 }
 
index e0da2b5..c849e63 100644 (file)
@@ -2,77 +2,21 @@ package CloudStore::MD5sum;
 use warnings;
 use strict;
 
-use TokyoCabinet;
 use Carp qw(confess carp);
+use Data::Dump qw(dump);
 
-sub new {
-       my ($class) = @_;
-       my $self = {};
-       bless $self, $class;
-       return $self;
+sub md5_get {
+       my ( $self, $path ) = @_;
+       my $md5 = `attr -q -g md5 $path`;
+       warn "## md5_get $path $md5\n";
+       return $md5;
 }
 
-our $md5sum_db;
-
-sub md5sum {
-       my ( $self, $data ) = @_;
-
-       my $login = $data;
-          $login = $data->{login} if ref $data eq 'HASH' && exists $data->{login};
-
-       return $md5sum_db->{$login} if exists $md5sum_db->{$login};
-
-       my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) =
-               getpwnam $login;
-
-       my $md5_path = "$dir/.md5";
-
-       my $db = TokyoCabinet::HDB->new();
-       if ( ! $db->open($md5_path, $db->OWRITER | $db->OCREAT) ) {
-               warn "FATAL ERROR: md5sum $md5_path: ",$db->errmsg( $db->ecode ),"\n";
-               rename $md5_path, $md5_path . 'bak' && warn "saved old file in $md5_path.bak and re-created database";
-               $db->open($md5_path, $db->OWRITER | $db->OCREAT);
-       }
-
-       warn "open $md5_path";
-
-       $md5sum_db->{$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, "$value  $key";
-            }
-        }
-       return @lines;
-}
-
-
-sub md5sum_close {
-       my ( $self, $login ) = @_;
-
-       $login = $login->{login} if ref $login eq 'HASH';
-       if ( ! $login ) {
-               warn "ERROR: md5sum_close no login";
-               return;
-       }
-
-       if ( exists $md5sum_db->{$login} ) {
-               $md5sum_db->{$login}->close;
-               delete $md5sum_db->{$login};
-               warn "close md5sum $login";
-       } else {
-               carp "# close md5sum $login IGNORED";
-       }
+sub md5_set {
+       my ( $self, $path, $md5 ) = @_;
+       system "attr -q -s md5 -V $md5 $path";
+       warn "## md5_set $path $md5\n";
+       return $md5;
 }
 
 1;
index 5fbb814..16d6af1 100644 (file)
@@ -3,7 +3,7 @@ use warnings;
 use strict;
 
 use lib 'lib';
-use base 'CloudStore::MD5sum';
+use base qw(CloudStore::MD5sum);
 use CloudStore::API;
 
 use autodie;
@@ -155,7 +155,7 @@ sub new_file {
 sub removed_file {
        my ( $self, $data ) = @_;
 
-       my $md5 = $self->md5sum($data)->get( $data->{file} );
+       my $md5 = $self->md5_get( $data );
        return unless $md5; # directories don't have md5sums
        my $path = $self->{md5pool} . '/' . $md5;
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
@@ -171,9 +171,6 @@ sub removed_file {
                warn "# chown $id $gid $path";
        }
 
-       $self->md5sum($data)->out( $data->{file} );
-       $self->md5sum_close($data);
-
        $self->api->append_meta('md5sum', $user, 'delete', $data->{file} );
 }
 
@@ -254,8 +251,6 @@ sub init_pid_login {
 sub cleanup_pid {
        my ( $self, $pid ) = @_;
 
-       $self->md5sum_close( $self->{pid}->{$pid} );
-
        delete $self->{pid}->{$pid};
        warn "removed $pid";
 }
@@ -358,8 +353,7 @@ sub md5pool {
                warn "dedup +++ $md5 $path";
        }
 
-       $self->md5sum($data)->put( $data->{file} => $md5 );
-       $self->md5sum_close($data);
+       $self->md5_set( $path => $md5 );
 
        $self->api->append_meta('md5sum', $data->{login}, $md5, $data->{file} );
 }
index d6ac13f..dcc6eb9 100755 (executable)
@@ -2,22 +2,19 @@
 use strict;
 use warnings;
 
-use Test::More tests => 5;
+use Test::More tests => 3;
 use Data::Dump qw(dump);
+use File::Slurp;
 
 use lib 'lib';
 
 use_ok 'CloudStore::MD5sum';
 
-my $login = $ENV{LOGIN} || 'u2002';
+my $file = '/tmp/test.attr';
+write_file $file => "test\n";
+my $md5 = rand(1234567890);
 
-ok my $o = CloudStore::MD5sum->new, 'new';
+ok CloudStore::MD5sum->md5_set($file => $md5), 'md5_set';
 
-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';
+cmp_ok CloudStore::MD5sum->md5_get($file), 'eq', $md5, 'md5_get';
 
index e0a6845..2e101d1 100755 (executable)
@@ -15,7 +15,7 @@ sub upload {
 
 mkdir('/tmp/client');
 
-ok write_file('/tmp/client/one', "one");
+ok write_file('/tmp/client/one', "one" . time() );
 
 diag "reload rsync config with invalid username";
 upload('reload-config' => '/tmp/client/one');