diff options
author | John Christopher Anderson <jchris@apache.org> | 2009-02-13 20:52:28 +0000 |
---|---|---|
committer | John Christopher Anderson <jchris@apache.org> | 2009-02-13 20:52:28 +0000 |
commit | 4b691efb97cbbe3b0150c59c25d97882260a4984 (patch) | |
tree | 601287d898553f9623591ffc70781acbe566e606 /src/couchdb | |
parent | eb81ff32d07cb8cbe1a13a495a2aabd968313821 (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.hrl | 1 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_external.erl | 2 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_show.erl | 6 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_view.erl | 16 |
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. |