summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Avdey <eiri@eiri.ca>2017-07-05 15:36:19 -0300
committerEric Avdey <eiri@eiri.ca>2017-07-06 21:28:52 -0300
commit3195578e2d9fba7a3295af023b97c88b2ee462f8 (patch)
treea5beb692312e5a8efc954542d481b3297f615ccd
parent3b23d218c98c2a8d64991460e35f3956d5f35bc6 (diff)
downloadcouchdb-3195578e2d9fba7a3295af023b97c88b2ee462f8.tar.gz
Pass db open options to fabric_view_map
Pass database open options and user_ctx to query_view to allow proper access for _view and _list queries.
-rw-r--r--src/chttpd/src/chttpd_show.erl3
-rw-r--r--src/chttpd/src/chttpd_view.erl10
-rw-r--r--src/fabric/src/fabric.erl23
-rw-r--r--src/fabric/src/fabric_view_map.erl11
4 files changed, 30 insertions, 17 deletions
diff --git a/src/chttpd/src/chttpd_show.erl b/src/chttpd/src/chttpd_show.erl
index 63381ca4b..d8e2ea5c7 100644
--- a/src/chttpd/src/chttpd_show.erl
+++ b/src/chttpd/src/chttpd_show.erl
@@ -211,7 +211,8 @@ handle_view_list(Req, Db, DDoc, LName, {ViewDesignName, ViewName}, Keys) ->
<<"_all_docs">> ->
fabric:all_docs(Db, Options, CB, Acc, QueryArgs);
_ ->
- fabric:query_view(Db, VDoc, ViewName, CB, Acc, QueryArgs)
+ fabric:query_view(Db, Options, VDoc, ViewName,
+ CB, Acc, QueryArgs)
end
end).
diff --git a/src/chttpd/src/chttpd_view.erl b/src/chttpd/src/chttpd_view.erl
index 32b646960..52c96cd3b 100644
--- a/src/chttpd/src/chttpd_view.erl
+++ b/src/chttpd/src/chttpd_view.erl
@@ -26,12 +26,14 @@ multi_query_view(Req, Db, DDoc, ViewName, Queries) ->
QueryArg1 = couch_mrview_util:set_view_type(QueryArg, ViewName, Views),
couch_mrview_util:validate_args(QueryArg1)
end, Queries),
+ Options = [{user_ctx, Req#httpd.user_ctx}],
VAcc0 = #vacc{db=Db, req=Req, prepend="\r\n"},
FirstChunk = "{\"results\":[",
{ok, Resp0} = chttpd:start_delayed_json_response(VAcc0#vacc.req, 200, [], FirstChunk),
VAcc1 = VAcc0#vacc{resp=Resp0},
VAcc2 = lists:foldl(fun(Args, Acc0) ->
- {ok, Acc1} = fabric:query_view(Db, DDoc, ViewName, fun couch_mrview_http:view_cb/2, Acc0, Args),
+ {ok, Acc1} = fabric:query_view(Db, Options, DDoc, ViewName,
+ fun couch_mrview_http:view_cb/2, Acc0, Args),
Acc1
end, VAcc1, ArgQueries),
{ok, Resp1} = chttpd:send_delayed_chunk(VAcc2#vacc.resp, "\r\n]}"),
@@ -42,7 +44,9 @@ design_doc_view(Req, Db, DDoc, ViewName, Keys) ->
Args = couch_mrview_http:parse_params(Req, Keys),
Max = chttpd:chunked_response_buffer_size(),
VAcc = #vacc{db=Db, req=Req, threshold=Max},
- {ok, Resp} = fabric:query_view(Db, DDoc, ViewName, fun couch_mrview_http:view_cb/2, VAcc, Args),
+ Options = [{user_ctx, Req#httpd.user_ctx}],
+ {ok, Resp} = fabric:query_view(Db, Options, DDoc, ViewName,
+ fun couch_mrview_http:view_cb/2, VAcc, Args),
{ok, Resp#vacc.resp}.
handle_view_req(#httpd{method='GET',
@@ -121,7 +125,7 @@ setup() ->
Views = [#mrview{reduce_funs = [{<<"v">>, <<"_count">>}]}],
meck:expect(couch_mrview_util, ddoc_to_mrst, 2, {ok, #mrst{views = Views}}),
meck:expect(chttpd, start_delayed_json_response, 4, {ok, resp}),
- meck:expect(fabric, query_view, 6, {ok, #vacc{}}),
+ meck:expect(fabric, query_view, 7, {ok, #vacc{}}),
meck:expect(chttpd, send_delayed_chunk, 2, {ok, resp}),
meck:expect(chttpd, end_delayed_json_response, 1, ok).
diff --git a/src/fabric/src/fabric.erl b/src/fabric/src/fabric.erl
index f98a5c04a..1dcdb0e00 100644
--- a/src/fabric/src/fabric.erl
+++ b/src/fabric/src/fabric.erl
@@ -30,7 +30,7 @@
% Views
-export([all_docs/4, all_docs/5, changes/4, query_view/3, query_view/4,
- query_view/6, get_view_group_info/2, end_changes/0]).
+ query_view/6, query_view/7, get_view_group_info/2, end_changes/0]).
% miscellany
-export([design_docs/1, reset_validation_funs/1, cleanup_index_files/0,
@@ -324,24 +324,30 @@ query_view(DbName, DesignName, ViewName, QueryArgs) ->
Callback = fun default_callback/2,
query_view(DbName, DesignName, ViewName, Callback, [], QueryArgs).
+
+%% @equiv query_view(DbName, DesignName, [],
+%% ViewName, fun default_callback/2, [], QueryArgs)
+query_view(DbName, DDoc, ViewName, Callback, Acc, QueryArgs) ->
+ query_view(DbName, [], DDoc, ViewName, Callback, Acc, QueryArgs).
+
+
%% @doc execute a given view.
%% There are many additional query args that can be passed to a view,
%% see <a href="http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options">
%% query args</a> for details.
--spec query_view(dbname(), #doc{} | binary(), iodata(), callback(), any(),
- #mrargs{}) ->
+-spec query_view(dbname(), [{atom(), any()}] | [],
+ #doc{} | binary(), iodata(), callback(), any(), #mrargs{}) ->
any().
-query_view(Db, GroupId, ViewName, Callback, Acc0, QueryArgs)
+query_view(Db, Options, GroupId, ViewName, Callback, Acc0, QueryArgs)
when is_binary(GroupId) ->
DbName = dbname(Db),
{ok, DDoc} = ddoc_cache:open(DbName, <<"_design/", GroupId/binary>>),
- query_view(DbName, DDoc, ViewName, Callback, Acc0, QueryArgs);
-query_view(DbName, DDoc, ViewName, Callback, Acc0, QueryArgs0) ->
+ query_view(DbName, Options, DDoc, ViewName, Callback, Acc0, QueryArgs);
+query_view(DbName, Options, DDoc, ViewName, Callback, Acc0, QueryArgs0) ->
Db = dbname(DbName), View = name(ViewName),
case fabric_util:is_users_db(Db) of
true ->
- Req = Acc0#vacc.req,
- FakeDb = fabric_util:fake_db(Db, [{user_ctx, Req#httpd.user_ctx}]),
+ FakeDb = fabric_util:fake_db(Db, Options),
couch_users_db:after_doc_read(DDoc, FakeDb);
false ->
ok
@@ -365,6 +371,7 @@ query_view(DbName, DDoc, ViewName, Callback, Acc0, QueryArgs0) ->
false ->
fabric_view_map:go(
Db,
+ Options,
DDoc,
View,
QueryArgs2,
diff --git a/src/fabric/src/fabric_view_map.erl b/src/fabric/src/fabric_view_map.erl
index 63215e1de..b6cedb750 100644
--- a/src/fabric/src/fabric_view_map.erl
+++ b/src/fabric/src/fabric_view_map.erl
@@ -12,23 +12,24 @@
-module(fabric_view_map).
--export([go/7]).
+-export([go/8]).
-include_lib("fabric/include/fabric.hrl").
-include_lib("mem3/include/mem3.hrl").
-include_lib("couch/include/couch_db.hrl").
-include_lib("couch_mrview/include/couch_mrview.hrl").
-go(DbName, GroupId, View, Args, Callback, Acc, VInfo) when is_binary(GroupId) ->
+go(DbName, Options, GroupId, View, Args, Callback, Acc, VInfo)
+ when is_binary(GroupId) ->
{ok, DDoc} = fabric:open_doc(DbName, <<"_design/", GroupId/binary>>, []),
- go(DbName, DDoc, View, Args, Callback, Acc, VInfo);
+ go(DbName, Options, DDoc, View, Args, Callback, Acc, VInfo);
-go(DbName, DDoc, View, Args, Callback, Acc, VInfo) ->
+go(DbName, Options, DDoc, View, Args, Callback, Acc, VInfo) ->
Shards = fabric_view:get_shards(DbName, Args),
DocIdAndRev = fabric_util:doc_id_and_rev(DDoc),
fabric_view:maybe_update_others(DbName, DocIdAndRev, Shards, View, Args),
Repls = fabric_view:get_shard_replacements(DbName, Shards),
- RPCArgs = [DocIdAndRev, View, Args],
+ RPCArgs = [DocIdAndRev, View, Args, Options],
StartFun = fun(Shard) ->
hd(fabric_util:submit_jobs([Shard], fabric_rpc, map_view, RPCArgs))
end,