X-Git-Url: http://git.rot13.org/?p=angular-mojolicious.git;a=blobdiff_plain;f=couchdb-view-server.pl;h=cc64570cbd81916b4f4f13fed5ae54b117357d79;hp=a8827b304a1996170adc70b205c13d028a02d4f5;hb=HEAD;hpb=a54f912406c5c8b939bcbf83a30402678beca0f2;ds=sidebyside diff --git a/couchdb-view-server.pl b/couchdb-view-server.pl index a8827b3..cc64570 100755 --- a/couchdb-view-server.pl +++ b/couchdb-view-server.pl @@ -3,6 +3,15 @@ use warnings; use strict; # http://wiki.apache.org/couchdb/View_server +# +# /etc/couchdb/local.ini add: +# +# [query_servers] +# perl = /usr/bin/perl /srv/angular-mojolicious/couchdb-view-server.pl +# +# example view: +# +# sub { [ undef, shift ] } use JSON::XS; use IO::Handle; @@ -14,23 +23,30 @@ my $in = IO::Handle->new_from_fd(\*STDIN, 'r'); my $out = IO::Handle->new_from_fd(\*STDOUT, 'w'); $out->autoflush(1); +open(my $l_fh, '>>', "/tmp/couchdb-perl-view.log"); +$l_fh->autoflush(1); + +sub _debug { + print $l_fh "@_\n"; +} + sub _log { - $out->print(qq|["log", "@_"]\n|); - warn "# log @_\n"; + $out->print($j->encode([ 'log' => @_ ]), "\n"); } -our $fun; +our @fun; while(defined(my $line = $in->getline)) { chomp $line; + _debug $line; my $input = $j->decode($line); my ($cmd, @args) = @$input; if ( $cmd eq 'reset' ) { - undef $fun; + @fun = (); $out->print("true\n"); } elsif ( $cmd eq 'add_fun' ) { - $fun = eval @args; + push @fun, eval $args[0]; if ( $@ ) { $out->print( qq|{"error": "$!", "reason": "$@"}\n| ); } else { @@ -38,16 +54,15 @@ while(defined(my $line = $in->getline)) { } } elsif ( $cmd eq 'map_doc' ) { my @results; - our @d; - local @d; - eval { $fun->(@args) }; - if ( $@ ) { - _log $@; - } else { - push @results, [@d]; + foreach my $fun ( @fun ) { + my $d = eval { $fun->(@args) }; + _log $@ if $@; + push @results, [$d]; } - $out->print($j->utf8->encode( \@results ), "\n"); + my $json = $j->utf8->encode( \@results ); + $out->print("$json\n"); + _debug "# $json"; } else { - die "$cmd unimplemented", dump( $input ); + _log "$cmd unimplemented", dump( $input ); } }