You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2023/02/24 22:07:36 UTC
[couchdb] 01/04: hide shard-sync and purge documents from `_local_docs`
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 7a2705ac67fe4ac6072224f87174fa41da7e274e
Author: Christian Kruse <cj...@defunct.ch>
AuthorDate: Sun Feb 19 09:41:45 2023 +0100
hide shard-sync and purge documents from `_local_docs`
It hides the shard-sync and purge documents from the response unless a `?include_system=true` is given.
Fixes #3930
---
src/chttpd/src/chttpd_db.erl | 9 ++++-
src/couch_mrview/src/couch_mrview.erl | 69 ++++++++++++++++++++---------------
2 files changed, 47 insertions(+), 31 deletions(-)
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index 748b356fd..db506e8e2 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -938,10 +938,11 @@ all_docs_view(Req, Db, Keys, OP) ->
Args1 = Args0#mrargs{view_type = map},
Args2 = fabric_util:validate_all_docs_args(Db, Args1),
Args3 = set_namespace(OP, Args2),
+ Args4 = set_include_sysdocs(OP, Req, Args3),
Options = [{user_ctx, Req#httpd.user_ctx}],
Max = chttpd:chunked_response_buffer_size(),
VAcc = #vacc{db = Db, req = Req, threshold = Max},
- {ok, Resp} = fabric:all_docs(Db, Options, fun view_cb/2, VAcc, Args3),
+ {ok, Resp} = fabric:all_docs(Db, Options, fun view_cb/2, VAcc, Args4),
{ok, Resp#vacc.resp}.
view_cb({row, Row} = Msg, Acc) ->
@@ -2286,6 +2287,12 @@ set_namespace(<<"_design_docs">>, Args) ->
set_namespace(NS, #mrargs{} = Args) ->
couch_mrview_util:set_extra(Args, namespace, NS).
+set_include_sysdocs(<<"_local_docs">>, Req, Args) ->
+ Val = chttpd:qs_value(Req, "include_system", "false") == "true",
+ couch_mrview_util:set_extra(Args, include_system, Val);
+set_include_sysdocs(_OP, _Req, Args) ->
+ Args.
+
%% /db/_bulk_get stuff
bulk_get_is_multipart(#httpd{mochi_req = MochiReq}) ->
diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl
index d8640c903..3616af7df 100644
--- a/src/couch_mrview/src/couch_mrview.erl
+++ b/src/couch_mrview/src/couch_mrview.erl
@@ -531,36 +531,45 @@ map_fold({{Key, Id}, Val}, _Offset, Acc) ->
user_acc = UAcc1,
last_go = Go
}};
-map_fold(#doc{id = <<"_local/", _/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
- #mracc{
- limit = Limit,
- callback = Callback,
- user_acc = UAcc0,
- args = Args
- } = Acc,
- #doc{
- id = DocId,
- revs = {Pos, [RevId | _]}
- } = Doc,
- Rev = {Pos, RevId},
- Row =
- [
- {id, DocId},
- {key, DocId},
- {value, {[{rev, couch_doc:rev_to_str(Rev)}]}}
- ] ++
- if
- not Args#mrargs.include_docs -> [];
- true -> [{doc, couch_doc:to_json_obj(Doc, Args#mrargs.doc_options)}]
- end,
- {Go, UAcc1} = Callback({row, Row}, UAcc0),
- {Go, Acc#mracc{
- limit = Limit - 1,
- reduce_fun = undefined,
- doc_info = undefined,
- user_acc = UAcc1,
- last_go = Go
- }}.
+map_fold(#doc{id = <<"_local/", IdTail/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
+ IncludeSys = couch_util:get_value(include_system, Acc#mracc.args#mrargs.extra),
+
+ case {IncludeSys, IdTail} of
+ {false, <<"purge-", _/binary>>} ->
+ {ok, Acc};
+ {false, <<"shard-sync", _/binary>>} ->
+ {ok, Acc};
+ _ ->
+ #mracc{
+ limit = Limit,
+ callback = Callback,
+ user_acc = UAcc0,
+ args = Args
+ } = Acc,
+ #doc{
+ id = DocId,
+ revs = {Pos, [RevId | _]}
+ } = Doc,
+ Rev = {Pos, RevId},
+ Row =
+ [
+ {id, DocId},
+ {key, DocId},
+ {value, {[{rev, couch_doc:rev_to_str(Rev)}]}}
+ ] ++
+ if
+ not Args#mrargs.include_docs -> [];
+ true -> [{doc, couch_doc:to_json_obj(Doc, Args#mrargs.doc_options)}]
+ end,
+ {Go, UAcc1} = Callback({row, Row}, UAcc0),
+ {Go, Acc#mracc{
+ limit = Limit - 1,
+ reduce_fun = undefined,
+ doc_info = undefined,
+ user_acc = UAcc1,
+ last_go = Go
+ }}
+ end.
red_fold(Db, {NthRed, _Lang, View} = RedView, Args, Callback, UAcc) ->
Finalizer =