summary refs log tree commit diff
diff options
context:
space:
mode:
authorSimon Wistow <simon@thegestalt.org>2011-01-28 11:13:18 -0800
committerSimon Wistow <simon@thegestalt.org>2011-01-28 11:13:18 -0800
commitc48cbdea86f8bd2afe218584c02e527a201c29f7 (patch)
tree06fb7c6bbb82125102c745440bf0e728cc1e099c
parentupdate changes (diff)
downloadnet-riak-c48cbdea86f8bd2afe218584c02e527a201c29f7.tar.gz
Allow POSTing of objects to get an autogenerated key
-rw-r--r--lib/Net/Riak/Object.pm25
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/Net/Riak/Object.pm b/lib/Net/Riak/Object.pm
index e84ad6d..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))