You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2019/11/23 12:58:23 UTC

[couchdb] 02/04: chore: abort attempt at auto-ddoc injection

This is an automated email from the ASF dual-hosted git repository.

jan pushed a commit to branch access
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit a0936ce69e1e591153fe44ade4de508e9f2a7da1
Author: Jan Lehnardt <ja...@apache.org>
AuthorDate: Sun Oct 20 09:36:17 2019 +0200

    chore: abort attempt at auto-ddoc injection
---
 src/couch/src/couch_access_native_proc.erl |  4 +--
 src/couch/src/couch_iter.erl               | 27 ----------------
 src/couch/test/couchdb_access_tests.erl    | 50 ++++++++++++++++--------------
 src/couch_mrview/src/couch_mrview.erl      | 46 ++++-----------------------
 4 files changed, 34 insertions(+), 93 deletions(-)

diff --git a/src/couch/src/couch_access_native_proc.erl b/src/couch/src/couch_access_native_proc.erl
index 4f62a10..fb94150 100644
--- a/src/couch/src/couch_access_native_proc.erl
+++ b/src/couch/src/couch_access_native_proc.erl
@@ -32,7 +32,7 @@
 
 -record(st, {
     indexes = [],
-    timeout = 5000
+    timeout = 5000 % TODO: make configurable
 }).
 
 start_link() ->
@@ -110,7 +110,7 @@ code_change(_OldVsn, St, _Extra) ->
 % -seq, since that one we will always need, and by-access-id can be opt-in.
 % the second dimension is the number of emit kv pairs:
 % [ // the return value
-%   [ // the first views
+%   [ // the first view
 %     ['k1', 'v1'], // the first k/v pair for the first view
 %     ['k2', 'v2']  // second, etc.
 %   ],
diff --git a/src/couch/src/couch_iter.erl b/src/couch/src/couch_iter.erl
deleted file mode 100644
index a755d8d..0000000
--- a/src/couch/src/couch_iter.erl
+++ /dev/null
@@ -1,27 +0,0 @@
--module(couch_iter).
--export([start/1, next/1, counter/2]).
-
-start(Max) ->
-    couch_log:info("~nstarting iter with Max: ~p~n", [Max]),
-    P = spawn_link(couch_iter, counter, [0, Max]),
-    couch_log:info("~ndd_iter_start: ~p~n", [P]),
-    P.
-
-counter(N, N) ->
-    couch_log:info("~ndd_counterNN: ~p~n", [N]),
-    receive {From, next} ->
-        From ! {self(), done}
-    end;
-counter(N, Max) ->
-    couch_log:info("~ndd_counterN: ~p Max: ~p ~n", [N, Max]),
-    receive {From, next} ->
-        From ! {self(), N + 1},
-        counter(N + 1, Max)
-    end.
-
-next(Iter) ->
-    couch_log:info("~nnext~n", []),
-    Iter ! {self(), next},
-    receive
-        {Iter, Answer} -> Answer
-    end.
diff --git a/src/couch/test/couchdb_access_tests.erl b/src/couch/test/couchdb_access_tests.erl
index fca6bb0..a3c692b 100644
--- a/src/couch/test/couchdb_access_tests.erl
+++ b/src/couch/test/couchdb_access_tests.erl
@@ -92,7 +92,8 @@ access_test_() ->
         % _all_docs with include_docs
         fun should_let_admin_fetch_all_docs/2,
         fun should_let_user_fetch_their_own_all_docs/2,
-        fun should_let_user_fetch_their_own_all_docs_plus_users_ddocs/2,
+        % potential future feature
+        %fun should_let_user_fetch_their_own_all_docs_plus_users_ddocs/2%,
 
         % _changes
         fun should_let_admin_fetch_changes/2,
@@ -284,29 +285,30 @@ should_let_user_fetch_their_own_all_docs(_PortType, Url) ->
     ?_assertEqual(2, length(proplists:get_value(<<"rows">>, Json))).
     % TODO    ?_assertEqual(2, proplists:get_value(<<"total_rows">>, Json)).
 
-should_let_user_fetch_their_own_all_docs_plus_users_ddocs(_PortType, Url) ->
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/a",
-        ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"x\"]}"),
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/foo",
-        ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"_users\"]}"),
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/bar",
-        ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"houdini\"]}"),
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/b",
-        ?USERX_REQ_HEADERS, "{\"b\":2,\"_access\":[\"x\"]}"),
-
-    % % TODO: add allowing non-admin users adding non-admin ddocs
-    % {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/x",
-    %     ?ADMIN_REQ_HEADERS, "{\"b\":2,\"_access\":[\"x\"]}"),
-
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/c",
-        ?ADMIN_REQ_HEADERS, "{\"c\":3,\"_access\":[\"y\"]}"),
-    {ok, 201, _, _} = test_request:put(Url ++ "/db/d",
-        ?USERY_REQ_HEADERS, "{\"d\":4,\"_access\":[\"y\"]}"),
-    {ok, 200, _, Body} = test_request:get(Url ++ "/db/_all_docs?include_docs=true",
-        ?USERX_REQ_HEADERS),
-    {Json} = jiffy:decode(Body),
-    ?debugFmt("~nHSOIN: ~p~n", [Json]),
-    ?_assertEqual(3, length(proplists:get_value(<<"rows">>, Json))).
+% Potential future feature:%
+% should_let_user_fetch_their_own_all_docs_plus_users_ddocs(_PortType, Url) ->
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/a",
+%         ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"x\"]}"),
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/foo",
+%         ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"_users\"]}"),
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/bar",
+%         ?ADMIN_REQ_HEADERS, "{\"a\":1,\"_access\":[\"houdini\"]}"),
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/b",
+%         ?USERX_REQ_HEADERS, "{\"b\":2,\"_access\":[\"x\"]}"),
+%
+%     % % TODO: add allowing non-admin users adding non-admin ddocs
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/_design/x",
+%         ?ADMIN_REQ_HEADERS, "{\"b\":2,\"_access\":[\"x\"]}"),
+%
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/c",
+%         ?ADMIN_REQ_HEADERS, "{\"c\":3,\"_access\":[\"y\"]}"),
+%     {ok, 201, _, _} = test_request:put(Url ++ "/db/d",
+%         ?USERY_REQ_HEADERS, "{\"d\":4,\"_access\":[\"y\"]}"),
+%     {ok, 200, _, Body} = test_request:get(Url ++ "/db/_all_docs?include_docs=true",
+%         ?USERX_REQ_HEADERS),
+%     {Json} = jiffy:decode(Body),
+%     ?debugFmt("~nHSOIN: ~p~n", [Json]),
+%     ?_assertEqual(3, length(proplists:get_value(<<"rows">>, Json))).
 
 % _changes
 should_let_admin_fetch_changes(_PortType, Url) ->
diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl
index 645041b..0f4665b 100644
--- a/src/couch_mrview/src/couch_mrview.erl
+++ b/src/couch_mrview/src/couch_mrview.erl
@@ -228,6 +228,9 @@ access_ddoc() ->
         id = <<"_design/_access">>,
         body = {[
             {<<"language">>,<<"_access">>},
+            {<<"options">>, {[
+                {<<"include_design">>, true}
+            ]}},
             {<<"views">>, {[
                 {<<"_access_by_id">>, {[
                     {<<"map">>, <<"_access/by-id-map">>},
@@ -280,12 +283,6 @@ query_changes_access(Db, StartSeq, Fun, Options, Acc) ->
     VName = <<"_access_by_seq">>,
     query_view(Db, DDoc, VName, Args, Callback, Acc).
 
-get_design_docs(Db) ->
-    {ok, DDocs} = couch_db:get_design_docs(Db),
-    lists:filter(fun({DDoc}) ->
-        couch_util:get_value(<<"_access">>, DDoc) =:= [<<"_users">>]
-    end, DDocs).
-
 query_all_docs_access(Db, Args0, Callback0, Acc) ->
     % query our not yest existing, home-grown _access view.
     % use query_view for this.
@@ -295,47 +292,16 @@ query_all_docs_access(Db, Args0, Callback0, Acc) ->
     Args1 = prefix_startkey_endkey(UserName, Args0, Args0#mrargs.direction),
     Args = Args1#mrargs{reduce=false},
 
-    % get all _users design docs so we can splice them into the result
-    % in the right places
-    DDocs = get_design_docs(Db),
-    couch_log:info("~nget_user_design_docs: DDocs ~p~n", [DDocs]),
-    DDIterator = couch_iter:start(length(DDocs)),
-    % couch_log:info("~nDDocs~p~n", [DDocs]),
-
     Callback = fun
         ({row, Props}, Acc0) ->
 
-        % filter out the user-prefix from the key, so _all_docs looks normal
-        % this isn’t a separate function because I’m binding Callback0 and I
-        % don’t know the Erlang equivalent of JS’s fun.bind(this, newarg)
-
+            % filter out the user-prefix from the key, so _all_docs looks normal
+            % this isn’t a separate function because I’m binding Callback0 and I
+            % don’t know the Erlang equivalent of JS’s fun.bind(this, newarg)
             [_User, Key] = proplists:get_value(key, Props),
             Row0 = proplists:delete(key, Props),
             Row = [{key, Key} | Row0],
 
-            couch_log:info("~nRow~p~n", [Row]),
-            % if new row id is > than next ddocs id, call Callback0 with ddoc
-            % id first, move DDocs iterator one forward
-            DDNextIdx = couch_iter:next(DDIterator),
-            case DDNextIdx of
-                done -> done;
-                N ->
-                    {DDNext} = lists:nth(N, DDocs),
-                    DDID = couch_util:get_value(<<"_id">>, DDNext),
-                    DDRev = couch_util:get_value(<<"_rev">>, DDNext),
-                    case Key > DDID of
-                        true ->
-                            DDRow = [
-                                {key, DDID},
-                                {id, DDID},
-                                {value, DDRev},
-                                {doc, {DDNext}}
-                            ],
-                            Callback0({row, DDRow}, Acc0);
-                        _Else
-                            -> ok
-                    end
-            end,
             Callback0({row, Row}, Acc0);
         (Row, Acc0) ->
             Callback0(Row, Acc0)