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) = @_;
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 {
$self->request(POST => $url, $json);
}
+our $audit = __PACKAGE__->new;
+
+sub _store_audit {
+ my ( $id, $data ) = @_;
+ $audit->put( "pxelator/$id", $data );
+}
+
1;