--- nfo/perl/libs/Data/Transfer/Sync/Compare/Checksum.pm 2003/05/13 08:19:00 1.3 +++ nfo/perl/libs/Data/Transfer/Sync/Compare/Checksum.pm 2004/05/11 19:43:02 1.5 @@ -1,4 +1,4 @@ -## $Id: Checksum.pm,v 1.3 2003/05/13 08:19:00 joko Exp $ +## $Id: Checksum.pm,v 1.5 2004/05/11 19:43:02 joko Exp $ ## ## Copyright (c) 2002 Andreas Motl ## @@ -6,6 +6,12 @@ ## ## ---------------------------------------------------------------------------------------- ## $Log: Checksum.pm,v $ +## Revision 1.5 2004/05/11 19:43:02 joko +## don't use File::RsyncP::Digest on win32 +## +## Revision 1.4 2004/05/06 12:53:07 jonen +## + added use of File::RsycP::digest +## ## Revision 1.3 2003/05/13 08:19:00 joko ## switched to crc32 ## @@ -23,6 +29,7 @@ =head1 Todo o Data::Transfer::Sync::Compare::Slot using Compare::Struct + o Load checksum algorithm on demand, do some negotiation =cut @@ -33,13 +40,19 @@ use mixin::with qw( Data::Transfer::Sync ); - +use shortcuts qw( RUNNING_IN_HELL ); use Data::Dumper; # TODO: Load these appropriatly at runtime. use Digest::MD5 qw( md5 md5_hex md5_base64 ); use String::CRC32; +# don't use File::RsyncP::Digest on win32 +# TODO: enhance here! (e.g. negotiate proper checksum-algorithm first, apply afterwards) +if (not RUNNING_IN_HELL()) { + eval "use File::RsyncP::Digest;"; +} + # get logger instance my $logger = Log::Dispatch::Config->instance; @@ -74,13 +87,24 @@ # with small payloads already in ranges of hundreds of items/rows!!! # Try to avoid it or try to use it only for payloads greater than, hmmm, let's say 30 chars? # (we had about 15 chars average per item (row)) - # Possible (generic) solution: Just generate checksum, if length(checksum(payload)) < payload + # Possible (generic) solution: Just generate checksum, if length(checksum(payload)) < length(payload) #$self->{node}->{$descent}->{checksum} = DBI::hash($dump, 1); - # 3. good ol' crc32??? - $self->{node}->{$descent}->{checksum} = crc32($dump); + # 3. good old crc32??? + #$self->{node}->{$descent}->{checksum} = crc32($dump); - # 4. some more modern Digest::SHA1 or similar? + # 4. File::RsyncP::Digest - Perl interface to rsync message digest algorithms + if (not RUNNING_IN_HELL()) { + my $rsDigest = new File::RsyncP::Digest; + $rsDigest->add($dump); + my $digest = $rsDigest->digest(); + $self->{node}->{$descent}->{checksum} = unpack("H*", $digest); + + } else { # fallback to Digest::MD5 on win32 + $self->{node}->{$descent}->{checksum} = md5_base64($dump) . '=='; + } + + # 5. some more modern Digest::SHA1 or similar? # signal good return 1;