summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2018-08-29 16:47:41 +0200
committerGarren Smith <garren.smith@gmail.com>2018-09-04 12:41:08 +0200
commit5596efb792f05a5122dab1eeb2ddeaa791451b46 (patch)
tree345483d8d0e8f8a3ecd9926307192278b9f82091
parenta41624492d7a3de047c7b2ed7d55f4e058811cbd (diff)
downloadcouchdb-partitioned-find-restrictions.tar.gz
add r = 3 restrictions to partition _find and _explainpartitioned-find-restrictions
-rw-r--r--src/mango/src/mango_error.erl7
-rw-r--r--src/mango/src/mango_httpd.erl2
-rw-r--r--src/mango/src/mango_opts.erl13
3 files changed, 22 insertions, 0 deletions
diff --git a/src/mango/src/mango_error.erl b/src/mango/src/mango_error.erl
index 603fb5fd4..b5c69b3f3 100644
--- a/src/mango/src/mango_error.erl
+++ b/src/mango/src/mango_error.erl
@@ -264,6 +264,13 @@ info(mango_opts, {multiple_text_operator, {invalid_selector, BadSel}}) ->
[BadSel])
};
+info(mango_opts, invalid_partition_read) ->
+ {
+ 400,
+ <<"invalid_partition_read_value">>,
+ <<"`r` value can only be r = 1 for partitions">>
+ };
+
info(mango_selector, {invalid_selector, missing_field_name}) ->
{
400,
diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl
index 9a5c266db..d9589b3e8 100644
--- a/src/mango/src/mango_httpd.erl
+++ b/src/mango/src/mango_httpd.erl
@@ -208,6 +208,7 @@ handle_partition_explain_req(#httpd{method='POST'}=Req, Db, Partition) ->
chttpd:validate_ctype(Req, "application/json"),
{ok, Body} = add_partition_to_query(Req, Partition),
{ok, Opts0} = mango_opts:validate_find(Body),
+ ok = mango_opts:validate_partition(Body),
{value, {selector, Sel}, Opts} = lists:keytake(selector, 1, Opts0),
Resp = mango_crud:explain(Db, Sel, Opts),
chttpd:send_json(Req, Resp);
@@ -234,6 +235,7 @@ handle_partition_find_req(#httpd{method='POST'}=Req, Db, Partition) ->
chttpd:validate_ctype(Req, "application/json"),
{ok, Body} = add_partition_to_query(Req, Partition),
{ok, Opts0} = mango_opts:validate_find(Body),
+ ok = mango_opts:validate_partition(Body),
{value, {selector, Sel}, Opts} = lists:keytake(selector, 1, Opts0),
{ok, Resp0} = start_find_resp(Req),
{ok, AccOut} = run_find(Resp0, Db, Sel, Opts),
diff --git a/src/mango/src/mango_opts.erl b/src/mango/src/mango_opts.erl
index 87d876a3c..f1b7b60d0 100644
--- a/src/mango/src/mango_opts.erl
+++ b/src/mango/src/mango_opts.erl
@@ -34,6 +34,7 @@
validate_sort/1,
validate_fields/1,
validate_bulk_delete/1,
+ validate_partition/1,
default_limit/0
]).
@@ -351,3 +352,15 @@ validate_opt(Name, [{validator, Fun} | Rest], Value) ->
default_limit() ->
config:get_integer("mango", "default_limit", 25).
+
+
+validate_partition({Props}) ->
+ case lists:keyfind(<<"r">>, 1, Props) of
+ false ->
+ ok;
+ {<<"r">>, 1} ->
+ ok;
+ {<<"r">>, _Value} ->
+ ?MANGO_ERROR(invalid_partition_read)
+
+ end.