diff options
author | Garren Smith <garren.smith@gmail.com> | 2018-09-05 11:55:13 +0200 |
---|---|---|
committer | Garren Smith <garren.smith@gmail.com> | 2018-09-05 15:41:26 +0200 |
commit | d0b8dac28b3061eae7d910c0b277520d8b7be859 (patch) | |
tree | 6936a82606f66f0c2a245845d81d42b4f62ca8c1 | |
parent | 669cb60f5bcd32f32b2f2fb154f39446819a8761 (diff) | |
download | couchdb-partition-ddoc-validation.tar.gz |
validate partitioned design docspartition-ddoc-validation
-rw-r--r-- | src/couch_mrview/src/couch_mrview.erl | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl index 1b1a06b74..32e4b3957 100644 --- a/src/couch_mrview/src/couch_mrview.erl +++ b/src/couch_mrview/src/couch_mrview.erl @@ -175,16 +175,44 @@ join([H|T], Sep, Acc) -> join(T, Sep, [Sep, H | Acc]). +validate_partitioned_ddoc(#doc{} = DDoc) -> + {DDocProps} = DDoc#doc.body, + Banned = [ + <<"shows">>, + <<"rewrites">>, + <<"lists">>, + <<"updates">>, + <<"filters">>, + <<"validate_doc_update">> + ], + validate_partitioned_ddoc(DDocProps, Banned). + + +validate_partitioned_ddoc([], _Banned) -> + ok; +validate_partitioned_ddoc([{Key, _Value} | Rest], Banned) -> + case lists:member(Key, Banned) of + true -> + Msg = [<<"`">>, Key, <<"` cannot be used in a partitioned design doc">>], + throw({invalid_design_doc, ?l2b(Msg)}); + false -> + validate_partitioned_ddoc(Rest, Banned) + end. + + validate(DbName, DDoc) -> ok = validate_ddoc_fields(DDoc#doc.body), DbPartitioned = mem3:is_partitioned(DbName), DDocPartitioned = get_partitioned_opt(DDoc#doc.body, DbPartitioned), - if - not DbPartitioned andalso DDocPartitioned -> + + case {DbPartitioned, DDocPartitioned} of + {true, true} -> + validate_partitioned_ddoc(DDoc); + {false, true} -> throw({invalid_design_doc, <<"partitioned option cannot be true in a " "non-partitioned database.">>}); - true -> + {_, _} -> ok end, GetName = fun |