blob: 4478c9bb46c50c8ed6ee407df9fcfcf77657457c [file] [log] [blame]
.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
.. http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.
.. default-domain:: js
.. _query-server/erlang:
======
Erlang
======
.. note::
The Erlang query server is disabled by default.
Read :ref:`configuration guide <config/native_query_servers>` about
reasons why and how to enable it.
.. function:: Emit(Id, Value)
Emits `key`-`value` pairs to view indexer process.
.. code-block:: erlang
fun({Doc}) ->
<<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
V = proplists:get_value(<<"_id">>, Doc, null),
Emit(<<K>>, V)
end.
.. function:: FoldRows(Fun, Acc)
Helper to iterate over all rows in a list function.
:param Fun: Function object.
:param Acc: The value previously returned by `Fun`.
.. code-block:: erlang
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.
.. function:: GetRow()
Retrieves the next row from a related view result.
.. code-block:: erlang
%% 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.
.. function:: Log(Msg)
:param Msg: Log a message at the `INFO` level.
.. code-block:: erlang
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`):
.. code-block:: text
[Sun, 04 Nov 2012 11:33:58 GMT] [info] [<0.9144.2>] Hello from 8d300b86622d67953d102165dbe99467 doc!
.. function:: Send(Chunk)
Sends a single string `Chunk` in response.
.. code-block:: erlang
fun(Head, {Req}) ->
Send("Hello,"),
Send(" "),
Send("Couch"),
"!"
end.
The function above produces the following response:
.. code-block:: text
Hello, Couch!
.. function:: Start(Headers)
:param Headers: Proplist of :ref:`response object<response_object>`.
Initialize :ref:`listfun` response. At this point, response code and headers
may be defined. For example, this function redirects to the CouchDB
web site:
.. code-block:: erlang
fun(Head, {Req}) ->
Start({[{<<"code">>, 302},
{<<"headers">>, {[
{<<"Location">>, <<"http://couchdb.apache.org">>}]
}}
]}),
"Relax!"
end.