8.3. Erlang

Note

The Erlang query server is disabled by default. Read configuration guide about reasons why and how to enable it.

Emit(Id, Value)

Emits key-value pairs to view indexer process.

fun({Doc}) ->
  <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
  V = proplists:get_value(<<"_id">>, Doc, null),
  Emit(<<K>>, V)
end.
FoldRows(Fun, Acc)

Helper to iterate over all rows in a list function.

Arguments:
  • Fun – Function object.
  • Acc – The value previously returned by Fun.
fun(Head, {Req}) ->
  Fun = fun({Row}, Acc) ->
    Id = couch_util:get_value(<<"id">>, Row),
    Send(list_to_binary(io_lib:format("Previous doc id: ~p~n", [Acc]))),
    Send(list_to_binary(io_lib:format("Current  doc id: ~p~n", [Id]))),
    {ok, Id}
  end,
  FoldRows(Fun, nil),
  ""
end.
GetRow()

Retrieves the next row from a related view result.

%% FoldRows background implementation.
%% https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=src/couchdb/couch_native_process.erl;hb=HEAD#l368
%%
foldrows(GetRow, ProcRow, Acc) ->
  case GetRow() of
    nil ->
      {ok, Acc};
    Row ->
      case (catch ProcRow(Row, Acc)) of
        {ok, Acc2} ->
          foldrows(GetRow, ProcRow, Acc2);
        {stop, Acc2} ->
          {ok, Acc2}
      end
end.
Log(Msg)
Arguments:
  • Msg – Log a message at the INFO level.
fun({Doc}) ->
  <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
  V = proplists:get_value(<<"_id">>, Doc, null),
  Log(lists:flatten(io_lib:format("Hello from ~s doc!", [V]))),
  Emit(<<K>>, V)
end.

After the map function has run, the following line can be found in CouchDB logs (e.g. at /var/log/couchdb/couch.log):

[Sun, 04 Nov 2012 11:33:58 GMT] [info] [<0.9144.2>] Hello from 8d300b86622d67953d102165dbe99467 doc!
Send(Chunk)

Sends a single string Chunk in response.

fun(Head, {Req}) ->
  Send("Hello,"),
  Send(" "),
  Send("Couch"),
  "!"
end.

The function above produces the following response:

Hello, Couch!
Start(Headers)
Arguments:

Initialize List functions response. At this point, response code and headers may be defined. For example, this function redirects to the CouchDB web site:

fun(Head, {Req}) ->
  Start({[{<<"code">>, 302},
          {<<"headers">>, {[
            {<<"Location">>, <<"http://couchdb.apache.org">>}]
          }}
        ]}),
  "Relax!"
end.