You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by kx...@apache.org on 2015/02/20 01:26:38 UTC
[05/26] documentation commit: updated refs/heads/master to 5a81ace
src/query-server now follows the style
Project: http://git-wip-us.apache.org/repos/asf/couchdb-documentation/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-documentation/commit/e5d2fc8e
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-documentation/tree/e5d2fc8e
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-documentation/diff/e5d2fc8e
Branch: refs/heads/master
Commit: e5d2fc8ec5f905a47e10a4298e21daf5c3e87aeb
Parents: 75787d2
Author: Maria Andersson <ma...@dualpose.com>
Authored: Fri Feb 6 22:19:18 2015 +0100
Committer: Maria Andersson <ma...@dualpose.com>
Committed: Fri Feb 6 22:19:18 2015 +0100
----------------------------------------------------------------------
src/query-server/erlang.rst | 162 ++++----
src/query-server/index.rst | 9 +-
src/query-server/javascript.rst | 268 ++++++------
src/query-server/protocol.rst | 782 +++++++++++++++++------------------
4 files changed, 594 insertions(+), 627 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-documentation/blob/e5d2fc8e/src/query-server/erlang.rst
----------------------------------------------------------------------
diff --git a/src/query-server/erlang.rst b/src/query-server/erlang.rst
index 165a341..ca6ef3b 100644
--- a/src/query-server/erlang.rst
+++ b/src/query-server/erlang.rst
@@ -14,126 +14,122 @@
.. _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.
+ 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
+ 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.
+ .. 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.
+ Helper to iterate over all rows in a list function.
- :param Fun: Function object.
- :param Acc: The value previously returned by `Fun`.
+ :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.
+ .. 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.
+ 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
+ :param 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.
+ .. code-block:: erlang
- After the map function has run, the following line can be found in
- CouchDB logs (e.g. at `/var/log/couchdb/couch.log`):
+ 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.
- .. code-block:: text
+ 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!
+ .. 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
+ Sends a single string `Chunk` in response.
- fun(Head, {Req}) ->
- Send("Hello,"),
- Send(" "),
- Send("Couch"),
- "!"
- end.
+ .. code-block:: erlang
- The function above produces the following response:
+ fun(Head, {Req}) ->
+ Send("Hello,"),
+ Send(" "),
+ Send("Couch"),
+ "!"
+ end.
- .. code-block:: text
+ The function above produces the following response:
- Hello, Couch!
+ .. code-block:: text
+ Hello, Couch!
.. function:: Start(Headers)
- :param Headers: Proplist of :ref:`response object<response_object>`.
+ :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:
+ 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
+ .. code-block:: erlang
- fun(Head, {Req}) ->
- Start({[{<<"code">>, 302},
- {<<"headers">>, {[
- {<<"Location">>, <<"http://couchdb.apache.org">>}]
- }}
- ]}),
- "Relax!"
- end.
+ fun(Head, {Req}) ->
+ Start({[{<<"code">>, 302},
+ {<<"headers">>, {[
+ {<<"Location">>, <<"http://couchdb.apache.org">>}]
+ }}
+ ]}),
+ "Relax!"
+ end.
http://git-wip-us.apache.org/repos/asf/couchdb-documentation/blob/e5d2fc8e/src/query-server/index.rst
----------------------------------------------------------------------
diff --git a/src/query-server/index.rst b/src/query-server/index.rst
index 835ba1b..657faee 100644
--- a/src/query-server/index.rst
+++ b/src/query-server/index.rst
@@ -32,9 +32,8 @@ are assumed to be of type `javascript`, as are ad hoc queries that are POSTed to
.. _Mozilla SpiderMonkey: https://developer.mozilla.org/en/docs/SpiderMonkey
.. toctree::
- :maxdepth: 2
-
- protocol
- javascript
- erlang
+ :maxdepth: 2
+ protocol
+ javascript
+ erlang
http://git-wip-us.apache.org/repos/asf/couchdb-documentation/blob/e5d2fc8e/src/query-server/javascript.rst
----------------------------------------------------------------------
diff --git a/src/query-server/javascript.rst b/src/query-server/javascript.rst
index 386f9c5..ba282ac 100644
--- a/src/query-server/javascript.rst
+++ b/src/query-server/javascript.rst
@@ -14,12 +14,15 @@
.. _query-server/js:
+==========
JavaScript
==========
-.. note:: While every design function has access to all JavaScript objects,
- the table below describes appropriate usage cases. For example,
- you may use :func:`emit` in :ref:`listfun`, but :func:`getRow` is not permitted during :ref:`mapfun`.
+.. note::
+ While every design function has access to all JavaScript objects, the table
+ below describes appropriate usage cases. For example, you may use
+ :func:`emit` in :ref:`listfun`, but :func:`getRow` is not permitted
+ during :ref:`mapfun`.
+--------------------------------+---------------------------------------------+
| JS Function | Reasonable to use in design doc functions |
@@ -50,192 +53,179 @@ JavaScript
+--------------------------------+---------------------------------------------+
Design functions context
-------------------------
+========================
Each design function executes in a special context of predefined objects,
modules and functions:
-
.. function:: emit(key, value)
- Emits a `key`-`value` pair for further processing by CouchDB after the map
- function is done.
+ Emits a `key`-`value` pair for further processing by CouchDB after the map
+ function is done.
- :param key: The view key
- :param value: The `key`'s associated value
+ :param key: The view key
+ :param value: The `key`'s associated value
- .. code-block:: javascript
-
- function(doc){
- emit(doc._id, doc._rev);
- }
+ .. code-block:: javascript
+ function(doc){
+ emit(doc._id, doc._rev);
+ }
.. function:: getRow()
- Extracts the next row from a related view result.
+ Extracts the next row from a related view result.
- :return: View result row
- :rtype: object
+ :return: View result row
+ :rtype: object
- .. code-block:: javascript
+ .. code-block:: javascript
- function(head, req){
- send('[');
- row = getRow();
- if (row){
- send(toJSON(row));
- while(row = getRow()){
- send(',');
- send(toJSON(row));
- }
+ function(head, req){
+ send('[');
+ row = getRow();
+ if (row){
+ send(toJSON(row));
+ while(row = getRow()){
+ send(',');
+ send(toJSON(row));
+ }
+ }
+ return ']';
}
- return ']';
- }
-
.. data:: JSON
- `JSON2 <https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=share/server/json2.js>`_
- object.
-
+ `JSON2 <https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=share/server/json2.js>`_
+ object.
.. function:: isArray(obj)
- A helper function to check if the provided value is an `Array`.
-
- :param obj: Any Javascript value
- :return: ``true`` if `obj` is `Array`-typed, ``false`` otherwise
- :rtype: boolean
+ A helper function to check if the provided value is an `Array`.
+ :param obj: Any Javascript value
+ :return: ``true`` if `obj` is `Array`-typed, ``false`` otherwise
+ :rtype: boolean
.. function:: log(message)
- Log a message to the CouchDB log (at the `INFO` level).
+ Log a message to the CouchDB log (at the `INFO` level).
- :param message: Message to be logged
+ :param message: Message to be logged
- .. code-block:: javascript
+ .. code-block:: javascript
- function(doc){
- log('Procesing doc ' + doc['_id']);
- emit(doc['_id'], null);
- }
-
- After the map function has run, the following line can be found in CouchDB
- logs (e.g. at `/var/log/couchdb/couch.log`):
+ function(doc){
+ log('Procesing doc ' + doc['_id']);
+ emit(doc['_id'], null);
+ }
- .. code-block:: text
+ After the map function has run, the following line can be found in CouchDB
+ logs (e.g. at `/var/log/couchdb/couch.log`):
- [Sat, 03 Nov 2012 17:38:02 GMT] [info] [<0.7543.0>] OS Process #Port<0.3289> Log :: Processing doc 8d300b86622d67953d102165dbe99467
+ .. code-block:: text
+ [Sat, 03 Nov 2012 17:38:02 GMT] [info] [<0.7543.0>] OS Process #Port<0.3289> Log :: Processing doc 8d300b86622d67953d102165dbe99467
.. function:: provides(key, func)
- Registers callable handler for specified MIME key.
-
- :param key: MIME key previously defined by :func:`registerType`
- :param func: MIME type handler
+ Registers callable handler for specified MIME key.
+ :param key: MIME key previously defined by :func:`registerType`
+ :param func: MIME type handler
.. function:: registerType(key, *mimes)
- Registers list of MIME types by associated `key`.
-
- :param key: MIME types
- :param mimes: MIME types enumeration
-
- Predefined mappings (`key`-`array`):
-
- - **all**: ``*/*``
- - **text**: ``text/plain; charset=utf-8``, ``txt``
- - **html**: ``text/html; charset=utf-8``
- - **xhtml**: ``application/xhtml+xml``, ``xhtml``
- - **xml**: ``application/xml``, ``text/xml``, ``application/x-xml``
- - **js**: ``text/javascript``, ``application/javascript``,
- ``application/x-javascript``
- - **css**: ``text/css``
- - **ics**: ``text/calendar``
- - **csv**: ``text/csv``
- - **rss**: ``application/rss+xml``
- - **atom**: ``application/atom+xml``
- - **yaml**: ``application/x-yaml``, ``text/yaml``
- - **multipart_form**: ``multipart/form-data``
- - **url_encoded_form**: ``application/x-www-form-urlencoded``
- - **json**: ``application/json``, ``text/x-json``
-
+ Registers list of MIME types by associated `key`.
+
+ :param key: MIME types
+ :param mimes: MIME types enumeration
+
+ Predefined mappings (`key`-`array`):
+
+ - **all**: ``*/*``
+ - **text**: ``text/plain; charset=utf-8``, ``txt``
+ - **html**: ``text/html; charset=utf-8``
+ - **xhtml**: ``application/xhtml+xml``, ``xhtml``
+ - **xml**: ``application/xml``, ``text/xml``, ``application/x-xml``
+ - **js**: ``text/javascript``, ``application/javascript``,
+ ``application/x-javascript``
+ - **css**: ``text/css``
+ - **ics**: ``text/calendar``
+ - **csv**: ``text/csv``
+ - **rss**: ``application/rss+xml``
+ - **atom**: ``application/atom+xml``
+ - **yaml**: ``application/x-yaml``, ``text/yaml``
+ - **multipart_form**: ``multipart/form-data``
+ - **url_encoded_form**: ``application/x-www-form-urlencoded``
+ - **json**: ``application/json``, ``text/x-json``
.. function:: require(path)
- Loads CommonJS module by a specified `path`. The path should not start with
- a slash.
-
- :param path: A CommonJS module path started from design document root
- :return: Exported statements
+ Loads CommonJS module by a specified `path`. The path should not start with
+ a slash.
+ :param path: A CommonJS module path started from design document root
+ :return: Exported statements
.. function:: send(chunk)
- Sends a single string `chunk` in response.
-
- :param chunk: Text chunk
+ Sends a single string `chunk` in response.
- .. code-block:: javascript
+ :param chunk: Text chunk
- function(head, req){
- send('Hello,');
- send(' ');
- send('Couch');
- return !
- }
+ .. code-block:: javascript
+ function(head, req){
+ send('Hello,');
+ send(' ');
+ send('Couch');
+ return !
+ }
.. function:: start(init_resp)
- Initiates chunked response. As an option, a custom
- :ref:`response <response_object>` object may be sent at this point.
- For `list`-functions only!
-
- .. note::
-
- list functions may set the `HTTP response code` and `headers` by calling
- this function. This function must be called before :func:`send`,
- :func:`getRow` or a `return` statement; otherwise, the query server will
- implicitly call this function with the empty object (``{}``).
-
- .. code-block:: javascript
-
- function(head, req){
- start({
- "code": 302,
- "headers": {
- "Location": "http://couchdb.apache.org"
- }
- });
- return "Relax!";
- }
-
+ Initiates chunked response. As an option, a custom
+ :ref:`response <response_object>` object may be sent at this point.
+ For `list`-functions only!
+
+ .. note::
+ list functions may set the `HTTP response code` and `headers` by calling
+ this function. This function must be called before :func:`send`,
+ :func:`getRow` or a `return` statement; otherwise, the query server will
+ implicitly call this function with the empty object (``{}``).
+
+ .. code-block:: javascript
+
+ function(head, req){
+ start({
+ "code": 302,
+ "headers": {
+ "Location": "http://couchdb.apache.org"
+ }
+ });
+ return "Relax!";
+ }
.. function:: sum(arr)
- Sum `arr`'s items.
-
- :param arr: Array of numbers
- :rtype: number
+ Sum `arr`'s items.
+ :param arr: Array of numbers
+ :rtype: number
.. function:: toJSON(obj)
- Encodes `obj` to JSON string. This is an alias for the ``JSON.stringify``
- method.
+ Encodes `obj` to JSON string. This is an alias for the ``JSON.stringify``
+ method.
- :param obj: JSON encodable object
- :return: JSON string
+ :param obj: JSON encodable object
+ :return: JSON string
.. _commonjs:
CommonJS Modules
-----------------
+================
Support for `CommonJS Modules <http://wiki.commonjs.org/wiki/Modules/1.1.1>`_
(introduced in CouchDB 0.11.0) allows you to create modular design functions
@@ -246,10 +236,10 @@ Here's a CommonJS module that checks user permissions:
.. code-block:: javascript
function user_context(userctx, secobj) {
- var is_admin = function() {
- return userctx.indexOf('_admin') != -1;
- }
- return {'is_admin': is_admin}
+ var is_admin = function() {
+ return userctx.indexOf('_admin') != -1;
+ }
+ return {'is_admin': is_admin}
}
exports['user'] = user_context
@@ -270,16 +260,16 @@ The CommonJS module can be added to a design document, like so:
.. code-block:: javascript
{
- "views": {
- "lib": {
- "security": "function user_context(userctx, secobj) { ... }"
- }
- },
- "validate_doc_update": "function(newdoc, olddoc, userctx, secobj) {
- user = require('lib/security').user(userctx, secobj);
- return user.is_admin();
- }"
- "_id": "_design/test"
+ "views": {
+ "lib": {
+ "security": "function user_context(userctx, secobj) { ... }"
+ }
+ },
+ "validate_doc_update": "function(newdoc, olddoc, userctx, secobj) {
+ user = require('lib/security').user(userctx, secobj);
+ return user.is_admin();
+ }"
+ "_id": "_design/test"
}
Modules paths are relative to the design document's ``views`` object, but
http://git-wip-us.apache.org/repos/asf/couchdb-documentation/blob/e5d2fc8e/src/query-server/protocol.rst
----------------------------------------------------------------------
diff --git a/src/query-server/protocol.rst b/src/query-server/protocol.rst
index 7b56eb5..049a59d 100644
--- a/src/query-server/protocol.rst
+++ b/src/query-server/protocol.rst
@@ -10,7 +10,6 @@
.. License for the specific language governing permissions and limitations under
.. the License.
-
.. _query-server/protocol:
=====================
@@ -27,9 +26,9 @@ the Query Server are always `array`-typed that could be matched by the pattern
``[<command>, <*arguments>]\n``.
.. note::
- To simplify examples reading we omitted trailing ``\n`` character to let
- Sphinx highlight them well. Also, all examples contain formatted JSON values
- while real data transfers in compact mode without formatting spaces.
+ To simplify examples reading we omitted trailing ``\n`` character to let
+ Sphinx highlight them well. Also, all examples contain formatted JSON values
+ while real data transfers in compact mode without formatting spaces.
.. _qs/reset:
@@ -62,7 +61,6 @@ The Query Server answers::
true
-
.. _qs/add_lib:
``add_lib``
@@ -77,24 +75,22 @@ in `map` functions.
CouchDB sends::
- [
- "add_lib",
- {
- "utils": "exports.MAGIC = 42;"
- }
- ]
+ [
+ "add_lib",
+ {
+ "utils": "exports.MAGIC = 42;"
+ }
+ ]
The Query Server answers::
- true
-
+ true
.. note::
-
- This library shouldn't have any side effects nor track its own state
- or you'll have a lot of happy debugging time if something went wrong.
- Remember that a complete index rebuild is a heavy operation and this is
- the only way to fix your mistakes with shared state.
+ This library shouldn't have any side effects nor track its own state
+ or you'll have a lot of happy debugging time if something went wrong.
+ Remember that a complete index rebuild is a heavy operation and this is
+ the only way to fix your mistakes with shared state.
.. _qs/add_fun:
@@ -114,15 +110,14 @@ actual documents.
CouchDB sends::
[
- "add_fun",
- "function(doc) { if(doc.score > 50) emit(null, {'player_name': doc.name}); }"
+ "add_fun",
+ "function(doc) { if(doc.score > 50) emit(null, {'player_name': doc.name}); }"
]
The Query Server answers::
true
-
.. _qs/map_doc:
``map_doc``
@@ -141,21 +136,21 @@ string.
CouchDB sends::
[
- "map_doc",
- {
- "_id": "8877AFF9789988EE",
- "_rev": "3-235256484",
- "name": "John Smith",
- "score": 60
- }
+ "map_doc",
+ {
+ "_id": "8877AFF9789988EE",
+ "_rev": "3-235256484",
+ "name": "John Smith",
+ "score": 60
+ }
]
If the function above is the only function stored, the Query Server answers::
[
- [
- [null, {"player_name": "John Smith"}]
- ]
+ [
+ [null, {"player_name": "John Smith"}]
+ ]
]
That is, an array with the result for every function for the given document.
@@ -165,20 +160,19 @@ If a document is to be excluded from the view, the array should be empty.
CouchDB sends::
[
- "map_doc",
- {
- "_id": "9590AEB4585637FE",
- "_rev": "1-674684684",
- "name": "Jane Parker",
- "score": 43
- }
+ "map_doc",
+ {
+ "_id": "9590AEB4585637FE",
+ "_rev": "1-674684684",
+ "name": "Jane Parker",
+ "score": 43
+ }
]
The Query Server answers::
[[]]
-
.. _qs/reduce:
``reduce``
@@ -186,9 +180,11 @@ The Query Server answers::
:Command: ``reduce``
:Arguments:
- - Reduce function source
- - Array of :ref:`map function <mapfun>` results where each item represented
- in format ``[[key, id-of-doc], value]``
+
+ - Reduce function source
+ - Array of :ref:`map function <mapfun>` results where each item represented
+ in format ``[[key, id-of-doc], value]``
+
:Returns: Array with pair values: ``true`` and another array with reduced result
If the view has a reduce function defined, CouchDB will enter into the reduce
@@ -197,24 +193,24 @@ results on which it can apply them.
CouchDB sends::
- [
- "reduce",
[
- "function(k, v) { return sum(v); }"
- ],
- [
- [[1, "699b524273605d5d3e9d4fd0ff2cb272"], 10],
- [[2, "c081d0f69c13d2ce2050d684c7ba2843"], 20],
- [[null, "foobar"], 3]
+ "reduce",
+ [
+ "function(k, v) { return sum(v); }"
+ ],
+ [
+ [[1, "699b524273605d5d3e9d4fd0ff2cb272"], 10],
+ [[2, "c081d0f69c13d2ce2050d684c7ba2843"], 20],
+ [[null, "foobar"], 3]
+ ]
]
- ]
The Query Server answers::
- [
- true,
- [33]
- ]
+ [
+ true,
+ [33]
+ ]
Note that even though the view server receives the map results in the form
``[[key, id-of-doc], value]``, the function may receive them in a different
@@ -227,9 +223,10 @@ keys and the list of values.
============
:Command: ``rereduce``
-:Arguments:
- - Reduce function source
- - List of values
+:Arguments:
+
+ - Reduce function source
+ - List of values
When building a view, CouchDB will apply the reduce step directly to the output
of the map step and the rereduce step to the output of a previous reduce step.
@@ -239,25 +236,24 @@ document ids, to the rereduce step.
CouchDB sends::
- [
- "rereduce",
- [
- "function(k, v, r) { return sum(v); }"
- ],
[
- 33,
- 55,
- 66
+ "rereduce",
+ [
+ "function(k, v, r) { return sum(v); }"
+ ],
+ [
+ 33,
+ 55,
+ 66
+ ]
]
- ]
The Query Server answers::
- [
- true,
- [154]
- ]
-
+ [
+ true,
+ [154]
+ ]
.. _qs/ddoc:
@@ -267,25 +263,23 @@ The Query Server answers::
:Command: ``ddoc``
:Arguments: Array of objects.
- - First phase (ddoc initialization):
+ - First phase (ddoc initialization):
- - ``"new"``
- - Design document ``_id``
- - Design document object
+ - ``"new"``
+ - Design document ``_id``
+ - Design document object
- - Second phase (design function execution):
+ - Second phase (design function execution):
- - Design document ``_id``
- - Function path as an array of object keys
- - Array of function arguments
+ - Design document ``_id``
+ - Function path as an array of object keys
+ - Array of function arguments
:Returns:
- - First phase (ddoc initialization): ``true``
- - Second phase (design function execution): custom object depending on
- executed function
-
-
+ - First phase (ddoc initialization): ``true``
+ - Second phase (design function execution): custom object depending on
+ executed function
This command acts in two phases: `ddoc` registration and `design function`
execution.
@@ -295,39 +289,36 @@ Server to let it cache it by ``_id`` value for further function execution.
To do this, CouchDB sends::
- [
- "ddoc",
- "new",
- "_design/temp",
- {
- "_id": "_design/temp",
- "_rev": "8-d7379de23a751dc2a19e5638a7bbc5cc",
- "language": "javascript",
- "shows": {
- "request": "function(doc,req){ return {json: req}; }",
- "hello": "function(doc,req){ return {body: 'Hello, ' + (doc || {})._id + '!'}; }"
- }
- }
- ]
+ [
+ "ddoc",
+ "new",
+ "_design/temp",
+ {
+ "_id": "_design/temp",
+ "_rev": "8-d7379de23a751dc2a19e5638a7bbc5cc",
+ "language": "javascript",
+ "shows": {
+ "request": "function(doc,req){ return {json: req}; }",
+ "hello": "function(doc,req){ return {body: 'Hello, ' + (doc || {})._id + '!'}; }"
+ }
+ }
+ ]
The Query Server answers::
- true
-
+ true
After than this design document is ready to serve next subcommands - that's the
second phase.
.. note::
+ Each ``ddoc`` subcommand is the root design document key, so they are not
+ actually subcommands, but first elements of the JSON path that may be handled
+ and processed.
- Each ``ddoc`` subcommand is the root design document key, so they are not
- actually subcommands, but first elements of the JSON path that may be handled
- and processed.
-
- The pattern for subcommand execution is common:
-
- ``["ddoc", <design_doc_id>, [<subcommand>, <funcname>], [<argument1>, <argument2>, ...]]``
+ The pattern for subcommand execution is common:
+ ``["ddoc", <design_doc_id>, [<subcommand>, <funcname>], [<argument1>, <argument2>, ...]]``
.. _qs/ddoc/shows:
@@ -338,90 +329,89 @@ second phase.
:SubCommand: ``shows``
:Arguments:
- - Document object or ``null`` if document `id` wasn't specified in request
- - :ref:`request_object`
+ - Document object or ``null`` if document `id` wasn't specified in request
+ - :ref:`request_object`
:Returns: Array with two elements:
- - ``"resp"``
- - :ref:`response_object`
+ - ``"resp"``
+ - :ref:`response_object`
Executes :ref:`show function <showfun>`.
Couchdb sends::
- [
- "ddoc",
- "_design/temp",
- [
- "shows",
- "doc"
- ],
[
- null,
- {
- "info": {
- "db_name": "test",
- "doc_count": 8,
- "doc_del_count": 0,
- "update_seq": 105,
- "purge_seq": 0,
- "compact_running": false,
- "disk_size": 15818856,
- "data_size": 1535048,
- "instance_start_time": "1359952188595857",
- "disk_format_version": 6,
- "committed_update_seq": 105
- },
- "id": null,
- "uuid": "169cb4cc82427cc7322cb4463d0021bb",
- "method": "GET",
- "requested_path": [
- "api",
- "_design",
- "temp",
- "_show",
- "request"
- ],
- "path": [
- "api",
- "_design",
- "temp",
- "_show",
- "request"
+ "ddoc",
+ "_design/temp",
+ [
+ "shows",
+ "doc"
],
- "raw_path": "/api/_design/temp/_show/request",
- "query": {},
- "headers": {
- "Accept": "*/*",
- "Host": "localhost:5984",
- "User-Agent": "curl/7.26.0"
- },
- "body": "undefined",
- "peer": "127.0.0.1",
- "form": {},
- "cookie": {},
- "userCtx": {
- "db": "api",
- "name": null,
- "roles": [
- "_admin"
- ]
- },
- "secObj": {}
- }
+ [
+ null,
+ {
+ "info": {
+ "db_name": "test",
+ "doc_count": 8,
+ "doc_del_count": 0,
+ "update_seq": 105,
+ "purge_seq": 0,
+ "compact_running": false,
+ "disk_size": 15818856,
+ "data_size": 1535048,
+ "instance_start_time": "1359952188595857",
+ "disk_format_version": 6,
+ "committed_update_seq": 105
+ },
+ "id": null,
+ "uuid": "169cb4cc82427cc7322cb4463d0021bb",
+ "method": "GET",
+ "requested_path": [
+ "api",
+ "_design",
+ "temp",
+ "_show",
+ "request"
+ ],
+ "path": [
+ "api",
+ "_design",
+ "temp",
+ "_show",
+ "request"
+ ],
+ "raw_path": "/api/_design/temp/_show/request",
+ "query": {},
+ "headers": {
+ "Accept": "*/*",
+ "Host": "localhost:5984",
+ "User-Agent": "curl/7.26.0"
+ },
+ "body": "undefined",
+ "peer": "127.0.0.1",
+ "form": {},
+ "cookie": {},
+ "userCtx": {
+ "db": "api",
+ "name": null,
+ "roles": [
+ "_admin"
+ ]
+ },
+ "secObj": {}
+ }
+ ]
]
- ]
The Query Server sends::
- [
- "resp",
- {
- "body": "Hello, undefined!"
- }
- ]
-
+ [
+ "resp",
+ {
+ "body": "Hello, undefined!"
+ }
+ ]
.. _qs/ddoc/lists:
@@ -432,8 +422,8 @@ The Query Server sends::
:SubCommand: ``lists``
:Arguments:
- - :ref:`view_head_info_object`:
- - :ref:`request_object`
+ - :ref:`view_head_info_object`:
+ - :ref:`request_object`
:Returns: Array. See below for details.
@@ -444,23 +434,23 @@ an example for illustration.
Let's assume that we have view a function that emits `id-rev` pairs::
- function(doc) {
- emit(doc._id, doc._rev);
- }
+ function(doc) {
+ emit(doc._id, doc._rev);
+ }
And we'd like to emulate ``_all_docs`` JSON response with list function. Our
*first* version of the list functions looks like this::
- function(head, req){
- start({'headers': {'Content-Type': 'application/json'}});
- var resp = head;
- var rows = [];
- while(row=getRow()){
- rows.push(row);
+ function(head, req){
+ start({'headers': {'Content-Type': 'application/json'}});
+ var resp = head;
+ var rows = [];
+ while(row=getRow()){
+ rows.push(row);
+ }
+ resp.rows = rows;
+ return toJSON(resp);
}
- resp.rows = rows;
- return toJSON(resp);
- }
The whole communication session during list function execution could be divided
on three parts:
@@ -469,7 +459,7 @@ on three parts:
The first returned object from list function is an array of next structure::
- ["start", <chunks>, <headers>]
+ ["start", <chunks>, <headers>]
Where ``<chunks>`` is an array of text chunks that will be sent to client
and ``<headers>`` is an object with response HTTP headers.
@@ -477,15 +467,15 @@ on three parts:
This message is sent from the Query Server to CouchDB on the
:js:func:`start` call which initialize HTTP response to the client::
- [
- "start",
- [],
- {
- "headers": {
- "Content-Type": "application/json"
- }
- }
- ]
+ [
+ "start",
+ [],
+ {
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+ ]
After this, the list function may start to process view rows.
@@ -498,29 +488,28 @@ on three parts:
CouchDB sends a special array that carries view row data::
- [
- "list_row",
- {
- "id": "0cb42c267fe32d4b56b3500bc503e030",
- "key": "0cb42c267fe32d4b56b3500bc503e030",
- "value": "1-967a00dff5e02add41819138abb3284d"
- }
- ]
+ [
+ "list_row",
+ {
+ "id": "0cb42c267fe32d4b56b3500bc503e030",
+ "key": "0cb42c267fe32d4b56b3500bc503e030",
+ "value": "1-967a00dff5e02add41819138abb3284d"
+ }
+ ]
If Query Server has something to return on this, it returns an array with a
``"chunks"`` item in the head and an array of data in the tail. Now, for our
case it has nothing to return, so the response will be::
- [
- "chunks",
- []
- ]
+ [
+ "chunks",
+ []
+ ]
When there is no more view rows to process, CouchDB sends special message,
that signs about that there is no more data to send from its side::
- ["list_end"]
-
+ ["list_end"]
#. Finalization
@@ -530,12 +519,12 @@ on three parts:
For our example the last message will be the next::
- [
- "end",
[
- "{\"total_rows\":2,\"offset\":0,\"rows\":[{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"},{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}]}"
+ "end",
+ [
+ "{\"total_rows\":2,\"offset\":0,\"rows\":[{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"},{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}]}"
+ ]
]
- ]
There, we had made a big mistake: we had returned out result in a single
message from the Query Server. That's ok when there are only a few rows in the
@@ -544,33 +533,33 @@ rows
Let's fix our list function and see the changes in communication::
- function(head, req){
- start({'headers': {'Content-Type': 'application/json'}});
- send('{');
- send('"total_rows":' + toJSON(head.total_rows) + ',');
- send('"offset":' + toJSON(head.offset) + ',');
- send('"rows":[');
- if (row=getRow()){
- send(toJSON(row));
- }
- while(row=getRow()){
- send(',' + toJSON(row));
+ function(head, req){
+ start({'headers': {'Content-Type': 'application/json'}});
+ send('{');
+ send('"total_rows":' + toJSON(head.total_rows) + ',');
+ send('"offset":' + toJSON(head.offset) + ',');
+ send('"rows":[');
+ if (row=getRow()){
+ send(toJSON(row));
+ }
+ while(row=getRow()){
+ send(',' + toJSON(row));
+ }
+ send(']');
+ return '}';
}
- send(']');
- return '}';
- }
"Wait, what?" - you'd like to ask. Yes, we'd build JSON response manually by
string chunks, but let's take a look on logs::
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["start",["{","\"total_rows\":2,","\"offset\":0,","\"rows\":["],{"headers":{"Content-Type":"application/json"}}]
- [Wed, 24 Jul 2013 05:45:30 GMT] [info] [<0.18963.1>] 127.0.0.1 - - GET /blog/_design/post/_list/index/all_docs 200
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"0cb42c267fe32d4b56b3500bc503e030","key":"0cb42c267fe32d4b56b3500bc503e030","value":"1-967a00dff5e02add41819138abb3284d"}]
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",["{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"431926a69504bde41851eb3c18a27b1f","key":"431926a69504bde41851eb3c18a27b1f","value":"1-967a00dff5e02add41819138abb3284d"}]
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",[",{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_end"]
- [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["end",["]","}"]]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["start",["{","\"total_rows\":2,","\"offset\":0,","\"rows\":["],{"headers":{"Content-Type":"application/json"}}]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [info] [<0.18963.1>] 127.0.0.1 - - GET /blog/_design/post/_list/index/all_docs 200
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"0cb42c267fe32d4b56b3500bc503e030","key":"0cb42c267fe32d4b56b3500bc503e030","value":"1-967a00dff5e02add41819138abb3284d"}]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",["{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"431926a69504bde41851eb3c18a27b1f","key":"431926a69504bde41851eb3c18a27b1f","value":"1-967a00dff5e02add41819138abb3284d"}]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",[",{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_end"]
+ [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["end",["]","}"]]
Note, that now the Query Server sends response by lightweight chunks and if
our communication process was extremely slow, the client will see how response
@@ -586,14 +575,14 @@ result, like they have for our previous list function.
:SubCommand: ``updates``
:Arguments:
- - Document object or ``null`` if document `id` wasn't specified in request
- - :ref:`request_object`
+ - Document object or ``null`` if document `id` wasn't specified in request
+ - :ref:`request_object`
:Returns: Array with there elements:
- - ``"up"``
- - Document object or ``null`` if nothing should be stored
- - :ref:`response_object`
+ - ``"up"``
+ - Document object or ``null`` if nothing should be stored
+ - :ref:`response_object`
Executes :ref:`update function <updatefun>`.
@@ -665,23 +654,22 @@ CouchDB sends::
The Query Server answers::
- [
- "up",
- null,
- {"body": "document id wasn't provided"}
- ]
+ [
+ "up",
+ null,
+ {"body": "document id wasn't provided"}
+ ]
or in case of successful update::
- [
- "up",
- {
- "_id": "7b695cb34a03df0316c15ab529002e69",
- "hello": "world!"
- },
- {"body": "document was updated"}
- ]
-
+ [
+ "up",
+ {
+ "_id": "7b695cb34a03df0316c15ab529002e69",
+ "hello": "world!"
+ },
+ {"body": "document was updated"}
+ ]
.. _qs/ddoc/filters:
@@ -692,112 +680,110 @@ or in case of successful update::
:SubCommand: ``filters``
:Arguments:
- - Array of document objects
- - :ref:`request_object`
+ - Array of document objects
+ - :ref:`request_object`
:Returns: Array of two elements:
- - ``true``
- - Array of booleans in the same order of input documents.
+ - ``true``
+ - Array of booleans in the same order of input documents.
Executes :ref:`filter function <filterfun>`.
CouchDB sends::
- [
- "ddoc",
- "_design/test",
- [
- "filters",
- "random"
- ],
- [
- [
- {
- "_id": "431926a69504bde41851eb3c18a27b1f",
- "_rev": "1-967a00dff5e02add41819138abb3284d",
- "_revisions": {
- "start": 1,
- "ids": [
- "967a00dff5e02add41819138abb3284d"
- ]
- }
- },
- {
- "_id": "0cb42c267fe32d4b56b3500bc503e030",
- "_rev": "1-967a00dff5e02add41819138abb3284d",
- "_revisions": {
- "start": 1,
- "ids": [
- "967a00dff5e02add41819138abb3284d"
- ]
- }
- }
- ],
- {
- "info": {
- "db_name": "test",
- "doc_count": 5,
- "doc_del_count": 0,
- "update_seq": 19,
- "purge_seq": 0,
- "compact_running": false,
- "disk_size": 8056936,
- "data_size": 7979745,
- "instance_start_time": "1374612186131612",
- "disk_format_version": 6,
- "committed_update_seq": 19
- },
- "id": null,
- "uuid": "7b695cb34a03df0316c15ab529023a81",
- "method": "GET",
- "requested_path": [
- "test",
- "_changes?filter=test",
- "random"
- ],
- "path": [
- "test",
- "_changes"
- ],
- "raw_path": "/test/_changes?filter=test/random",
- "query": {
- "filter": "test/random"
- },
- "headers": {
- "Accept": "application/json",
- "Accept-Encoding": "identity, gzip, deflate, compress",
- "Content-Length": "0",
- "Content-Type": "application/json; charset=utf-8",
- "Host": "localhost:5984"
- },
- "body": "",
- "peer": "127.0.0.1",
- "form": {},
- "cookie": {},
- "userCtx": {
- "db": "test",
- "name": null,
- "roles": [
- "_admin"
- ]
- },
- "secObj": {}
- }
- ]
- ]
+ [
+ "ddoc",
+ "_design/test",
+ [
+ "filters",
+ "random"
+ ],
+ [
+ [
+ {
+ "_id": "431926a69504bde41851eb3c18a27b1f",
+ "_rev": "1-967a00dff5e02add41819138abb3284d",
+ "_revisions": {
+ "start": 1,
+ "ids": [
+ "967a00dff5e02add41819138abb3284d"
+ ]
+ }
+ },
+ {
+ "_id": "0cb42c267fe32d4b56b3500bc503e030",
+ "_rev": "1-967a00dff5e02add41819138abb3284d",
+ "_revisions": {
+ "start": 1,
+ "ids": [
+ "967a00dff5e02add41819138abb3284d"
+ ]
+ }
+ }
+ ],
+ {
+ "info": {
+ "db_name": "test",
+ "doc_count": 5,
+ "doc_del_count": 0,
+ "update_seq": 19,
+ "purge_seq": 0,
+ "compact_running": false,
+ "disk_size": 8056936,
+ "data_size": 7979745,
+ "instance_start_time": "1374612186131612",
+ "disk_format_version": 6,
+ "committed_update_seq": 19
+ },
+ "id": null,
+ "uuid": "7b695cb34a03df0316c15ab529023a81",
+ "method": "GET",
+ "requested_path": [
+ "test",
+ "_changes?filter=test",
+ "random"
+ ],
+ "path": [
+ "test",
+ "_changes"
+ ],
+ "raw_path": "/test/_changes?filter=test/random",
+ "query": {
+ "filter": "test/random"
+ },
+ "headers": {
+ "Accept": "application/json",
+ "Accept-Encoding": "identity, gzip, deflate, compress",
+ "Content-Length": "0",
+ "Content-Type": "application/json; charset=utf-8",
+ "Host": "localhost:5984"
+ },
+ "body": "",
+ "peer": "127.0.0.1",
+ "form": {},
+ "cookie": {},
+ "userCtx": {
+ "db": "test",
+ "name": null,
+ "roles": [
+ "_admin"
+ ]
+ },
+ "secObj": {}
+ }
+ ]
+ ]
The Query Server answers::
- [
- true,
[
- true,
- false
+ true,
+ [
+ true,
+ false
+ ]
]
- ]
-
-
.. _qs/ddoc/views:
@@ -809,8 +795,8 @@ The Query Server answers::
:Arguments: Array of document objects
:Returns: Array of two elements:
- - ``true``
- - Array of booleans in the same order of input documents.
+ - ``true``
+ - Array of booleans in the same order of input documents.
.. versionadded:: 1.2
@@ -827,10 +813,10 @@ Acts in the same way as :ref:`qs/ddoc/filters` command.
:SubCommand: ``validate_doc_update``
:Arguments:
- - Document object that will be stored
- - Document object that will be replaced
- - :ref:`userctx_object`
- - :ref:`security_object`
+ - Document object that will be stored
+ - Document object that will be replaced
+ - :ref:`userctx_object`
+ - :ref:`security_object`
:Returns: ``1``
@@ -838,43 +824,41 @@ Executes :ref:`validation function <vdufun>`.
CouchDB send::
- [
- "ddoc",
- "_design/id",
- ["validate_doc_update"],
[
- {
- "_id": "docid",
- "_rev": "2-e0165f450f6c89dc6b071c075dde3c4d",
- "score": 10
- },
- {
- "_id": "docid",
- "_rev": "1-9f798c6ad72a406afdbf470b9eea8375",
- "score": 4
- },
- {
- "name": "Mike",
- "roles": ["player"]
- },
- {
- "admins": {},
- "members": []
- }
+ "ddoc",
+ "_design/id",
+ ["validate_doc_update"],
+ [
+ {
+ "_id": "docid",
+ "_rev": "2-e0165f450f6c89dc6b071c075dde3c4d",
+ "score": 10
+ },
+ {
+ "_id": "docid",
+ "_rev": "1-9f798c6ad72a406afdbf470b9eea8375",
+ "score": 4
+ },
+ {
+ "name": "Mike",
+ "roles": ["player"]
+ },
+ {
+ "admins": {},
+ "members": []
+ }
+ ]
]
- ]
The Query Server answers::
- 1
+ 1
.. note::
-
- While the only valid response for this command is ``true`` to prevent
- document save the Query Server need to raise an error: ``forbidden`` or
- ``unauthorized`` - these errors will be turned into correct ``HTTP 403`` and
- ``HTTP 401`` responses respectively.
-
+ While the only valid response for this command is ``true`` to prevent
+ document save the Query Server need to raise an error: ``forbidden`` or
+ ``unauthorized`` - these errors will be turned into correct ``HTTP 403`` and
+ ``HTTP 401`` responses respectively.
.. _qs/errors:
@@ -904,7 +888,7 @@ to CouchDB. All errors are logically divided into two groups:
To raise an error, the Query Server have to answer::
- ["error", "error_name", "reason why"]
+ ["error", "error_name", "reason why"]
The ``"error_name"`` helps to classify problems by their type e.g. if it's
``"value_error"`` so probably user have entered wrong data, ``"not_found"``
@@ -914,11 +898,10 @@ invalid and non expected input from user.
The ``"reason why"`` is the error message that explains why it raised and, if
possible, what is needed to do to fix it.
-For example, calling :ref:`updatefun` against non existent document could produce
-next error message::
-
- ["error", "not_found", "Update function requires existent document"]
+For example, calling :ref:`updatefun` against non existent document could
+produce next error message::
+ ["error", "not_found", "Update function requires existent document"]
.. _qs/error/forbidden:
@@ -933,8 +916,7 @@ with error information object.
To raise this error, the Query Server have to answer::
- {"forbidden": "reason why"}
-
+ {"forbidden": "reason why"}
.. _qs/error/unauthorized:
@@ -949,7 +931,7 @@ information object.
To raise this error, the Query Server have to answer::
- {"unauthorized": "reason why"}
+ {"unauthorized": "reason why"}
.. _qs/log:
@@ -960,10 +942,10 @@ At any time, the Query Server may send some information that will be saved in
CouchDB's log file. This is done by sending a special object with just one
field, log, on a separate line::
- ["log", "some message"]
+ ["log", "some message"]
CouchDB responds nothing, but writes received message into log file::
- [Sun, 13 Feb 2009 23:31:30 GMT] [info] [<0.72.0>] Query Server Log Message: some message
+ [Sun, 13 Feb 2009 23:31:30 GMT] [info] [<0.72.0>] Query Server Log Message: some message
These messages are only logged at :config:option:`info level <log/level>`.