Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

requires methods to do simple tasks

  • Loading branch information...
commit 4a025d943c6a73c2590eed3a6aebdf3d5bd7f28a 1 parent ec1e256
@franckcuny franckcuny authored
Showing with 123 additions and 1 deletion.
  1. +123 −1 lib/AnyEvent/Riak.pm
View
124 lib/AnyEvent/Riak.pm
@@ -1,8 +1,130 @@
package AnyEvent::Riak;
-use Moose;
+use strict;
+use Carp;
+use URI;
+use JSON::XS;
+use AnyEvent;
+use AnyEvent::HTTP;
+
our $VERSION = '0.01';
+sub new {
+ my ( $class, %args ) = @_;
+
+ my $host = delete $args{host} || 'http://127.0.0.1:8098';
+ my $path = delete $args{path} || 'jiak';
+
+ bless {
+ host => $host,
+ path => $path,
+ %args,
+ }, $class;
+}
+
+sub set_bucket {
+ my ( $self, $bucket, $schema ) = @_;
+
+ carp "your schema is missing allowed_fields"
+ if ( !exists $schema->{allowed_fields} );
+
+ if ( !exists $schema->{required_fields} ) {
+ $schema->{required_fields} = [];
+ }
+ if ( !exists $schema->{read_mask} ) {
+ $schema->{read_mask} = $schema->{allowed_fields};
+ }
+ if ( !exists $schema->{write_mask} ) {
+ $schema->{write_mask} = $schema->{read_mask};
+ }
+
+ $self->_request('PUT', $self->_build_uri([$bucket]), '204',
+ encode_json{schema => $schema});
+}
+
+sub list_bucket {
+ my ( $self, $bucket ) = @_;
+ return $self->_request('GET', $self->_build_uri([$bucket]), '200');
+}
+
+sub fetch {
+ my ($self, $bucket, $key) = @_;
+ return $self->_request('GET', $self->_build_uri([$bucket, $key]), '200');
+}
+
+sub store {
+ my ( $self, $object ) = @_;
+
+ my $bucket = $object->{bucket};
+ my $key = $object->{key};
+ return $self->_request(
+ 'PUT',
+ $self->_build_uri(
+ [ $bucket, $key ],
+ {
+ dw => 2,
+ returnbody => 'true'
+ }
+ ),
+ '200',
+ encode_json $object);
+}
+
+sub fetch {
+ my ( $self, $bucket, $key, ) = @_;
+
+ return $self->_request( 'GET',
+ $self->_build_uri( [ $bucket, $key ], { r => 2 } ), '200' );
+}
+
+sub delete {
+ my ( $self, $bucket, $key ) = @_;
+
+ return $self->_request( 'DELETE',
+ $self->_build_uri( [ $bucket, $key ], { dw => 2 } ), 204 );
+}
+
+sub _build_uri {
+ my ( $self, $path, $query ) = @_;
+ my $uri = URI->new( $self->{host} );
+ $uri->path( $self->{path} . "/" . join( "/", @$path ) );
+ $uri->query_form(%$query) if $query;
+ return $uri->as_string;
+}
+
+sub _request {
+ my ( $self, $method, $uri, $expected, $body ) = @_;
+ my $cv = AnyEvent->condvar;
+ my $cb = sub {
+ my ( $body, $headers ) = @_;
+ if ( $headers->{Status} == $expected ) {
+ $body
+ ? return $cv->send( decode_json($body) )
+ : return $cv->send(1);
+ }
+ else {
+ return $cv->send(
+ $headers->{Status} . ' : ' . $headers->{Reason} );
+ }
+ };
+ if ($body) {
+ http_request(
+ $method => $uri,
+ headers => { 'Content-Type' => 'application/json', },
+ body => $body,
+ $cb
+ );
+ }
+ else {
+ http_request(
+ $method => $uri,
+ headers => { 'Content-Type' => 'application/json', },
+ $cb
+ );
+ }
+ $cv;
+}
+
1;
__END__
Please sign in to comment.
Something went wrong with that request. Please try again.