From 49b6080eff24e0a186ae77546028300bf751445e Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Mon, 23 Mar 2020 14:27:32 -0500 Subject: Implement fabric2_db:get_design_docs/1 This is a more efficient method to get all of the design documents than relying on fabric2_db:fold_docs which doesn't load doc bodies in parallel. --- src/fabric/src/fabric2_db.erl | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl index 129dea2d7..0f0ed8f41 100644 --- a/src/fabric/src/fabric2_db.erl +++ b/src/fabric/src/fabric2_db.erl @@ -80,9 +80,7 @@ get_full_doc_info/2, get_full_doc_infos/2, get_missing_revs/2, - %% get_design_doc/2, - %% get_design_docs/1, - %% get_design_doc_count/1, + get_design_docs/1, %% get_purge_infos/2, %% get_minimum_purge_seq/1, @@ -657,6 +655,30 @@ get_missing_revs(Db, JsonIdRevs) -> {ok, AllMissing}. +get_design_docs(Db) -> + fabric2_fdb:transactional(Db, fun(TxDb) -> + #{ + db_prefix := DbPrefix + } = TxDb, + + Prefix = erlfdb_tuple:pack({?DB_CHANGES}, DbPrefix), + Opts = set_design_doc_keys([]), + Fun = fun({Key, Val}, Acc) -> + {DocId} = erlfdb_tuple:unpack(K, Prefix), + RevId = erlfdb_tuple:unpack(V), + Future = get_doc_body_future(TxDb, DocId, RevId), + [Future | Acc] + end, + {ok, Futures} = fabric2_fdb:fold_range(TxDb, Prefix, Fun, [], Opts), + + % Using foldl instead of map means that the design + % docs come out in sorted order. + lists:foldl(fun(Future, Acc) -> + [fabric2_fdb:get_doc_body_wait(Future) | Acc] + end, [], Futures) + end). + + validate_docid(<<"">>) -> throw({illegal_docid, <<"Document id must not be empty">>}); validate_docid(<<"_design/">>) -> -- cgit v1.2.1