From cbce71ec709d6f74f61887e8ef94a2f4214f0241 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 31 May 2016 10:01:04 -0400 Subject: [PATCH] add delete_all_objects for handling an unlimited number of items to delete (#164) --- lib/ex_aws/s3/client.ex | 7 +++++++ lib/ex_aws/s3/impl.ex | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/ex_aws/s3/client.ex b/lib/ex_aws/s3/client.ex index c69b0c9f..2c097e80 100644 --- a/lib/ex_aws/s3/client.ex +++ b/lib/ex_aws/s3/client.ex @@ -225,6 +225,13 @@ defmodule ExAws.S3.Client do bucket :: binary, objects :: [binary | {binary, binary}, ...], opts :: [quiet: true]):: ExAws.Request.response_t + defcallback delete_all_objects( + bucket :: binary, + objects :: [binary | {binary, binary}, ...]):: {:ok, [ExAws.Request.success_content, ...]} | ExAws.Request.error_t + defcallback delete_all_objects( + bucket :: binary, + objects :: [binary | {binary, binary}, ...], opts :: [quiet: true]):: {:ok, [ExAws.Request.success_content, ...]} | ExAws.Request.error_t + @type get_object_response_opts :: [ {:content_language, binary} | {:expires, binary} diff --git a/lib/ex_aws/s3/impl.ex b/lib/ex_aws/s3/impl.ex index f48a49ff..3ce3bda5 100644 --- a/lib/ex_aws/s3/impl.ex +++ b/lib/ex_aws/s3/impl.ex @@ -234,6 +234,20 @@ defmodule ExAws.S3.Impl do request(client, :post, bucket, "/?delete", body: body_binary, headers: %{"content-md5" => content_md5}) end + def delete_all_objects(client, bucket, objects, opts \\ []) do + do_delete_all(client, bucket, objects, opts, []) + end + + defp do_delete_all(_client, _bucket, [], _opts, acc) do + {:ok, Enum.reverse(acc)} + end + defp do_delete_all(client, bucket, objects, opts, acc) do + {objects, rest} = Enum.split(objects, 1000) + with {:ok, result} <- delete_multiple_objects(client, bucket, objects, opts) do + do_delete_all(client, bucket, rest, opts, [result | acc]) + end + end + @response_params [:content_type, :content_language, :expires, :cache_control, :content_disposition, :content_encoding] @request_headers [:range, :if_modified_since, :if_unmodified_since, :if_match, :if_none_match] def get_object(client, bucket, object, opts \\ []) do