report error without nmap output
[pxelator] / lib / PXElator / CouchDB.pm
index 4f8aa29..7e9e8fd 100644 (file)
@@ -8,6 +8,10 @@ use warnings;
 use LWP::UserAgent;
 use JSON;
 use Data::Dump qw/dump/;
+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) = @_;
@@ -56,29 +60,49 @@ 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 {
        my ($self, $url) = @_;
 
-       from_json $self->request(GET => $url);
+       JSON->new->utf8->decode( $self->request(GET => $url) );
 }
 
 sub put {
        my ($self, $url, $json) = @_;
-       warn "put $url ",dump($json);
 
-       $rev->{$url} ||= eval { $self->get( $url )->{_rev} };
+       $json->{_rev} = $rev->{$url} if defined $rev->{$url};
+
+       my $data = dclone $json;
+       $data = unbless $data if blessed $data;
+
+#      warn "# put ",dump( $data );
 
-       $json->{_rev} = $rev->{$url} if $rev->{$url};
+       $json = JSON->new->utf8->encode( $data );
 
-       $json = to_json $json if $json;
+       carp "# put ",$json;
 
-       $self->request(PUT => $url, $json);
+       do {
+               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 ! $@;
 }
 
 sub post {
@@ -87,4 +111,11 @@ sub post {
        $self->request(POST => $url, $json);
 }
 
+our $audit = __PACKAGE__->new;
+
+sub _store_audit {
+       my ( $id, $data ) = @_;
+       $audit->put( "pxelator/$id", $data );
+}
+
 1;