You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2015/09/02 20:31:03 UTC
[4/5] couchdb-couch-epi git commit: Don't use try/catch to handle
missing plugins
Don't use try/catch to handle missing plugins
COUCHDB-2796
Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/commit/36b2be55
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/tree/36b2be55
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/diff/36b2be55
Branch: refs/heads/master
Commit: 36b2be55a89f766df44b05d988d040e6a3125529
Parents: 7f32e4f
Author: ILYA Khlopotov <ii...@ca.ibm.com>
Authored: Wed Sep 2 09:37:46 2015 -0700
Committer: ILYA Khlopotov <ii...@ca.ibm.com>
Committed: Wed Sep 2 09:53:39 2015 -0700
----------------------------------------------------------------------
src/couch_epi_data.erl | 18 ++-------------
src/couch_epi_data_gen.erl | 44 +++++++++++++++++++++++-------------
src/couch_epi_data_source.erl | 12 +---------
src/couch_epi_functions_gen.erl | 37 ++++++++++++++++--------------
4 files changed, 51 insertions(+), 60 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/blob/36b2be55/src/couch_epi_data.erl
----------------------------------------------------------------------
diff --git a/src/couch_epi_data.erl b/src/couch_epi_data.erl
index 680e5f5..b685dae 100644
--- a/src/couch_epi_data.erl
+++ b/src/couch_epi_data.erl
@@ -126,7 +126,7 @@ safe_set(Hash, #state{} = State) ->
key = Key} = State,
try
Data = get_from_module(Module),
- OldData = current(Handle, Subscriber),
+ OldData = couch_epi_data_gen:current_data(Handle, Subscriber),
ok = couch_epi_data_gen:set(Handle, Subscriber, Data),
couch_epi_server:notify(Subscriber, Key, {data, OldData}, {data, Data}),
{ok, State#state{hash = Hash}}
@@ -135,21 +135,7 @@ safe_set(Hash, #state{} = State) ->
end.
get_from_module(Module) ->
- try
- Module:data()
- catch
- error:undef -> []
- end.
-
-current(Handle, Subscriber) ->
- try
- case couch_epi_data_gen:by_source(Handle, Subscriber) of
- undefined -> [];
- Data -> Data
- end
- catch error:undef ->
- []
- end.
+ Module:data().
maybe_start_keeper(Key) ->
Handle = couch_epi_data_gen:get_handle(Key),
http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/blob/36b2be55/src/couch_epi_data_gen.erl
----------------------------------------------------------------------
diff --git a/src/couch_epi_data_gen.erl b/src/couch_epi_data_gen.erl
index ad84b80..d7e0c65 100644
--- a/src/couch_epi_data_gen.erl
+++ b/src/couch_epi_data_gen.erl
@@ -24,6 +24,7 @@
-export([keys/1, subscribers/1]).
-export([save/3]).
+-export([current_data/2]).
set(Handle, Source, Data) ->
case is_updated(Handle, Source, Data) of
@@ -174,32 +175,43 @@ module_name({Service, Key}) when is_list(Service) andalso is_list(Key) ->
is_updated(Handle, Source, Data) ->
Sig = couch_epi_util:hash(Data),
- try Handle:version(Source) of
- {error, {unknown, Source}} -> true;
- {error, Reason} -> throw(Reason);
- Sig -> false;
- _ -> true
- catch
- error:undef -> true;
- Class:Reason ->
- throw({Class, {Source, Reason}})
- end.
+ if_exists(Handle, version, 1, true, fun() ->
+ try Handle:version(Source) of
+ {error, {unknown, Source}} -> true;
+ {error, Reason} -> throw(Reason);
+ Sig -> false;
+ _ -> true
+ catch
+ Class:Reason ->
+ throw({Class, {Source, Reason}})
+ end
+ end).
save(Handle, undefined, []) ->
- case get_current_data(Handle) of
+ case current_data(Handle) of
[] -> generate(Handle, []);
_Else -> ok
end;
save(Handle, Source, Data) ->
- CurrentData = get_current_data(Handle),
+ CurrentData = current_data(Handle),
NewDefs = lists:keystore(Source, 1, CurrentData, {Source, Data}),
generate(Handle, NewDefs).
-get_current_data(Handle) ->
- try Handle:by_source()
- catch error:undef -> []
- end.
+current_data(Handle, Subscriber) ->
+ if_exists(Handle, by_source, 1, [], fun() ->
+ Handle:by_source(Subscriber)
+ end).
+current_data(Handle) ->
+ if_exists(Handle, by_source, 0, [], fun() ->
+ Handle:by_source()
+ end).
+
+if_exists(Handle, Func, Arity, Default, Fun) ->
+ case erlang:function_exported(Handle, Func, Arity) of
+ true -> Fun();
+ false -> Default
+ end.
defined_keys(Defs) ->
Keys = fold_defs(Defs, [], fun({_Source, Key, _Data}, Acc) ->
http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/blob/36b2be55/src/couch_epi_data_source.erl
----------------------------------------------------------------------
diff --git a/src/couch_epi_data_source.erl b/src/couch_epi_data_source.erl
index f44430d..f905e8f 100644
--- a/src/couch_epi_data_source.erl
+++ b/src/couch_epi_data_source.erl
@@ -161,7 +161,7 @@ safe_set(Hash, Data, #state{} = State) ->
key = Key} = State,
try
- OldData = current(Handle, Subscriber),
+ OldData = couch_epi_data_gen:current_data(Handle, Subscriber),
ok = couch_epi_data_gen:set(Handle, Subscriber, Data),
couch_epi_server:notify(Subscriber, Key, {data, OldData}, {data, Data}),
{ok, State#state{hash = Hash}}
@@ -181,16 +181,6 @@ hash_of_file(FilePath) ->
{ok, Data} = file:read_file(FilePath),
couch_epi_util:md5(Data).
-current(Handle, Subscriber) ->
- try
- case couch_epi_data_gen:by_source(Handle, Subscriber) of
- undefined -> [];
- Data -> Data
- end
- catch error:undef ->
- []
- end.
-
maybe_start_keeper(Key) ->
Handle = couch_epi_data_gen:get_handle(Key),
couch_epi_module_keeper:maybe_start_keeper(couch_epi_data_gen, Handle).
http://git-wip-us.apache.org/repos/asf/couchdb-couch-epi/blob/36b2be55/src/couch_epi_functions_gen.erl
----------------------------------------------------------------------
diff --git a/src/couch_epi_functions_gen.erl b/src/couch_epi_functions_gen.erl
index 2fba66f..8c63b9c 100644
--- a/src/couch_epi_functions_gen.erl
+++ b/src/couch_epi_functions_gen.erl
@@ -190,16 +190,17 @@ module_name(ServiceId) when is_list(ServiceId) ->
is_updated(Handle, Source, Modules) ->
Sig = hash(Modules),
- try Handle:version(Source) of
- {error, {unknown, Source}} -> true;
- {error, Reason} -> throw(Reason);
- Sig -> false;
- _ -> true
- catch
- error:undef -> true;
- Class:Reason ->
- throw({Class, {Source, Reason}})
- end.
+ if_exists(Handle, version, 1, true, fun() ->
+ try Handle:version(Source) of
+ {error, {unknown, Source}} -> true;
+ {error, Reason} -> throw(Reason);
+ Sig -> false;
+ _ -> true
+ catch
+ Class:Reason ->
+ throw({Class, {Source, Reason}})
+ end
+ end).
save(Handle, undefined, []) ->
case get_current_definitions(Handle) of
@@ -218,8 +219,14 @@ definitions(Source, Modules) ->
{Source, SrcDefs}.
get_current_definitions(Handle) ->
- try Handle:definitions()
- catch error:undef -> []
+ if_exists(Handle, definitions, 0, [], fun() ->
+ Handle:definitions()
+ end).
+
+if_exists(Handle, Func, Arity, Default, Fun) ->
+ case erlang:function_exported(Handle, Func, Arity) of
+ true -> Fun();
+ false -> Default
end.
defined_providers(Defs) ->
@@ -300,11 +307,7 @@ parse_opts([], Acc) ->
Acc.
providers(Handle, Function, Arity, #opts{ignore_providers = true}) ->
- try
- Handle:providers(Function, Arity)
- catch
- error:undef -> []
- end;
+ Handle:providers(Function, Arity);
providers(Handle, Function, Arity, #opts{}) ->
Handle:providers(Function, Arity).