summaryrefslogtreecommitdiff
path: root/src/couch/src/couch_flags.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/couch/src/couch_flags.erl')
-rw-r--r--src/couch/src/couch_flags.erl135
1 files changed, 0 insertions, 135 deletions
diff --git a/src/couch/src/couch_flags.erl b/src/couch/src/couch_flags.erl
deleted file mode 100644
index 5cfe7f6d1..000000000
--- a/src/couch/src/couch_flags.erl
+++ /dev/null
@@ -1,135 +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.
-
-% This module serves two functions
-% - provides public API to use to get value for a given feature flag and subject
-% - implements {feature_flags, couch_flags} service
-
-% The module relies on couch_epi_data_gen which uses the data returned by
-% `couch_flags_config:data()` to generate callback module `couch_epi_data_gen_flags_config`.
-% The generated module shouldn't be used directly. We use following APIs
-% - `couch_epi:get_handle({flags, config})` - to get handler (name of generated module)
-% - `couch_epi:get_value(Handle, Key) - to do efficient matching
-%
-% The generated module implements clauses like the following
-% - get(couch, {binary_match_rule()}) ->
-% {matched_pattern(), size(matched_pattern()), [flag()]} | undefined
-% For example
-% - get(couch, {<<"/shards/test/exact">>}) ->
-% {<<"/shards/test/exact">>,18,[baz,flag_bar,flag_foo]};
-% - get(couch, {<<"/shards/test", _/binary>>}) ->
-% {<<"/shards/test*">>,13,[baz,flag_bar,flag_foo]};
-% - get(couch, {<<"/shards/exact">>}) ->
-% {<<"/shards/exact">>,13,[flag_bar,flag_foo]};
-% - get(couch, {<<"/shards/blacklist", _/binary>>}) ->
-% {<<"/shards/blacklist*">>,18,[]};
-% - get(couch, {<<"/", _/binary>>}) ->
-% {<<"/*">>,2,[flag_foo]};
-% - get(_, _) -> undefined.
-%
-% The `couch_epi:get/2` uses the Handler module to implement efficient matching.
-
-% In order to distinguish between shards and clustered db the following
-% convention is used.
-% - it is a shard if pattern starts with `/`
-
--module(couch_flags).
-
-%% Public API
--export([
- enabled/1,
- is_enabled/2
-]).
-
-%% For internal use
--export([
- rules/0
-]).
-
-%% For use from plugin
--export([
- subject_key/1
-]).
-
--include_lib("couch/include/couch_db.hrl").
--include_lib("mem3/include/mem3.hrl").
--include("couch_db_int.hrl").
-
--type subject()
- :: #db{}
- | #httpd{}
- | #shard{}
- | #ordered_shard{}
- | string()
- | binary().
-
--define(SERVICE_ID, feature_flags).
-
--spec enabled(subject()) -> [atom()].
-
-enabled(Subject) ->
- Key = maybe_handle(subject_key, [Subject], fun subject_key/1),
- Handle = couch_epi:get_handle({flags, config}),
- lists:usort(enabled(Handle, {<<"/", Key/binary>>})
- ++ enabled(Handle, {couch_db:normalize_dbname(Key)})).
-
--spec is_enabled(FlagId :: atom(), subject()) -> boolean().
-
-is_enabled(FlagId, Subject) ->
- lists:member(FlagId, enabled(Subject)).
-
--spec rules() ->
- [{Key :: string(), Value :: string()}].
-
-rules() ->
- Handle = couch_epi:get_handle(?SERVICE_ID),
- lists:flatten(couch_epi:apply(Handle, ?SERVICE_ID, rules, [], [])).
-
--spec enabled(Handle :: couch_epi:handle(), Key :: {binary()}) -> [atom()].
-
-enabled(Handle, Key) ->
- case couch_epi:get_value(Handle, couch, Key) of
- {_, _, Flags} -> Flags;
- undefined -> []
- end.
-
--spec subject_key(subject()) -> binary().
-
-subject_key(#db{name = Name}) ->
- subject_key(Name);
-subject_key(#httpd{path_parts=[Name | _Rest]}) ->
- subject_key(Name);
-subject_key(#httpd{path_parts=[]}) ->
- <<>>;
-subject_key(#shard{name = Name}) ->
- subject_key(Name);
-subject_key(#ordered_shard{name = Name}) ->
- subject_key(Name);
-subject_key(Name) when is_list(Name) ->
- subject_key(list_to_binary(Name));
-subject_key(Name) when is_binary(Name) ->
- Name.
-
--spec maybe_handle(
- Function :: atom(),
- Args :: [term()],
- Default :: fun((Args :: [term()]) -> term())) ->
- term().
-
-maybe_handle(Func, Args, Default) ->
- Handle = couch_epi:get_handle(?SERVICE_ID),
- case couch_epi:decide(Handle, ?SERVICE_ID, Func, Args, []) of
- no_decision when is_function(Default) ->
- apply(Default, Args);
- {decided, Result} ->
- Result
- end.