/[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 206 by dpavlin, Wed Aug 12 22:27:57 2009 UTC revision 256 by dpavlin, Tue Aug 18 21:30:55 2009 UTC
# Line 12  use Time::HiRes qw/time/; Line 12  use Time::HiRes qw/time/;
12  use Data::Structure::Util qw(unbless);  use Data::Structure::Util qw(unbless);
13  use Scalar::Util qw/blessed/;  use Scalar::Util qw/blessed/;
14  use Storable qw/dclone/;  use Storable qw/dclone/;
15    use Carp qw/carp/;
16    
17  sub new {  sub new {
18          my ($class, $host, $port, $options) = @_;          my ($class, $host, $port, $options) = @_;
# Line 60  sub request { Line 61  sub request {
61    
62  our $rev;  our $rev;
63    
64    sub rev {
65            my ($self,$url) = @_;
66            my $rev = $rev->{$url};
67            $rev  ||= eval { $self->get( $url )->{_rev} };
68    #       warn "# rev $url $rev";
69            return $rev;
70    }
71    
72  sub delete {  sub delete {
73          my ($self, $url) = @_;          my ($self, $url) = @_;
74    
75          $self->request(DELETE => $url);          $self->request(DELETE => $url . '?rev=' . $self->rev($url) );
76  }  }
77    
78  sub get {  sub get {
# Line 74  sub get { Line 83  sub get {
83    
84  sub put {  sub put {
85          my ($self, $url, $json) = @_;          my ($self, $url, $json) = @_;
         warn "put $url ",dump($json);  
86    
87          if ( ! defined $json->{_rev} ) {          $json->{_rev} = $rev->{$url} if defined $rev->{$url};
88                  my $old = eval { $self->get( $url )->{_rev} };  
89                  $rev->{$url} = $json->{_rev} = $old if defined $old;          my $data = dclone $json;
90          }          $data = unbless $data if blessed $data;
91    
92          $json = unbless dclone $json if blessed $json;  #       warn "# put ",dump( $data );
93    
94          $json = JSON->new->utf8->encode( $json ) if $json;          $json = JSON->new->utf8->encode( $data );
95    
96          $self->request(PUT => $url, $json);          carp "# put ",$json;
97    
98            do {
99                    my $json = eval { $self->request(PUT => $url, $json) };
100                    if ( $@ ) {
101                            $rev->{$url} = $self->rev( $url );
102                            warn "refresh rev $url = ", $rev->{$url};
103                    } else {
104                            $rev->{$url} = JSON->new->decode( $json )->{rev};
105                    }
106            } until ! $@;
107  }  }
108    
109  sub post {  sub post {
# Line 100  sub audit { Line 118  sub audit {
118          my $data = pop @_;          my $data = pop @_;
119    
120          my $url = join(' ', @_);          my $url = join(' ', @_);
121          $url =~ s/-\S+//g;          $url =~ s/\s+-\S+//g;   # remove command line options
122          $url =~ s/\W+/-/g;          $url =~ s/\W+/-/g;
123    
124          my ( $package, undef, $line, $sub ) = caller(1);          my $time = $data->{time} = time();
125          ( $package, undef, $line ) = caller(0) if $package eq 'main';  
126            my @caller_name = ( qw/package file line sub/ );
127            my @caller = caller(0);
128            $caller[3] =~ s{^.+::}{}; # stip package name from sub
129            $data->{ $caller_name[$_] } = $caller[$_] foreach ( 0 .. $#caller_name );
130    
131            my $caller;
132            my $depth = 0;
133            while ( my @c = caller($depth) ) {
134                    push @$caller, [ @c ];
135                    $depth++;
136            }
137    
138            $data->{caller} = $caller;
139    
140    #       carp 'audit ', dump($data);
141    
142          $data->{x_meta} = {          $time = int($time); # reduce granularity for url
143                  'ident' => [ @_ ],          my $package = $caller[0];
144                  'time' => time(),          $audit->put( "pxelator/$time.$package.$url", $data );
                 'package' => $package,  
                 'line' => $line,  
                 'sub' => $sub,  
         };  
145    
         $audit->put( "pxelator/$package.$url", $data );  
146  }  }
147    
148  1;  1;

Legend:
Removed from v.206  
changed lines
  Added in v.256

  ViewVC Help
Powered by ViewVC 1.1.26