You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@couchdb.apache.org by Mike Walker <mi...@napkindrawing.com> on 2009/02/21 16:36:27 UTC
CouchDB::ExternalProcess
Hi All,
I'd like to announce version 0.01 of CouchDB::ExternalProcess, a Perl
module that makes writing CouchDB External Processes easier.
http://search.cpan.org/~fansipans/CouchDB-ExternalProcess-0.01/lib/CouchDB/ExternalProcess.pm
All the work of reading input, parsing JSON, serializing a JSON
response, and writing output is managed, and can be overridden as
needed.
All that's needed to create a your own External Process is:
use base qw/CouchDB::ExternalProcess/;
And then all subroutines marked with the ":Action" attribute can be
requested as a path component after the External Process' URL.
All :Action subroutines receive a parsed data structure from the
original JSON input, and simply return a Perl data structure in the same
structure as described by
http://wiki.apache.org/couchdb/ExternalProcesses
So, with the following code in "Party.pm", in the directory "/mydir":
package Party;
use base qw/CouchDB::ExternalProcess/;
my @styles = qw/ Ska Mosh Tango Hokey-Pokey /;
sub dance :Action {
my ($self, $req) = @_;
my $style = $req->{query}->{style};
die "Can't dance without a dance style!"
unless $style;
die "Invalid dance style specified"
unless grep { $style eq $_ } @styles;
my $response = {
body => "<b>Dancing enabled!</b>";
};
return $response;
}
sub dance_styles :Action {
return {
json => {
styles => \@styles
}
};
}
And the following configuration in your CouchDB's local.ini:
[external]
party = perl -I/mydir -MParty -e 'Party->new->run'
[httpd_db_handlers]
_party = {couch_httpd_external, handle_external_req, <<"party">>}
Now for any database DATABASE on your server SERVER you can get a JSON
data structure of allowed dance styles at:
http://SERVER/DATABASE/_party/dance_styles
And you can get an HTML confirmation of dancing at:
http://SERVER/DATABASE/_party/dance?style=Ska
Errors and exceptions from die() are captured and returned in a JSON
data structure containing the error message.
Pre/post request processing is allowed by defining _before and _after,
respectively. See the tests in the t/ directory of the distribution.
The logic that extracts the name of the Action to execute can be
overridden, currently the third path component is used:
/database/external/ACTION_NAME
That can be overridden to use a CGI::Application style "rm" request
parameter with just:
sub _extract_action_name {
my ($self,$req) = @_;
return $req->{query}->{rm};
}
Also there's preliminary support for self-documentation of provided
services. :Action subroutines can also use the following attributes:
:Description("...")
:Args(...)
Then if the "Action" "_meta" is requested, a JSON document is returned
describing all services and their arguments.
Any comments / criticisms are welcome. Obviously this is 0.01 and I've
got a few things to improve. I do kindly request that all flames and
threats be submitted in haiku format.
Thanks and props to the CouchDB team! You guys are working on a
really cool project :)
-Mike