summaryrefslogtreecommitdiff
path: root/src/couchdb
diff options
context:
space:
mode:
authorJohn Christopher Anderson <jchris@apache.org>2009-02-13 20:52:28 +0000
committerJohn Christopher Anderson <jchris@apache.org>2009-02-13 20:52:28 +0000
commit4b691efb97cbbe3b0150c59c25d97882260a4984 (patch)
tree601287d898553f9623591ffc70781acbe566e606 /src/couchdb
parenteb81ff32d07cb8cbe1a13a495a2aabd968313821 (diff)
apply COUCHDB-252.
Allow _list functions to signal that iteration of the view should cease. Thanks davisp. git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@744240 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb')
-rw-r--r--src/couchdb/couch_db.hrl1
-rw-r--r--src/couchdb/couch_httpd_external.erl2
-rw-r--r--src/couchdb/couch_httpd_show.erl6
-rw-r--r--src/couchdb/couch_httpd_view.erl16
4 files changed, 18 insertions, 7 deletions
diff --git a/src/couchdb/couch_db.hrl b/src/couchdb/couch_db.hrl
index 1afea912..5b8b74ef 100644
--- a/src/couchdb/couch_db.hrl
+++ b/src/couchdb/couch_db.hrl
@@ -162,6 +162,7 @@
-record(extern_resp_args, {
code = 200,
+ stop = false,
data = <<>>,
ctype = "application/json",
headers = []
diff --git a/src/couchdb/couch_httpd_external.erl b/src/couchdb/couch_httpd_external.erl
index 5f63ac0e..2e25705b 100644
--- a/src/couchdb/couch_httpd_external.erl
+++ b/src/couchdb/couch_httpd_external.erl
@@ -106,6 +106,8 @@ parse_external_response({Response}) ->
Args;
{<<"code">>, Value} ->
Args#extern_resp_args{code=Value};
+ {<<"stop">>, true} ->
+ Args#extern_resp_args{stop=true};
{<<"json">>, Value} ->
Args#extern_resp_args{
data=?JSON_ENCODE(Value),
diff --git a/src/couchdb/couch_httpd_show.erl b/src/couchdb/couch_httpd_show.erl
index 2771a1c9..1da8fe98 100644
--- a/src/couchdb/couch_httpd_show.erl
+++ b/src/couchdb/couch_httpd_show.erl
@@ -127,13 +127,17 @@ output_map_list(Req, Lang, ListSrc, View, Db, QueryArgs) ->
JsonResp = couch_query_servers:render_list_row(QueryServer,
Req, Db2, {{Key, DocId}, Value}),
#extern_resp_args{
+ stop = StopIter,
data = RowBody
} = couch_httpd_external:parse_external_response(JsonResp),
RowFront2 = case RowFront of
nil -> [];
_ -> RowFront
end,
- send_chunk(Resp, RowFront2 ++ binary_to_list(RowBody))
+ case StopIter of
+ true -> stop;
+ _ -> send_chunk(Resp, RowFront2 ++ binary_to_list(RowBody))
+ end
end,
FoldlFun = couch_httpd_view:make_view_fold_fun(Req, QueryArgs, Db, RowCount,
diff --git a/src/couchdb/couch_httpd_view.erl b/src/couchdb/couch_httpd_view.erl
index 7696bb0d..2674754e 100644
--- a/src/couchdb/couch_httpd_view.erl
+++ b/src/couchdb/couch_httpd_view.erl
@@ -416,13 +416,17 @@ make_view_fold_fun(Req, QueryArgs, Db,
Offset = ReduceCountFun(OffsetReds),
{ok, Resp2, BeginBody} = StartRespFun(Req, 200,
TotalViewCount, Offset),
- SendRowFun(Resp2, Db,
- {{Key, DocId}, Value}, BeginBody, IncludeDocs),
- {ok, {AccLimit - 1, 0, Resp2, AccRevRows}};
+ case SendRowFun(Resp2, Db,
+ {{Key, DocId}, Value}, BeginBody, IncludeDocs) of
+ stop -> {stop, {AccLimit - 1, 0, Resp2, AccRevRows}};
+ _ -> {ok, {AccLimit - 1, 0, Resp2, AccRevRows}}
+ end;
{_, AccLimit, _, Resp} when (AccLimit > 0) ->
- SendRowFun(Resp, Db,
- {{Key, DocId}, Value}, nil, IncludeDocs),
- {ok, {AccLimit - 1, 0, Resp, AccRevRows}}
+ case SendRowFun(Resp, Db,
+ {{Key, DocId}, Value}, nil, IncludeDocs) of
+ stop -> {stop, {AccLimit - 1, 0, Resp, AccRevRows}};
+ _ -> {ok, {AccLimit - 1, 0, Resp, AccRevRows}}
+ end
end
end.