1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
|