Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Add support for delete_key_multiple #7

Closed
wants to merge 1 commit into from

2 participants

@rustyconover
Collaborator

Amazon's S3 API allows deletion of 1,000 keys per delete, which is very fast compared
to deleting one key per call. This code add support to it by adding delete_key_multiple to the bucket object.

Rusty Conover Add support for multiple delete call at S3.
API allows deletion of 1,000 keys per call, which is very fast compared
to deleting one key per call.
d886388
@pfig
Owner

Functionality added by the multipart upload patch I've just merged in.

@pfig pfig closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 26, 2012
  1. Add support for multiple delete call at S3.

    Rusty Conover authored
    API allows deletion of 1,000 keys per call, which is very fast compared
    to deleting one key per call.
This page is out of date. Refresh to see the latest.
Showing with 80 additions and 0 deletions.
  1. +80 −0 lib/Net/Amazon/S3/Request/DeleteMultipleObjects.pm
View
80 lib/Net/Amazon/S3/Request/DeleteMultipleObjects.pm
@@ -0,0 +1,80 @@
+package Net::Amazon::S3::Request::DeleteMultipleObjects;
+use Moose 0.85;
+use Moose::Util::TypeConstraints;
+use XML::LibXML;
+use Digest::MD5;
+use MIME::Base64;
+extends 'Net::Amazon::S3::Request';
+
+has 'bucket' => ( is => 'ro', isa => 'BucketName', required => 1 );
+has 'keys' => ( is => 'ro', isa => 'ArrayRef[Str]', required => 1 );
+__PACKAGE__->meta->make_immutable;
+
+sub http_request {
+ my $self = shift;
+
+
+ my $doc = XML::LibXML::Document->new("1.0", 'utf-8');
+ my $docroot = $doc->createElement("Delete");
+ $doc->setDocumentElement($docroot);
+
+ my $quiet_node = $doc->createElement("Quiet");
+ $quiet_node->appendChild($doc->createTextNode('false'));
+ $docroot->appendChild($quiet_node);
+
+ foreach my $key (@{$self->keys}) {
+ my $n = $doc->createElement('Object');
+ my $k = $doc->createElement('Key');
+ $k->appendChild($doc->createTextNode($key));
+ $n->appendChild($k);
+ $docroot->appendChild($n);
+ }
+
+ my $delete_content = $doc->toString(1);
+
+
+ my $md5_hex = Digest::MD5::md5_hex($delete_content);
+ my $md5 = pack( 'H*', $md5_hex );
+ my $md5_base64 = encode_base64($md5);
+ chomp $md5_base64;
+
+ my $conf = {
+ 'Content-MD5' => $md5_base64,
+ 'Content-Length' => length($delete_content),
+ };
+
+ return Net::Amazon::S3::HTTPRequest->new(
+ s3 => $self->s3,
+ method => 'POST',
+ path => $self->_uri() . "?delete",
+ headers => $conf,
+ content => $delete_content,
+ )->http_request;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Amazon::S3::Request::DeleteMultipleObjects - An internal class to delete multiple objects
+
+=head1 SYNOPSIS
+
+ my $http_request = Net::Amazon::S3::Request::DeleteMultipleObjects->new(
+ s3 => $s3,
+ bucket => $bucket,
+ keys => $keys,
+ )->http_request;
+
+=head1 DESCRIPTION
+
+This module deletes multiple objects.
+
+=head1 METHODS
+
+=head2 http_request
+
+This method returns a HTTP::Request object.
+
Something went wrong with that request. Please try again.