summaryrefslogblamecommitdiff
path: root/lib/KiokuDB/Backend/Riak.pm
blob: 35af85cb888e1e991aa89560aa2adbdd314f2f1a (plain) (tree)
1
2
3
4

                               
         
          












                                       

                      







































































































                                                                       
  
 



           
                                                    






                             
                                                                         


             
                                           




               



                              



                                                                    
package KiokuDB::Backend::Riak;

use Carp;
use Moose;
use JSON::XS;
use AnyEvent::Riak;
use Try::Tiny;

use namespace::clean -except => 'meta';
use Data::Stream::Bulk::Util qw(bulk);

with qw(
    KiokuDB::Backend
    KiokuDB::Backend::Role::Clear
    KiokuDB::Backend::Serialize::JSPON
);

our $VERSION = '0.01';

has bucket => (isa => 'Str', is => 'rw');

has db => (
    isa => "AnyEvent::Riak",
    is => "ro",
    handles => [qw(document)],
);

sub new_from_dsn_params {
    my ( $self, %args ) = @_;

    my $host = delete $args{host};
    my $path = delete $args{path};

    $self->bucket( delete $args{bucket} );

    croak "bucket is required" if !$self->bucket;
    my $db = AnyEvent::Riak->new( { 'host' => $host, path => $path } );
    $self->new( %args, db => $db );
}

sub get {
    my ( $self, @ids ) = @_;
    return map {$self->get_entry($_)} @ids;
}

sub get_entry {
    my ($self, $id) = @_;
    my $entry;
    try {
        my $obj = $self->db->fetch($self->bucket, $id)->recv;
        $entry = $self->deserialize($obj->{object});
    };
    return $entry;
}

sub deserialize {
    my ( $self, $doc ) = @_;
    my %doc = %{ $doc };
    return $self->expand_jspon(\%doc, backend_data => $doc );
}

sub exists {
    my ( $self, @ids ) = @_;

    my @exists;

    foreach my $id (@ids) {
        my $res;
        try {
            $res = $self->db->fetch($self->bucket, $_)->recv;
            push @exists, 1
        }catch{
            push @exists, 0;
        };
    }
    return @exists;
}

sub delete {
    my ($self, @ids_or_entries) = @_;
    my @ids = map { ref($_) ? $_->id : $_ } @ids_or_entries;
    $self->db->delete($self->bucket, $_)->recv foreach (@ids);
}

sub clear {
    my ($self, ) = @_;
    try {
        my $res = $self->db->list_bucket($self->bucket);
        return $self->delete(@{$res->{keys}});
    };
}

sub all_entries {
    my ($self) = @_;
    try {
        my $res = $self->db->list_bucket($self->bucket);
        return $self->get(@{$res->{keys}});
    };
}

sub insert {
    my ($self, @entries) = @_;
    for my $entry (@entries) {
        $self->insert_entry($entry);
    }
    return;
}

sub insert_entry {
    my ( $self, $entry ) = @_;
    my $check;
    try {
        my $res = $self->db->store(
            {
                bucket => $self->bucket,
                key    => $entry->id,
                object => $self->collapse_jspon($entry),
                links  => []
            }
        )->recv;
    };
}

1;

__END__

=head1 NAME

KiokuDB::Backend::Riak - Riak backend for L<KiokuDB>

=head1 SYNOPSIS

  use KiokuDB::Backend::Riak;

=head1 DESCRIPTION

This backend provides L<KiokuDB> support for Riak using <AnyEvent::Riak>.

=head1 AUTHOR

franck cuny E<lt>franck@lumberjaph.netE<gt>

=head1 SEE ALSO

=head1 LICENSE

Copyright 2009 by linkfluence.

L<http://linkfluence.net>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut