cc64570cbd81916b4f4f13fed5ae54b117357d79
[angular-mojolicious.git] / couchdb-view-server.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 # http://wiki.apache.org/couchdb/View_server
6 #
7 # /etc/couchdb/local.ini add:
8 #
9 # [query_servers]
10 # perl = /usr/bin/perl /srv/angular-mojolicious/couchdb-view-server.pl
11 #
12 # example view:
13 #
14 # sub { [ undef, shift ] }
15
16 use JSON::XS;
17 use IO::Handle;
18 use Data::Dump qw(dump);
19
20 my $j = JSON::XS->new;
21
22 my $in  = IO::Handle->new_from_fd(\*STDIN, 'r');
23 my $out = IO::Handle->new_from_fd(\*STDOUT, 'w');
24 $out->autoflush(1);
25
26 open(my $l_fh, '>>', "/tmp/couchdb-perl-view.log");
27 $l_fh->autoflush(1);
28
29 sub _debug {
30         print $l_fh "@_\n";
31 }
32
33 sub _log {
34         $out->print($j->encode([ 'log' => @_ ]), "\n");
35 }
36
37 our @fun;
38
39 while(defined(my $line = $in->getline)) {
40         chomp $line;
41         _debug $line;
42         my $input = $j->decode($line);
43         my ($cmd, @args) = @$input;
44
45         if ( $cmd eq 'reset' ) {
46                 @fun = ();
47                 $out->print("true\n");
48         } elsif ( $cmd eq 'add_fun' ) {
49                 push @fun, eval $args[0];
50                 if ( $@ ) {
51                         $out->print( qq|{"error": "$!", "reason": "$@"}\n| );
52                 } else {
53                         $out->print("true\n");
54                 }
55         } elsif ( $cmd eq 'map_doc' ) {
56                 my @results;
57                 foreach my $fun ( @fun ) {
58                         my $d = eval { $fun->(@args) };
59                         _log $@ if $@;
60                         push @results, [$d];
61                 }
62                 my $json = $j->utf8->encode( \@results );
63                 $out->print("$json\n");
64                 _debug "# $json";
65         } else {
66                 _log "$cmd unimplemented", dump( $input );
67         }
68 }