use Data::Structure::Util qw(unbless);
use Scalar::Util qw/blessed/;
use Storable qw/dclone/;
+use Carp qw/carp/;
sub new {
my ($class, $host, $port, $options) = @_;
our $rev;
+sub rev {
+ my ($self,$url) = @_;
+ my $rev = $rev->{$url};
+ $rev ||= eval { $self->get( $url )->{_rev} };
+# warn "# rev $url $rev";
+ return $rev;
+}
+
sub delete {
my ($self, $url) = @_;
- $self->request(DELETE => $url);
+ $self->request(DELETE => $url . '?rev=' . $self->rev($url) );
}
sub get {
sub put {
my ($self, $url, $json) = @_;
- if ( ! defined $json->{_rev} ) {
- my $old = eval { $self->get( $url )->{_rev} };
- $rev->{$url} = $json->{_rev} = $old if defined $old;
- }
+ $json->{_rev} = $rev->{$url} if defined $rev->{$url};
my $data = dclone $json;
$data = unbless $data if blessed $data;
- warn dump( $data );
+# warn "# put ",dump( $data );
$json = JSON->new->utf8->encode( $data );
- warn $json;
+ carp "# put ",$json;
do {
- eval { $self->request(PUT => $url, $json) };
- $rev->{$url} = $self->get( $url )->{_rev} if $@;
+ my $json = eval { $self->request(PUT => $url, $json) };
+ if ( $@ ) {
+ $rev->{$url} = $self->rev( $url );
+ warn "refresh rev $url = ", $rev->{$url};
+ } else {
+ $rev->{$url} = JSON->new->decode( $json )->{rev};
+ }
} until ! $@;
}
$url =~ s/\W+/-/g;
my ( $package, $file, $line, $sub ) = caller(1);
-# ( $package, undef, $line ) = caller(0) if $package eq 'main';
+ ( $package, undef, $line ) = caller(0) if ! $package || $package eq 'main';
my $time = time();
$data->{$_} = eval '$' . $_ foreach ( qw/time package line sub/ );
- warn 'audit ', dump($data), "at $file +$line\n";
+# carp 'audit ', dump($data);
$time = int($time); # reduce granularity
$audit->put( "pxelator/$time.$package.$url", $data );
use strict;
use autodie;
-use Test::More tests => 5;
+use Test::More tests => 7;
use Data::Dump qw/dump/;
use_ok 'CouchDB';
ok( my $doc = $db->get( $url, 'get' ), 'get' );
-diag dump( $doc );
+diag 'doc ', dump( $doc );
-#ok( $db->delete( "$db" ), 'delete' );
+ok( $db->put( $url, { foo => 99 }), "put $url" );
+
+ok( $db->delete( $url ), 'delete' );
+
+ok( CouchDB::audit( 'test', { foo => 42, bar => 'baz' }), 'audit' );
-ok( $db->audit( 'test', { foo => 42, bar => 'baz' }), 'audit' );