summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2020-03-23 14:27:32 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2020-03-23 14:35:25 -0500
commit49b6080eff24e0a186ae77546028300bf751445e (patch)
treea2e2a694524760138194c34fe84f2cae7cd30a99
parentf81f117033422c463d6230569973c9c70a1d2565 (diff)
downloadcouchdb-prototype/fdb-layer-get-design-docs.tar.gz
Implement fabric2_db:get_design_docs/1prototype/fdb-layer-get-design-docs
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.
-rw-r--r--src/fabric/src/fabric2_db.erl28
1 files 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/">>) ->