AnyEvent-Net-Amazon-S3
view release on metacpan or search on metacpan
examples/backup_cpan.pl view on Meta::CPAN
#!/home/acme/bin/perl
use strict;
use warnings;
use lib 'lib';
use Data::Stream::Bulk::Path::Class;
use Net::Amazon::S3;
use Perl6::Say;
use Path::Class;
use Set::Object;
use Term::ProgressBar::Simple;
use List::Util qw(sum);
use Digest::MD5::File qw(file_md5_hex);
use BerkeleyDB::Manager;
use Cwd;
use Config;
my $m = BerkeleyDB::Manager->new(
home => Path::Class::Dir->new(cwd),
db_class => 'BerkeleyDB::Hash',
create => 1,
);
my $db = $m->open_db( file => 'md5_cache' );
my $s3 = Net::Amazon::S3->new(
aws_access_key_id => 'XXX',
aws_secret_access_key => 'XXX',
retry => 1,
);
my $client = Net::Amazon::S3::Client->new( s3 => $s3 );
my $bucket = $client->bucket( name => 'minicpan' );
my $root = '/home/acme/Public/minicpan/';
my $file_stream = Data::Stream::Bulk::Path::Class->new(
dir => Path::Class::Dir->new($root),
only_files => 1,
);
my %files;
my $file_set = Set::Object->new();
until ( $file_stream->is_done ) {
foreach my $filename ( $file_stream->items ) {
my $key = $filename->relative($root)->stringify;
#[rootname]path/to/file.txt:<ctime>,<mtime>,<size>,<inodenum>
my $stat = $filename->stat;
my $ctime = $stat->ctime;
my $mtime = $stat->mtime;
my $size = $stat->size;
my $inodenum = $stat->ino;
my $cachekey = "$key:$ctime,$mtime,$size,$inodenum";
$db->db_get( $cachekey, my $md5_hex );
if ($md5_hex) {
#say "hit $cachekey $md5hex";
} else {
$md5_hex = file_md5_hex($filename)
|| die "Failed to find MD5 for $filename";
$m->txn_do(
sub {
$db->db_put( $cachekey, $md5_hex );
}
( run in 0.928 second using v1.01-cache-2.11-cpan-39bf76dae61 )