Packages
launchdarkly_server_sdk
1.0.0-beta2
3.11.0
3.10.1
3.9.0
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.0
3.5.0
3.4.0
3.3.1
3.3.0
3.2.0
3.1.0
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.1.2
2.1.1
2.1.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.6.0
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.3
1.1.2
1.1.1
retired
1.1.0
retired
1.0.1
retired
1.0.0
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
LaunchDarkly SDK for Erlang
Retired package: Deprecated - This version will not be able to connect to and communicate with LaunchDarkly after support for the HTTP/2 protocol is enabled.
Current section
Files
Jump to
Current section
Files
src/ldclient_storage_map.erl
%%-------------------------------------------------------------------
%% @doc `ldclient_storage_map' module
%%
%% Provides implementation of storage backend using Erlang map.
%% @end
%%-------------------------------------------------------------------
-module(ldclient_storage_map).
-behaviour(ldclient_storage_engine).
%% Helper macro for declaring children of supervisor
-define(CHILD(Id, Module, Args, Type), {Id, {Module, start_link, Args}, permanent, 5000, Type, [Module]}).
%% Behavior callbacks
-export([init/3]).
-export([create/2]).
-export([empty/2]).
-export([get/3]).
-export([list/2]).
-export([put/3]).
-export([put_clean/3]).
-export([terminate/1]).
%%===================================================================
%% Behavior callbacks
%%===================================================================
-spec init(SupRef :: atom(), Tag :: atom(), Options :: list()) ->
ok.
init(SupRef, Tag, _) ->
SupRegName = get_local_reg_name(supervisor, Tag),
WorkerRegName = get_local_reg_name(worker, Tag),
StorageMapSup = ?CHILD(ldclient_storage_map_sup, ldclient_storage_map_sup, [SupRegName, WorkerRegName], supervisor),
{ok, _} = supervisor:start_child(SupRef, StorageMapSup),
% Pre-create flags and segments buckets
ok = create(Tag, flags),
ok = create(Tag, segments).
-spec create(Tag :: atom(), Bucket :: atom()) ->
ok |
{error, already_exists, string()}.
create(Tag, Bucket) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:create(ServerRef, Bucket).
-spec empty(Tag :: atom(), Bucket :: atom()) ->
ok |
{error, bucket_not_found, string()}.
empty(Tag, Bucket) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:empty(ServerRef, Bucket).
-spec get(Tag :: atom(), Bucket :: atom(), Key :: binary()) ->
[{Key :: binary(), Value :: any()}] |
{error, bucket_not_found, string()}.
get(Tag, Bucket, Key) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:get(ServerRef, Bucket, Key).
-spec list(Tag :: atom(), Bucket :: atom()) ->
[{Key :: binary(), Value :: any()}] |
{error, bucket_not_found, string()}.
list(Tag, Bucket) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:list(ServerRef, Bucket).
-spec put(Tag :: atom(), Bucket :: atom(), Items :: #{Key :: binary() => Value :: any()}) ->
ok |
{error, bucket_not_found, string()}.
put(Tag, Bucket, Items) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:put(ServerRef, Bucket, Items).
-spec put_clean(Tag :: atom(), Bucket :: atom(), Items :: #{Key :: binary() => Value :: any()}) ->
ok |
{error, bucket_not_found, string()}.
put_clean(Tag, Bucket, Items) ->
ServerRef = get_local_reg_name(worker, Tag),
ldclient_storage_map_server:put_clean(ServerRef, Bucket, Items).
-spec terminate(Tag :: atom()) -> ok.
terminate(_Tag) -> ok.
%%===================================================================
%% Internal functions
%%===================================================================
-spec get_local_reg_name(atom(), Tag :: atom()) -> atom().
get_local_reg_name(supervisor, Tag) ->
list_to_atom("ldclient_storage_map_sup_" ++ atom_to_list(Tag));
get_local_reg_name(worker, Tag) ->
list_to_atom("ldclient_storage_map_server_" ++ atom_to_list(Tag)).