diff options
author | Eric Avdey <eiri@eiri.ca> | 2017-07-07 15:17:39 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-07 15:17:39 -0300 |
commit | 3e4da6085b9989aa0a1436b659d7267a3c3f1226 (patch) | |
tree | 67341d7762e348dfe332d22556c81a79731894b1 | |
parent | a1b5e1302b438dfdcf9f58538212ec0b9485a222 (diff) | |
parent | 3195578e2d9fba7a3295af023b97c88b2ee462f8 (diff) | |
download | couchdb-3e4da6085b9989aa0a1436b659d7267a3c3f1226.tar.gz |
Merge pull request #645 from cloudant/pass-user_ctx-in-fabric_view_map
Pass db open options to fabric_view_map
-rw-r--r-- | src/chttpd/src/chttpd_show.erl | 3 | ||||
-rw-r--r-- | src/chttpd/src/chttpd_view.erl | 10 | ||||
-rw-r--r-- | src/fabric/src/fabric.erl | 23 | ||||
-rw-r--r-- | src/fabric/src/fabric_view_map.erl | 11 |
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, |