Well, I just googled it. Basically there is a couchdb_plugin.erl which
tells Erlang what a behavior looks like. And all that does is define the
functions and arity which a couchdb_plugin would have to export.

Probably there are some better Erlangers on the list who might chime in. It
looks like okay bang-for-buck; only not much bang or much buck.


On Thu, Aug 8, 2013 at 5:26 PM, Jan Lehnardt <j...@apache.org> wrote:

> how would this look in code?
>
> On Aug 8, 2013, at 12:21 , Jason Smith <j...@apache.org> wrote:
>
> > Perhaps a custom behaviour to help catch API problems at compile time?
> >
> >    -behaviour(couchdb_plugin).
> >
> >
> >
> > On Thu, Aug 8, 2013 at 3:47 PM, Jan Lehnardt <j...@apache.org> wrote:
> >
> >> Heya,
> >>
> >> I’m toying with the idea of moving some of my experimental into
> >> bona-fide plugins. One of them is my log_to_db branch that on top of
> >> writing log messages to a text file also writes a document to a log
> >> database.
> >>
> >> Conceptually, this is the perfect use of a plugin: the feature is not
> >> useful in the general case, because *any* activity creates write load
> >> on a single database, but for certain low-volume installations, this
> >> might be a useful feature (I wouldn’t have written it, if I hadn’t
> >> needed it at some point) so allowing users to enable it as a plugin
> >> would be nice.
> >>
> >> But regardless of whether my plugin is useful, it illustrates an
> >> interesting point:
> >>
> >> A log_to_db plugin would need to register for logging events or, if it
> >> doesn’t want to duplicate all the logging-level logic in couch_log, it
> >> would need some way of injecting a function call into
> >> `couch_log:log().`. We could of course try and find a way where a
> >> plugin would be able to provide an API compatible version of a CouchDB
> >> module and swap it out for it’s custom one, but that’s hardly a great
> >> idea.
> >>
> >> Other software has the notion of “hooks” (some may call it something
> >> else) where at well defined points in the main code base, external
> >> functions get called with certain parameters. To make things dynamic,
> >> there might be a way for plugins to register to be called by those
> >> hooks and the main code then asks the registry whether there are any
> >> plugin functions to call.
> >>
> >> In the log_to_db example, we’d have something like this:
> >>
> >> couch_log_to_db.erl:
> >>
> >>    init() ->
> >>        couch_hooks:register(couch_log_hook, log_hook_fun/1),
> >>        ok.
> >>
> >>    log_hook_fun(Log) ->
> >>        % do the log_to_db magic
> >>        ok.
> >>
> >>
> >> couch_hooks.erl:
> >>
> >>    register(Hook, Fun) ->
> >>        % store the Fun with the Hook somewhere
> >>        ok.
> >>
> >>    call(Hook, Args) ->
> >>         % retrieve Fun for Hook from somewhere
> >>        Fun(Args).
> >>
> >> couch_log.erl:
> >>
> >> % in log()
> >>
> >>    ...
> >>    couch_hooks:call(couch_log_hook, Args),
> >>    ...
> >>
> >> The main code would define what the hook name and arguments are and the
> >> plugin would have to conform. The plugin registry would just manage the
> >> registration and calling of functions for a hook, but nothing more.
> >>
> >> * * *
> >>
> >> This is just my first stab at this not thinking about it too much and I
> >> likely miss some subtleties in Erlang that make this not work (hot code
> >> upgrades e.g.).
> >>
> >>
> >> How do you think we should implement a hooks feature in CouchDB?
> >>
> >>
> >> Thanks!
> >> Jan
> >> --
> >>
> >>
> >>
> >>
> >>
>
>

Reply via email to