summary refs log tree commit diff
path: root/lib/Net/Riak/Role/REST/Bucket.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Net/Riak/Role/REST/Bucket.pm')
-rw-r--r--lib/Net/Riak/Role/REST/Bucket.pm73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/Net/Riak/Role/REST/Bucket.pm b/lib/Net/Riak/Role/REST/Bucket.pm
new file mode 100644
index 0000000..8a037c0
--- /dev/null
+++ b/lib/Net/Riak/Role/REST/Bucket.pm
@@ -0,0 +1,73 @@
+package Net::Riak::Role::REST::Bucket;
+
+use Moose::Role;
+use JSON;
+
+sub get_properties {
+    my ($self, $name, $params) = @_;
+
+    # Callbacks require stream mode
+    $params->{keys}  = 'stream' if $params->{cb};
+
+    $params->{props} = 'true'  unless exists $params->{props};
+    $params->{keys}  = 'false' unless exists $params->{keys};
+
+    my $request = $self->new_request(
+        'GET', [$self->prefix, $name], $params
+    );
+
+    my $response = $self->send_request($request);
+
+    unless ($response->is_success) {
+        die "Error getting bucket properties: ".$response->status_line."\n";
+    }
+
+    if ($params->{keys} ne 'stream') {
+        return JSON::decode_json($response->content);
+    }
+
+    # In streaming mode, aggregate keys from the multiple returned chunk objects
+    else {
+        my $json = JSON->new;
+        my $props = $json->incr_parse($response->content);
+        if ($params->{cb}) {
+            while (defined(my $obj = $json->incr_parse)) {
+                $params->{cb}->($_) foreach @{$obj->{keys}};
+            }
+            return %$props ? { props => $props } : {};
+        }
+        else {
+            my @keys = map { $_->{keys} && ref $_->{keys} eq 'ARRAY' ? @{$_->{keys}} : () }
+                $json->incr_parse;
+            return { props => $props, keys => \@keys };
+        }
+    }
+}
+
+sub set_properties {
+    my ($self, $bucket, $props) = @_;
+
+    my $request = $self->new_request(
+        'PUT', [$self->prefix, $bucket->name]
+    );
+
+    $request->header('Content-Type' => $bucket->content_type);
+    $request->content(JSON::encode_json({props => $props}));
+
+    my $response = $self->send_request($request);
+    unless ($response->is_success) {
+        die "Error setting bucket properties: ".$response->status_line."\n";
+    }
+}
+
+sub get_keys {
+    my ($self, $bucket, $params) = @_;
+
+    my $key_mode = delete($params->{stream}) ? 'stream' : 'true';
+    $params = { props => 'false', keys => $key_mode, %$params };
+    my $properties = $self->get_properties($bucket, $params);
+
+    return $properties->{keys};
+}
+
+1;