/[pxelator]/lib/PXElator/CouchDB.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/PXElator/CouchDB.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 205 by dpavlin, Wed Aug 12 19:49:36 2009 UTC revision 299 by dpavlin, Wed Aug 26 15:59:19 2009 UTC
# Line 8  use warnings; Line 8  use warnings;
8  use LWP::UserAgent;  use LWP::UserAgent;
9  use JSON;  use JSON;
10  use Data::Dump qw/dump/;  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/;
15    use Carp qw/carp/;
16    use POSIX;
17    
18  sub new {  sub new {
19          my ($class, $host, $port, $options) = @_;          my ($class, $host, $port, $options) = @_;
# Line 56  sub request { Line 62  sub request {
62    
63  our $rev;  our $rev;
64    
65    sub rev {
66            my ($self,$url) = @_;
67            my $rev = $rev->{$url};
68            $rev  ||= eval { $self->get( $url )->{_rev} };
69    #       warn "# rev $url $rev";
70            return $rev;
71    }
72    
73  sub delete {  sub delete {
74          my ($self, $url) = @_;          my ($self, $url) = @_;
75    
76          $self->request(DELETE => $url);          $self->request(DELETE => $url . '?rev=' . $self->rev($url) );
77  }  }
78    
79  sub get {  sub get {
80          my ($self, $url) = @_;          my ($self, $url) = @_;
81    
82          from_json $self->request(GET => $url);          JSON->new->utf8->decode( $self->request(GET => $url) );
83  }  }
84    
85  sub put {  sub put {
86          my ($self, $url, $json) = @_;          my ($self, $url, $json) = @_;
         warn "put $url ",dump($json);  
87    
88          $rev->{$url} ||= eval { $self->get( $url )->{_rev} };          $json->{_rev} = $rev->{$url} if defined $rev->{$url};
89    
90            my $data = dclone $json;
91            $data = unbless $data if blessed $data;
92    
93          $json->{_rev} = $rev->{$url} if $rev->{$url};  #       warn "# put ",dump( $data );
94    
95          $json = to_json $json if $json;          $json = JSON->new->utf8->encode( $data );
96    
97          $self->request(PUT => $url, $json);          carp "# put ",$json;
98    
99            do {
100                    my $json = eval { $self->request(PUT => $url, $json) };
101                    if ( $@ ) {
102                            $rev->{$url} = $self->rev( $url );
103                            warn "refresh rev $url = ", $rev->{$url};
104                    } else {
105                            $rev->{$url} = JSON->new->decode( $json )->{rev};
106                    }
107            } until ! $@;
108  }  }
109    
110  sub post {  sub post {
# Line 87  sub post { Line 113  sub post {
113          $self->request(POST => $url, $json);          $self->request(POST => $url, $json);
114  }  }
115    
116    our $audit = __PACKAGE__->new;
117    
118    sub audit {
119            my $data = pop @_;
120    
121            my $url = join(' ', @_);
122            $url =~ s/\s+-\S+//g;   # remove command line options
123            $url =~ s/\W+/-/g;
124    
125            my $time = $data->{time} = time();
126    
127            my @caller_name = ( qw/package file line sub/ );
128            my @caller = caller(0);
129            $caller[3] = (caller(1))[3];
130            $caller[3] =~ s{^.+::}{}; # stip package name from sub
131            $data->{ $caller_name[$_] } = $caller[$_] foreach ( 0 .. $#caller_name );
132    
133            if ( $ENV{DEBUG} ) {
134    
135                    my $caller;
136                    my $depth = 0;
137                    while ( my @c = caller($depth) ) {
138                            push @$caller, [ @c ];
139                            $depth++;
140                    }
141    
142                    $data->{caller} = $caller;
143    
144            }
145    
146    #       carp 'audit ', dump($data);
147    
148    #       $time = int($time); # reduce granularity for url
149            $time = strftime("%Y-%m-%d.%H:%M:%S", localtime $time);
150            my $package = $caller[0];
151            $audit->put( "pxelator/$time.$package.$url", $data );
152    
153    }
154    
155  1;  1;

Legend:
Removed from v.205  
changed lines
  Added in v.299

  ViewVC Help
Powered by ViewVC 1.1.26