Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support get_env plugin methods #83

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Support get_env plugin methods #83

wants to merge 1 commit into from

Conversation

uwiger
Copy link
Owner

@uwiger uwiger commented Jan 29, 2015

Make gproc:get_env() et.al. pluggable. Also allow for alternative lookup methods to be 'caching' - i.e. if they fail to find a value, but it's found by a later alternative, it is cached also at this level. See below.

Pluggable methods are registered as shared properties, e.g.

gproc:reg_shared({p,l,getenv}, {envtest, get_env}),
gproc:reg_shared({p,l,getenvc}, {envtest, get_env})

The plugins are called as Mod:Fun(App, Key, PropertyName) (lookup) or Mod:Fun(App, Key, Value, PropertyName) (insert). The lookup function must return {ok,Value} | undefined. The insert function's return value is ignored.

Eshell V5.10.3  (abort with ^G)
1> application:start(gproc).
ok
%% Create an ETS table and register our gproc hooks.
%% Our hooks: 'getenv' only does lookup, {Module, Fun}
%%            'getenvc' does lookup, but can also cache
%%                   when called via `gproc:get_set_env/4`,
%%                   {Mod, Fun, cache}.
2> envtest:init().
true
%% Create an "external config":
3> os:putenv("ULF","Wiger").
true
%% Look up the value in gproc, search in OS env if not found:
4> gproc:get_env(l,gproc,ulf,[os_env]).
"Wiger"
%% Also look in our own "cache"
%% The callback prints that it was called (but doesn't find anything)
5> gproc:get_env(l,gproc,ulf,[{reg,getenvc},os_env]).
-- envtest:get_env(gproc, ulf, getenvc)
"Wiger"
%% Use the caching lookup method. We see that the value is cached:
6> gproc:get_set_env(l,gproc,ulf,[{reg,getenvc},os_env]).
-- envtest:get_env(gproc, ulf, getenvc)
-- envtest:get_env(gproc, ulf, "Wiger", getenvc) (CACHE!)
"Wiger"
%% Lookup the value without falling back on the OS env:
7> gproc:get_env(l,gproc,ulf,[{reg,getenvc}]).           
"Wiger"
%% Verify that the value exists in our cache:
8> ets:tab2list(envtest).
[{{gproc,ulf},"Wiger"}]

(See gproc/test/envtest.erl)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant