The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Net::FleetDB;
use warnings;
use strict;
use Carp qw(croak);
use IO::Socket::INET;
use JSON::XS::VersionOneAndTwo;
our $VERSION = '0.33';

sub new {
    my ( $class, %args ) = @_;

    my $host = delete $args{host} || '127.0.0.1';
    my $port = delete $args{port} || 3400;

    my $socket = IO::Socket::INET->new(
        PeerHost => $host,
        PeerPort => $port,
        Timeout  => 60
    ) || die "Error connecting to $host:$port: $!";

    my $self = bless {
        host   => $host,
        port   => $port,
        socket => $socket,
    }, $class;
    return $self;
}

sub query {
    my ( $self, @args ) = @_;
    my $socket  = $self->{socket};
    my $request = to_json( \@args );
    warn "-> $request\n" if 0;
    $socket->print( $request . "\n" ) || die $!;
    my $response = $socket->getline || die $!;
    warn "<- $response" if 0;
    my $return = from_json($response);

    if ( $return->[0] != 0 ) {
        croak( $return->[1] );
    } else {
        return $return->[1];
    }
}

1;

__END__

=head1 NAME

Net::FleetDB - Query FleetDB

=head1 SYNOPSIS

  my $fleetdb = Net::FleetDB->new(
      host => '127.0.0.1',
      port => 3400,
  );
  my $updates = $fleetdb->query( 'insert', 'people',
    { 'id' => 1, 'name' => 'Bob' } );
  my $people = $fleetdb->query( 'select', 'people',
    { 'order' => [ 'id', 'asc' ] } )

=head1 DESCRIPTION

FleetDB is a "schema-free database optimized for agile development".
Read more about it including the types of queries you can run at
http://fleetdb.org/

This module allows you to query a FleetDB database.

=head1 AUTHOR

Leon Brocard <acme@astray.com>.

=head1 COPYRIGHT

Copyright (C) 2010, Leon Brocard

=head1 LICENSE

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