working CouchDB view server in perl
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 14 Oct 2011 18:45:05 +0000 (20:45 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 14 Oct 2011 18:45:13 +0000 (20:45 +0200)
couchdb-view-server.pl
t/couchdb-view-server.json [new file with mode: 0644]

index dd1a47a..c210a0a 100755 (executable)
@@ -8,6 +8,10 @@ use strict;
 #
 # [query_servers]
 # perl = /usr/bin/perl /srv/angular-mojolicious/couchdb-view-server.pl
 #
 # [query_servers]
 # perl = /usr/bin/perl /srv/angular-mojolicious/couchdb-view-server.pl
+#
+# example view:
+#
+# sub { [ undef, shift ] }
 
 use JSON::XS;
 use IO::Handle;
 
 use JSON::XS;
 use IO::Handle;
@@ -19,15 +23,18 @@ my $in  = IO::Handle->new_from_fd(\*STDIN, 'r');
 my $out = IO::Handle->new_from_fd(\*STDOUT, 'w');
 $out->autoflush(1);
 
 my $out = IO::Handle->new_from_fd(\*STDOUT, 'w');
 $out->autoflush(1);
 
+open(my $l_fh, '>', "/tmp/couchdb-perl-view.log");
+
 sub _log {
 sub _log {
-       $out->print(qq|["log", "@_"]\n|);
-       warn "# log @_\n";
+       $out->print($j->encode([ 'log' => @_ ]), "\n");
+       print $l_fh "@_\n";
 }
 
 our $fun;
 
 while(defined(my $line = $in->getline)) {
        chomp $line;
 }
 
 our $fun;
 
 while(defined(my $line = $in->getline)) {
        chomp $line;
+       _log $line if $ENV{DEBUG};
        my $input = $j->decode($line);
        my ($cmd, @args) = @$input;
 
        my $input = $j->decode($line);
        my ($cmd, @args) = @$input;
 
@@ -35,7 +42,7 @@ while(defined(my $line = $in->getline)) {
                undef $fun;
                $out->print("true\n");
        } elsif ( $cmd eq 'add_fun' ) {
                undef $fun;
                $out->print("true\n");
        } elsif ( $cmd eq 'add_fun' ) {
-               $fun = eval @args;
+               $fun = eval $args[0];
                if ( $@ ) {
                        $out->print( qq|{"error": "$!", "reason": "$@"}\n| );
                } else {
                if ( $@ ) {
                        $out->print( qq|{"error": "$!", "reason": "$@"}\n| );
                } else {
@@ -43,16 +50,16 @@ while(defined(my $line = $in->getline)) {
                }
        } elsif ( $cmd eq 'map_doc' ) {
                my @results;
                }
        } elsif ( $cmd eq 'map_doc' ) {
                my @results;
-               our @d;
-               local @d;
-               eval { $fun->(@args) };
+               our $d;
+               local $d;
+               $d = eval { $fun->(@args) };
                if ( $@ ) {
                        _log $@;
                } else {
                if ( $@ ) {
                        _log $@;
                } else {
-                       push @results, [@d];
+                       push @results, [$d];
                }
                $out->print($j->utf8->encode( \@results ), "\n");
        } else {
                }
                $out->print($j->utf8->encode( \@results ), "\n");
        } else {
-               die "$cmd unimplemented", dump( $input );
+               _log "$cmd unimplemented", dump( $input );
        }
 }
        }
 }
diff --git a/t/couchdb-view-server.json b/t/couchdb-view-server.json
new file mode 100644 (file)
index 0000000..b6bf218
--- /dev/null
@@ -0,0 +1,3 @@
+["reset",{"reduce_limit":true,"timeout":5000}]
+["add_fun","sub {\n [ shift->{_id}, 1 ];\n}"]
+["map_doc",{"_id":"cb71ad755be66b467ae5e51e4100e027","_rev":"3-11fd6bead394b463531889babc686ac4","trigger":{"active":["t61p:11026","1317673926.10924","1317673926.15453","0"],"output":"","command":"notify-send \"CouchDB trigger notify example\""}}]