cleanup CouchDB API
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 15 Aug 2009 14:21:55 +0000 (14:21 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 15 Aug 2009 14:21:55 +0000 (14:21 +0000)
lib/PXElator/CouchDB.pm
lib/PXElator/t/CouchDB.t

index 8eae090..2453eba 100644 (file)
@@ -12,6 +12,7 @@ use Time::HiRes qw/time/;
 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) = @_;
@@ -60,10 +61,18 @@ sub request {
 
 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 {
@@ -75,23 +84,25 @@ 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 ! $@;
 }
 
@@ -111,13 +122,13 @@ sub audit {
        $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 );
index 579c97e..49073f7 100755 (executable)
@@ -4,7 +4,7 @@ use warnings;
 use strict;
 use autodie;
 
-use Test::More tests => 5;
+use Test::More tests => 7;
 use Data::Dump qw/dump/;
 
 use_ok 'CouchDB';
@@ -18,8 +18,11 @@ ok( $db->put( $url, { foo => 42, bar => 'baz' }), "put $url" );
 
 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' );