summaryrefslogtreecommitdiff
path: root/src/mango/src/mango_opts.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mango/src/mango_opts.erl')
-rw-r--r--src/mango/src/mango_opts.erl377
1 files changed, 0 insertions, 377 deletions
diff --git a/src/mango/src/mango_opts.erl b/src/mango/src/mango_opts.erl
deleted file mode 100644
index 92c07f743..000000000
--- a/src/mango/src/mango_opts.erl
+++ /dev/null
@@ -1,377 +0,0 @@
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--module(mango_opts).
-
--export([
- validate_idx_create/1,
- validate_find/1
-]).
-
--export([
- validate/2,
-
- is_string/1,
- is_boolean/1,
- is_pos_integer/1,
- is_non_neg_integer/1,
- is_object/1,
- is_ok_or_false/1,
-
- validate_idx_name/1,
- validate_selector/1,
- validate_use_index/1,
- validate_bookmark/1,
- validate_sort/1,
- validate_fields/1,
- validate_bulk_delete/1,
- validate_partitioned/1,
-
- default_limit/0
-]).
-
-
--include("mango.hrl").
-
-
-validate_idx_create({Props}) ->
- Opts = [
- {<<"index">>, [
- {tag, def}
- ]},
- {<<"type">>, [
- {tag, type},
- {optional, true},
- {default, <<"json">>},
- {validator, fun is_string/1}
- ]},
- {<<"name">>, [
- {tag, name},
- {optional, true},
- {default, auto_name},
- {validator, fun validate_idx_name/1}
- ]},
- {<<"ddoc">>, [
- {tag, ddoc},
- {optional, true},
- {default, auto_name},
- {validator, fun validate_idx_name/1}
- ]},
- {<<"w">>, [
- {tag, w},
- {optional, true},
- {default, 2},
- {validator, fun is_pos_integer/1}
- ]},
- {<<"partitioned">>, [
- {tag, partitioned},
- {optional, true},
- {default, db_default},
- {validator, fun validate_partitioned/1}
- ]}
- ],
- validate(Props, Opts).
-
-
-validate_find({Props}) ->
- Opts = [
- {<<"selector">>, [
- {tag, selector},
- {validator, fun validate_selector/1}
- ]},
- {<<"use_index">>, [
- {tag, use_index},
- {optional, true},
- {default, []},
- {validator, fun validate_use_index/1}
- ]},
- {<<"bookmark">>, [
- {tag, bookmark},
- {optional, true},
- {default, <<>>},
- {validator, fun validate_bookmark/1}
- ]},
- {<<"limit">>, [
- {tag, limit},
- {optional, true},
- {default, default_limit()},
- {validator, fun is_non_neg_integer/1}
- ]},
- {<<"skip">>, [
- {tag, skip},
- {optional, true},
- {default, 0},
- {validator, fun is_non_neg_integer/1}
- ]},
- {<<"sort">>, [
- {tag, sort},
- {optional, true},
- {default, []},
- {validator, fun validate_sort/1}
- ]},
- {<<"fields">>, [
- {tag, fields},
- {optional, true},
- {default, []},
- {validator, fun validate_fields/1}
- ]},
- {<<"partition">>, [
- {tag, partition},
- {optional, true},
- {default, <<>>},
- {validator, fun validate_partition/1}
- ]},
- {<<"r">>, [
- {tag, r},
- {optional, true},
- {default, 1},
- {validator, fun mango_opts:is_pos_integer/1}
- ]},
- {<<"conflicts">>, [
- {tag, conflicts},
- {optional, true},
- {default, false},
- {validator, fun mango_opts:is_boolean/1}
- ]},
- {<<"stale">>, [
- {tag, stale},
- {optional, true},
- {default, false},
- {validator, fun mango_opts:is_ok_or_false/1}
- ]},
- {<<"update">>, [
- {tag, update},
- {optional, true},
- {default, true},
- {validator, fun mango_opts:is_boolean/1}
- ]},
- {<<"stable">>, [
- {tag, stable},
- {optional, true},
- {default, false},
- {validator, fun mango_opts:is_boolean/1}
- ]},
- {<<"execution_stats">>, [
- {tag, execution_stats},
- {optional, true},
- {default, false},
- {validator, fun mango_opts:is_boolean/1}
- ]}
- ],
- validate(Props, Opts).
-
-
-validate_bulk_delete({Props}) ->
- Opts = [
- {<<"docids">>, [
- {tag, docids},
- {validator, fun validate_bulk_docs/1}
- ]},
- {<<"w">>, [
- {tag, w},
- {optional, true},
- {default, 2},
- {validator, fun is_pos_integer/1}
- ]}
- ],
- validate(Props, Opts).
-
-
-validate(Props, Opts) ->
- case mango_util:assert_ejson({Props}) of
- true ->
- ok;
- false ->
- ?MANGO_ERROR({invalid_ejson, {Props}})
- end,
- {Rest, Acc} = validate_opts(Opts, Props, []),
- case Rest of
- [] ->
- ok;
- [{BadKey, _} | _] ->
- ?MANGO_ERROR({invalid_key, BadKey})
- end,
- {ok, Acc}.
-
-
-is_string(Val) when is_binary(Val) ->
- {ok, Val};
-is_string(Else) ->
- ?MANGO_ERROR({invalid_string, Else}).
-
-
-is_boolean(true) ->
- {ok, true};
-is_boolean(false) ->
- {ok, false};
-is_boolean(Else) ->
- ?MANGO_ERROR({invalid_boolean, Else}).
-
-
-is_pos_integer(V) when is_integer(V), V > 0 ->
- {ok, V};
-is_pos_integer(Else) ->
- ?MANGO_ERROR({invalid_pos_integer, Else}).
-
-
-is_non_neg_integer(V) when is_integer(V), V >= 0 ->
- {ok, V};
-is_non_neg_integer(Else) ->
- ?MANGO_ERROR({invalid_non_neg_integer, Else}).
-
-
-is_object({Props}) ->
- true = mango_util:assert_ejson({Props}),
- {ok, {Props}};
-is_object(Else) ->
- ?MANGO_ERROR({invalid_object, Else}).
-
-is_ok_or_false(<<"ok">>) ->
- {ok, ok};
-is_ok_or_false(<<"false">>) -> % convenience
- {ok, false};
-is_ok_or_false(false) ->
- {ok, false};
-is_ok_or_false(Else) ->
- ?MANGO_ERROR({invalid_ok_or_false_value, Else}).
-
-validate_idx_name(auto_name) ->
- {ok, auto_name};
-validate_idx_name(Else) ->
- is_string(Else).
-
-
-validate_selector({Props}) ->
- Norm = mango_selector:normalize({Props}),
- {ok, Norm};
-validate_selector(Else) ->
- ?MANGO_ERROR({invalid_selector_json, Else}).
-
-
-%% We re-use validate_use_index to make sure the index names are valid
-validate_bulk_docs(Docs) when is_list(Docs) ->
- lists:foreach(fun validate_use_index/1, Docs),
- {ok, Docs};
-validate_bulk_docs(Else) ->
- ?MANGO_ERROR({invalid_bulk_docs, Else}).
-
-
-validate_use_index(IndexName) when is_binary(IndexName) ->
- case binary:split(IndexName, <<"/">>) of
- [DesignId] ->
- {ok, [DesignId]};
- [<<"_design">>, DesignId] ->
- {ok, [DesignId]};
- [DesignId, ViewName] ->
- {ok, [DesignId, ViewName]};
- [<<"_design">>, DesignId, ViewName] ->
- {ok, [DesignId, ViewName]};
- _ ->
- ?MANGO_ERROR({invalid_index_name, IndexName})
- end;
-validate_use_index(null) ->
- {ok, []};
-validate_use_index([]) ->
- {ok, []};
-validate_use_index([DesignId]) when is_binary(DesignId) ->
- {ok, [DesignId]};
-validate_use_index([DesignId, ViewName])
- when is_binary(DesignId), is_binary(ViewName) ->
- {ok, [DesignId, ViewName]};
-validate_use_index(Else) ->
- ?MANGO_ERROR({invalid_index_name, Else}).
-
-
-validate_bookmark(null) ->
- {ok, nil};
-validate_bookmark(<<>>) ->
- {ok, nil};
-validate_bookmark(Bin) when is_binary(Bin) ->
- {ok, Bin};
-validate_bookmark(Else) ->
- ?MANGO_ERROR({invalid_bookmark, Else}).
-
-
-validate_sort(Value) ->
- mango_sort:new(Value).
-
-
-validate_fields(Value) ->
- mango_fields:new(Value).
-
-
-validate_partitioned(true) ->
- {ok, true};
-validate_partitioned(false) ->
- {ok, false};
-validate_partitioned(db_default) ->
- {ok, db_default};
-validate_partitioned(Else) ->
- ?MANGO_ERROR({invalid_partitioned_value, Else}).
-
-
-validate_partition(<<>>) ->
- {ok, <<>>};
-validate_partition(Partition) ->
- couch_partition:validate_partition(Partition),
- {ok, Partition}.
-
-
-validate_opts([], Props, Acc) ->
- {Props, lists:reverse(Acc)};
-validate_opts([{Name, Desc} | Rest], Props, Acc) ->
- {tag, Tag} = lists:keyfind(tag, 1, Desc),
- case lists:keytake(Name, 1, Props) of
- {value, {Name, Prop}, RestProps} ->
- NewAcc = [{Tag, validate_opt(Name, Desc, Prop)} | Acc],
- validate_opts(Rest, RestProps, NewAcc);
- false ->
- NewAcc = [{Tag, validate_opt(Name, Desc, undefined)} | Acc],
- validate_opts(Rest, Props, NewAcc)
- end.
-
-
-validate_opt(_Name, [], Value) ->
- Value;
-validate_opt(Name, Desc0, undefined) ->
- case lists:keytake(optional, 1, Desc0) of
- {value, {optional, true}, Desc1} ->
- {value, {default, Value}, Desc2} = lists:keytake(default, 1, Desc1),
- false = (Value == undefined),
- validate_opt(Name, Desc2, Value);
- _ ->
- ?MANGO_ERROR({missing_required_key, Name})
- end;
-validate_opt(Name, [{tag, _} | Rest], Value) ->
- % Tags aren't really validated
- validate_opt(Name, Rest, Value);
-validate_opt(Name, [{optional, _} | Rest], Value) ->
- % A value was specified for an optional value
- validate_opt(Name, Rest, Value);
-validate_opt(Name, [{default, _} | Rest], Value) ->
- % A value was specified for an optional value
- validate_opt(Name, Rest, Value);
-validate_opt(Name, [{assert, Value} | Rest], Value) ->
- validate_opt(Name, Rest, Value);
-validate_opt(Name, [{assert, Expect} | _], Found) ->
- ?MANGO_ERROR({invalid_value, Name, Expect, Found});
-validate_opt(Name, [{validator, Fun} | Rest], Value) ->
- case Fun(Value) of
- {ok, Validated} ->
- validate_opt(Name, Rest, Validated);
- false ->
- ?MANGO_ERROR({invalid_value, Name, Value})
- end.
-
-
-default_limit() ->
- config:get_integer("mango", "default_limit", 25).