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/;
19 my ($class, $host, $port, $options) = @_;
21 my $ua = LWP::UserAgent->new;
25 $host ||= 'localhost';
32 base_uri => "http://$host:$port/",
36 sub ua { shift->{ua} }
37 sub base { shift->{base_uri} }
40 my ($self, $method, $uri, $content) = @_;
42 my $full_uri = $self->base . $uri;
45 if (defined $content) {
46 #Content-Type: application/json
48 $req = HTTP::Request->new( $method, $full_uri, undef, $content );
49 $req->header('Content-Type' => 'application/json');
51 $req = HTTP::Request->new( $method, $full_uri );
54 my $response = $self->ua->request($req);
56 if ($response->is_success) {
57 return $response->content;
59 die($response->status_line . ":" . $response->content);
67 my $rev = $rev->{$url};
68 $rev ||= eval { $self->get( $url )->{_rev} };
69 # warn "# rev $url $rev";
74 my ($self, $url) = @_;
76 $self->request(DELETE => $url . '?rev=' . $self->rev($url) );
80 my ($self, $url) = @_;
82 JSON->new->utf8->decode( $self->request(GET => $url) );
86 my ($self, $url, $json) = @_;
88 $json->{_rev} = $rev->{$url} if defined $rev->{$url};
90 my $data = dclone $json;
91 $data = unbless $data if blessed $data;
93 # warn "# put ",dump( $data );
95 $json = JSON->new->utf8->encode( $data );
100 my $json = eval { $self->request(PUT => $url, $json) };
102 $rev->{$url} = $self->rev( $url );
103 warn "refresh rev $url = ", $rev->{$url};
105 $rev->{$url} = JSON->new->decode( $json )->{rev};
111 my ($self, $url, $json) = @_;
113 $self->request(POST => $url, $json);
116 our $audit = __PACKAGE__->new;
121 my $url = join(' ', @_);
122 $url =~ s/\s+-\S+//g; # remove command line options
127 my @caller = caller(1); # skip store wrapper
128 $caller[3] = (caller(1))[3];
129 $caller[3] =~ s{^.+::}{}; # stip package name from sub
134 caller => $caller[3],
141 while ( my @c = caller($depth) ) {
142 push @$caller, [ @c ];
146 $data->{caller} = $caller;
150 # carp 'audit ', dump($data);
152 # $time = int($time); # reduce granularity for url
153 $time = strftime("%Y-%m-%d.%H:%M:%S", localtime $time);
154 my $package = $caller[0];
155 $audit->put( "pxelator/$time.$package.$url", $data );