X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStorage%2FBase%2FWithChecksum.pm;h=ffa34b24030f402dd92d898bafb0794ce6c6b8ee;hb=98ae09f003486b7c70661507771598c6101f23be;hp=2f327876530d5211dd1e94d6a88249c02fe81763;hpb=c4a322ec86aff913da11191ac43d3edfbc403ab5;p=gitmo%2FMooseX-Storage.git diff --git a/lib/MooseX/Storage/Base/WithChecksum.pm b/lib/MooseX/Storage/Base/WithChecksum.pm index 2f32787..ffa34b2 100644 --- a/lib/MooseX/Storage/Base/WithChecksum.pm +++ b/lib/MooseX/Storage/Base/WithChecksum.pm @@ -2,55 +2,68 @@ package MooseX::Storage::Base::WithChecksum; use Moose::Role; -use Digest::MD5 ('md5_hex'); -use Data::Dumper (); +use Digest (); +use Storable (); use MooseX::Storage::Engine; our $VERSION = '0.01'; sub pack { - my ($self, $salt) = @_; + my ($self, @args ) = @_; + my $e = MooseX::Storage::Engine->new( object => $self ); - my $collapsed = $e->collapse_object; - - # create checksum - - local $Data::Dumper::Sortkeys = 1; - my $dumped = Data::Dumper::Dumper($collapsed); - #warn $dumped; - - $salt ||= $dumped; + my $collapsed = $e->collapse_object; - $collapsed->{checksum} = md5_hex($dumped, $salt); + $collapsed->{__DIGEST__} = $self->_digest_packed($collapsed, @args); return $collapsed; } sub unpack { - my ($class, $data, $salt) = @_; + my ($class, $data, @args) = @_; # check checksum on data - my $old_checksum = $data->{checksum}; - delete $data->{checksum}; - - local $Data::Dumper::Sortkeys = 1; - my $dumped = Data::Dumper::Dumper($data); - - #warn $dumped; - - $salt ||= $dumped; - - my $checksum = md5_hex($dumped, $salt); + my $old_checksum = $data->{__DIGEST__}; + delete $data->{__DIGEST__}; + my $checksum = $class->_digest_packed($data, @args); + ($checksum eq $old_checksum) - || confess "Bad Checksum got=($checksum) expected=($data->{checksum})"; + || confess "Bad Checksum got=($checksum) expected=($old_checksum)"; my $e = MooseX::Storage::Engine->new(class => $class); $class->new($e->expand_object($data)); } + +sub _digest_packed { + my ( $self, $collapsed, @args ) = @_; + + my $d = shift @args; + + if ( ref $d ) { + if ( $d->can("clone") ) { + $d = $d->clone; + } elsif ( $d->can("reset") ) { + $d->reset; + } else { + die "Can't clone or reset digest object: $d"; + } + } else { + $d = Digest->new($d || "SHA1", @args); + } + + { + local $Storable::canonical = 1; + $d->add( Storable::nfreeze($collapsed) ); + } + + return $d->hexdigest; +} + + 1; __END__