Skip to content

Commit

Permalink
Merge branch 'master' of git://github.com/ohmforce/erls3
Browse files Browse the repository at this point in the history
  • Loading branch information
cstar committed Sep 30, 2010
2 parents 2161224 + 6a90488 commit 16f675a
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 20 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -13,4 +13,5 @@ ebin/erls3server.beam
ebin/erls3sup.beam
ebin/erls3util.beam
ebin/file_events.beam
ebin/console_events.beam
.eunit
Binary file modified rebar
Binary file not shown.
2 changes: 1 addition & 1 deletion rebar.config
@@ -1,3 +1,3 @@
{deps, [
{ibrowse, ".*", {git, "git://github.com/cmullaparthi/ibrowse.git", "master"}}
{ibrowse, "1\\.6\\.0", {git, "git://github.com/abhay/ibrowse.git", "master"}}
]}.
70 changes: 55 additions & 15 deletions src/erls3.erl
Expand Up @@ -14,7 +14,7 @@
%% External exports
%%--------------------------------------------------------------------
-export([
start/0,
start/0,
start/2,
shutdown/0,
stop/1
Expand All @@ -35,9 +35,9 @@
read_to_file/3,
set_versioning/2,
get_versioning/1,
copy/4 ]).


copy/4,
is_empty_bucket/1,
purge_bucket/1 ]).

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
Expand Down Expand Up @@ -105,6 +105,7 @@ set_versioning(Bucket, Enable)->
%error_logger:info_report([{body, B}, {header, Header}])
ok
end}).

get_versioning(Bucket)->
case read_object(Bucket, "?versioning") of
{ok, {Body, _Header}}->
Expand All @@ -123,56 +124,71 @@ get_versioning(Bucket)->
Error ->
Error
end.


%% @doc Create a bucket
create_bucket (Name) ->
call({put, Name} ).

%% @doc Delete an empty bucket
delete_bucket (Name) ->
call({delete, Name} ).

%% @doc List all buckets
list_buckets () ->
call({listbuckets}).

%% @doc Write content of a file
write_from_file(Bucket, Key, Filename, ContentType, Metadata)->
call({from_file, Bucket, Key,Filename, ContentType, Metadata}).

%% @doc Read content to file
read_to_file(Bucket, Key, Filename)->
call({to_file, Bucket, Key, Filename}).


%% @doc Read a serialized erlang data
read_term(Bucket, Key)->
case read_object (Bucket, Key) of
{ok, {B, H}} -> {ok, {binary_to_term(B), H}};
E -> E
end.

%% @doc Write serialized erlang data
write_term(Bucket, Key, Term)->
write_object (Bucket, Key,term_to_binary(Term), "application/poet", []).

write_object(Bucket, Key, Data, ContentType)->
write_object (Bucket, Key, Data, ContentType, []).

%% @doc Write object
write_object (Bucket, Key, Data, ContentType, Metadata) ->
call({put, Bucket, Key, Data, ContentType, Metadata}).

read_term(Bucket, Key)->
case read_object (Bucket, Key) of
{ok, {B, H}} -> {ok, {binary_to_term(B), H}};
E -> E
end.

%% @doc Copy data to an other place
copy(SrcBucket, SrcKey, DestBucket, DestKey)->
call({copy, DestBucket, DestKey,[{"x-amz-copy-source", "/"++SrcBucket++"/" ++ SrcKey}]}).

%% @doc Fetch metadata of an object
head(Bucket, Key)->
call({head, Bucket, Key}).

%% @doc Read an object
read_object (Bucket, Key, Etag) ->
call({get, Bucket, Key, Etag}).

read_object (Bucket, Key) ->
call({get, Bucket, Key}).

%% @doc Delete and object
delete_object (Bucket, Key) ->
call({delete, Bucket, Key}).


% Gets objects in // from S3.
%% @doc Gets objects in // from S3.
%% option example: [{delimiter, "/"},{maxkeys,10},{prefix,"/foo"}]
get_objects(Bucket, Options)->
get_objects(Bucket, Options, fun(_B, Obj)-> Obj end).

%% @doc Get objects with a filter
% Fun = fun(Bucket, {Key, Content, Headers})
get_objects(Bucket, Options, Fun)->
{ok, {Objects, _}} = list_objects(Bucket, Options),
Expand All @@ -183,12 +199,22 @@ get_object(#object_info{key=Key}, Bucket, Fun)->
{ok, Obj} -> Fun(Bucket, Obj);
Error -> Error
end.

%% @doc List objects of a bucket
%% option example: [{delimiter, "/"},{maxkeys,10},{prefix,"/foo"}]
list_objects (Bucket, Options ) ->
call({list, Bucket, Options }).

list_objects (Bucket) ->
list_objects( Bucket, [] ).

%% @doc Is this bucket empty?
is_empty_bucket(Bucket) ->
case list_objects(Bucket, [{delimiter, "/"},{maxkeys,1},{prefix,"/"}]) of
{ok,{[], _}} -> true;
_ -> false
end.


% Sample policy file,
% See : http://docs.amazonwebservices.com/AmazonS3/latest/index.html?HTTPPOSTForms.html
Expand Down Expand Up @@ -221,9 +247,10 @@ stop(_State) ->

call(M)->
call(M, 0).

%% @doc Ask something to S3
call(_M, ?MAX_RETRIES)->
{error, max_retries_reached};

call(M, Retries)->
Pid = erls3sup:get_random_pid(),
case gen_server:call(Pid, M, infinity) of
Expand All @@ -232,7 +259,7 @@ call(M, Retries)->
timer:sleep(Sleep),
call(M, Retries + 1);
{timeout, _} ->
Sleep = random:uniform(trunc(math:pow(4, Retries)*100)),
Sleep = random:uniform(trunc(math:pow(4, Retries)*100)),
timer:sleep(Sleep),
call(M, Retries + 1);
R -> R
Expand Down Expand Up @@ -280,6 +307,19 @@ wait_result() ->
notify(Event)->
gen_event:notify(erls3_events, Event).

%purge all node in a bucket
purge_bucket(Bucket) ->
{ok, {Nodes, _Token_follow}} = erls3:list_objects(Bucket),
%error_logger:warning_report(Nodes),
vaccum(Bucket, Nodes).

vaccum(_Bucket, []) ->
ok;
vaccum(Bucket, [#object_info{key = Key} | Rest]) ->
erls3:delete_object(Bucket, Key),
vaccum(Bucket, Rest).


-ifdef(EUNIT).

erls3_test()->
Expand Down
9 changes: 8 additions & 1 deletion src/erls3util.erl
@@ -1,5 +1,12 @@
-module(erls3util).
-export([collapse/1, string_join/2, join/1,filter_keyset/2, string_value/1, unix_time/1, url_encode/1]).
-export([
collapse/1,
string_join/2,
join/1,
filter_keyset/2,
string_value/1,
unix_time/1,
url_encode/1]).
-include("erls3.hrl").
-include_lib("xmerl/include/xmerl.hrl").

Expand Down
12 changes: 9 additions & 3 deletions test/erls3_tests.erl
Expand Up @@ -7,10 +7,16 @@

start() ->
erls3:start(),
erls3:clean_bucket(?BUCKET),
?assertEqual(true, erls3:is_empty_bucket(?BUCKET)),
{ok, ok} = erls3:create_bucket(?BUCKET).

connection_test() ->
erls3:head(?BUCKET, "").
%connection_test() ->
% erls3:head(?BUCKET, "").

write_test() ->
erls3:write_object(?BUCKET, "test.txt", "hello world", "plain/text", [{"x-amz-beuha", "aussi"}]).
%{error, not_found, _} = erls3:write_object("this is not a bucket", "test.txt", "hello world", "plain/text", [{"x-amz-beuha", "aussi"}]),
{ok, Hash} = erls3:write_object(?BUCKET, "test.txt", "hello world", "plain/text", [{"x-amz-beuha", "aussi"}]).

%shutdown() -> erls3:clean_bucket(?BUCKET).

0 comments on commit 16f675a

Please sign in to comment.