working CouchDB view server in perl
[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
28 sub _log {
29         $out->print($j->encode([ 'log' => @_ ]), "\n");
30         print $l_fh "@_\n";
31 }
32
33 our $fun;
34
35 while(defined(my $line = $in->getline)) {
36         chomp $line;
37         _log $line if $ENV{DEBUG};
38         my $input = $j->decode($line);
39         my ($cmd, @args) = @$input;
40
41         if ( $cmd eq 'reset' ) {
42                 undef $fun;
43                 $out->print("true\n");
44         } elsif ( $cmd eq 'add_fun' ) {
45                 $fun = eval $args[0];
46                 if ( $@ ) {
47                         $out->print( qq|{"error": "$!", "reason": "$@"}\n| );
48                 } else {
49                         $out->print("true\n");
50                 }
51         } elsif ( $cmd eq 'map_doc' ) {
52                 my @results;
53                 our $d;
54                 local $d;
55                 $d = eval { $fun->(@args) };
56                 if ( $@ ) {
57                         _log $@;
58                 } else {
59                         push @results, [$d];
60                 }
61                 $out->print($j->utf8->encode( \@results ), "\n");
62         } else {
63                 _log "$cmd unimplemented", dump( $input );
64         }
65 }