X-Git-Url: http://git.rot13.org/?p=angular-mojolicious.git;a=blobdiff_plain;f=couchdb-trigger.pl;h=f23e505e453c4c2879bbbeb37dbf912c9b245a3a;hp=02f5c32951170fa997ca211081d5536e13a29fb6;hb=HEAD;hpb=dcd86315bc5c11a54771ce54f422e7d44c8e52e8 diff --git a/couchdb-trigger.pl b/couchdb-trigger.pl index 02f5c32..f23e505 100755 --- a/couchdb-trigger.pl +++ b/couchdb-trigger.pl @@ -15,7 +15,7 @@ use strict; use lib 'common/mojo/lib'; -use Mojo::Client; +use Mojo::UserAgent; use Mojo::JSON; use Time::HiRes qw(time); use Data::Dump qw(dump); @@ -25,11 +25,17 @@ my ( $url, $trigger_path ) = @ARGV; $url ||= 'http://localhost:5984/monitor'; $trigger_path ||= 'trigger/shell.pm' ; +our $database = $1 if $url =~ m{/(\w+)/?$}; + require $trigger_path if -e $trigger_path; +my $uid = `hostname -s`; +chomp $uid; +$uid .= ':' . $$; + my $seq = 0; -my $client = Mojo::Client->new; +my $client = Mojo::UserAgent->new; our $json = Mojo::JSON->new; sub info { warn $_[0], " ",$json->encode($_[1]),$/ } sub debug { info "# $_[0]", $_[1] } @@ -45,12 +51,9 @@ while( ! $error ) { $tx->res->body(sub{ my ( $content, $body ) = @_; - debug 'BODY' => $body; + return if length($body) == 0; # empty chunk, heartbeat? - if ( length($body) == 0 ) { - warn "# empty chunk, heartbeat?\n"; - return; - } + debug 'BODY' => $body; foreach ( split(/\r?\n/, $body) ) { # we can get multiple documents in one chunk @@ -71,41 +74,45 @@ while( ! $error ) { debug 'change' => $change; if ( filter($change) ) { - if ( exists $change->{doc}->{trigger}->{active} ) { - debug 'trigger.active', $change->{doc}->{trigger}->{active}; - } else { - $change->{doc}->{trigger}->{active} = [ time() ]; + + if ( ! exists $change->{doc}->{trigger}->{active} ) { + $change->{doc}->{trigger}->{active} = [ $uid, time() ]; debug 'TRIGGER start PUT ', $change->{doc}; - $client->put( "$url/$id" => $json->encode( $change->{doc} ) => sub { - my ($client,$tx) = @_; - if ($tx->error) { - if ( $tx->res->code == 409 ) { - info "TRIGGER ABORTED started on another worker? ", $tx->error; + my $client = Mojo::UserAgent->new; + my $res = $client->put( "$url/$id" => $json->encode( $change->{doc} ) )->res; +warn "code ", $res->code, dump( $res->json ); + if ( $res->code == 409 ) { + info "TRIGGER ABORTED started on another worker? ", $res->error; + next; + } elsif ( $res->code != 201 ) { + info "ERROR $url/$id ", $res->code; + } + + + } elsif ( $change->{doc}->{trigger}->{active}->[0] eq $uid ) { + if ( exists $change->{doc}->{trigger}->{active}->[2] ) { + warn "allready executed"; + next; + } else { + + debug "TRIGGER execute ", $change->{doc}; + trigger( $change ); + + push @{ $change->{doc}->{trigger}->{active} }, time(), 0; # last timestamp +warn "change ",dump $change; + + my $client = Mojo::UserAgent->new; + my $res = $client->put( "$url/$id" => $json->encode( $change->{doc} ) )->res; +warn "code ", $res->code; + if ( my $json = $res->json ) { +warn dump($json); + $change->{doc}->{_rev} = $json->{rev}; + info "TRIGGER finish ", $change->{doc}; } else { - info "ERROR ", $tx->error; - } - } else { - my $res = $tx->res->json; - $change->{doc}->{_rev} = $res->{rev}; - - debug "TRIGGER execute ", $change->{doc}; - trigger( $change ); - - push @{ $change->{doc}->{trigger}->{active} }, time(), 0; # last timestamp - - $client->put( "$url/$id" => $json->encode( $change->{doc} ) => sub { - my ($client,$tx) = @_; - if ($tx->error) { - info "ERROR", $tx->error; - } else { - my $res = $tx->res->json; - $change->{doc}->{_rev} = $res->{rev}; - info "TRIGGER finish ", $change->{doc}; - } - })->process; + info "ERROR $url/$id", $tx->error; } - })->process; + } } } } else {