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;
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 {
}
} 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 );
}
}