diff options
author | Robin Edwards <robin.ge@gmail.com> | 2011-01-28 20:04:02 +0000 |
---|---|---|
committer | Robin Edwards <robin.ge@gmail.com> | 2011-01-28 20:04:02 +0000 |
commit | 1812a447ca0ac226d2e4db78d11ea07e1e043451 (patch) | |
tree | 9e648e3b16f3ea78492c5dd7ab0f4f388c6273c9 /lib/Net/Riak | |
parent | removed response string (diff) | |
parent | Added simons changes (diff) | |
download | net-riak-1812a447ca0ac226d2e4db78d11ea07e1e043451.tar.gz |
Merge branch 'master' of github.com:franckcuny/net-riak
Diffstat (limited to 'lib/Net/Riak')
-rw-r--r-- | lib/Net/Riak/Bucket.pm | 7 | ||||
-rw-r--r-- | lib/Net/Riak/Object.pm | 29 |
2 files changed, 25 insertions, 11 deletions
diff --git a/lib/Net/Riak/Bucket.pm b/lib/Net/Riak/Bucket.pm index 0e7aa63..2bc334e 100644 --- a/lib/Net/Riak/Bucket.pm +++ b/lib/Net/Riak/Bucket.pm @@ -144,13 +144,14 @@ sub set_properties { sub new_object { my ($self, $key, $data, @args) = @_; - my $object = Net::Riak::Object->new( - key => $key, + my %opts = ( data => $data, bucket => $self, client => $self->client, @args, ); + $opts{key} = $key if defined $key; + my $object = Net::Riak::Object->new(%opts); $object; } @@ -214,6 +215,8 @@ DW value setting for this client (default 2) Create a new L<Net::Riak::Object> object. Additional Object constructor arguments can be passed after $data. If $data is a reference and no explicit Object content_type is given in @args, the data will be serialised and stored as JSON. +If $key is passed as C<undef> then an autogenerated key will be provided by Riak. + =item get my $obj = $bucket->get($key, [$r]); diff --git a/lib/Net/Riak/Object.pm b/lib/Net/Riak/Object.pm index 0d2aef7..5efe5f9 100644 --- a/lib/Net/Riak/Object.pm +++ b/lib/Net/Riak/Object.pm @@ -12,7 +12,7 @@ with 'Net::Riak::Role::Replica' => {keys => [qw/r w dw/]}; with 'Net::Riak::Role::Base' => {classes => [{name => 'bucket', required => 1}, {name => 'client', required => 1}]}; -has key => (is => 'rw', isa => 'Str', required => 1); +has key => (is => 'rw', isa => 'Str', required => 0); has status => (is => 'rw', isa => 'Int'); has exists => (is => 'rw', isa => 'Bool', default => 0,); has data => (is => 'rw', isa => 'Any', clearer => '_clear_data'); @@ -59,10 +59,14 @@ sub store { $dw ||= $self->dw; my $params = {returnbody => 'true', w => $w, dw => $dw}; + my $path = [$self->client->prefix, $self->bucket->name]; + my $method = 'POST'; + if (defined $self->key) { + push @$path, $self->key; + $method = 'PUT'; + } - my $request = - $self->client->new_request('PUT', - [$self->client->prefix, $self->bucket->name, $self->key], $params); + my $request = $self->client->new_request($method, $path, $params); $request->header('X-Riak-ClientID' => $self->client->client_id); $request->header('Content-Type' => $self->content_type); @@ -83,7 +87,7 @@ sub store { } my $response = $self->client->send_request($request); - $self->populate($response, [200, 204, 300]); + $self->populate($response, [200, 201, 204, 300]); $self; } @@ -164,8 +168,15 @@ sub populate { shift @siblings; $self->siblings(\@siblings); } - - if ($status == 200) { + + if ($status == 201) { + my $location = $http_response->header('location'); + my ($key) = ($location =~ m!/([^/]+)$!); + $self->key($key); + } + + + if ($status == 200 || $status == 201) { $self->content_type($http_response->content_type) if $http_response->content_type; $self->data(JSON::decode_json($self->data)) @@ -225,8 +236,8 @@ sub _build_link { blessed $obj && $obj->isa('Net::Riak::Link') ? $obj : Net::Riak::Link->new( - bucket => $self->bucket, - key => $self->key, + bucket => $obj->bucket, + key => $obj->key, tag => $tag || $self->bucket->name, ); } |