3 # http://wiki.apache.org/couchdb/Getting_started_with_Perl
10 use Data::Dump qw/dump/;
11 use Time::HiRes qw/time/;
12 use Data::Structure::Util qw(unbless);
13 use Scalar::Util qw/blessed/;
14 use Storable qw/dclone/;
18 my ($class, $host, $port, $options) = @_;
20 my $ua = LWP::UserAgent->new;
24 $host ||= 'localhost';
31 base_uri => "http://$host:$port/",
35 sub ua { shift->{ua} }
36 sub base { shift->{base_uri} }
39 my ($self, $method, $uri, $content) = @_;
41 my $full_uri = $self->base . $uri;
44 if (defined $content) {
45 #Content-Type: application/json
47 $req = HTTP::Request->new( $method, $full_uri, undef, $content );
48 $req->header('Content-Type' => 'application/json');
50 $req = HTTP::Request->new( $method, $full_uri );
53 my $response = $self->ua->request($req);
55 if ($response->is_success) {
56 return $response->content;
58 die($response->status_line . ":" . $response->content);
66 my $rev = $rev->{$url};
67 $rev ||= eval { $self->get( $url )->{_rev} };
68 # warn "# rev $url $rev";
73 my ($self, $url) = @_;
75 $self->request(DELETE => $url . '?rev=' . $self->rev($url) );
79 my ($self, $url) = @_;
81 JSON->new->utf8->decode( $self->request(GET => $url) );
85 my ($self, $url, $json) = @_;
87 $json->{_rev} = $rev->{$url} if defined $rev->{$url};
89 my $data = dclone $json;
90 $data = unbless $data if blessed $data;
92 # warn "# put ",dump( $data );
94 $json = JSON->new->utf8->encode( $data );
99 my $json = eval { $self->request(PUT => $url, $json) };
101 $rev->{$url} = $self->rev( $url );
102 warn "refresh rev $url = ", $rev->{$url};
104 $rev->{$url} = JSON->new->decode( $json )->{rev};
110 my ($self, $url, $json) = @_;
112 $self->request(POST => $url, $json);
115 our $audit = __PACKAGE__->new;
120 my $url = join(' ', @_);
121 $url =~ s/\s+-\S+//g; # remove command line options
124 my ( $package, $file, $line, $sub ) = caller(1);
125 ( $package, undef, $line ) = caller(0) if ! $package || $package eq 'main';
129 $data->{$_} = eval '$' . $_ foreach ( qw/time package line sub/ );
131 # carp 'audit ', dump($data);
133 $time = int($time); # reduce granularity
134 $audit->put( "pxelator/$time.$package.$url", $data );