diff options
Diffstat (limited to 'lib/tv/src/tv_ets_rpc.erl')
-rw-r--r-- | lib/tv/src/tv_ets_rpc.erl | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/tv/src/tv_ets_rpc.erl b/lib/tv/src/tv_ets_rpc.erl new file mode 100644 index 0000000000..ec2fde30ac --- /dev/null +++ b/lib/tv/src/tv_ets_rpc.erl @@ -0,0 +1,140 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +-module(tv_ets_rpc). + + + +-export([all/2, + info/4, + new/4, + tab2list/3, + insert/4, + lookup/4, + delete/4 + ]). + + + + +all(_Node, true) -> + chk(catch ets:all()); +all(Node, false) -> + chk(catch rpc:block_call(Node, ets, all, [])). + + + + +info(_Node, true, TabId, What) -> + chk(catch ets:info(TabId, What)); +info(Node, false, TabId, What) -> + chk(catch rpc:block_call(Node, ets, info, [TabId, What])). + + + + +new(_Node, true, TabName, Options) -> + case catch ets:new(TabName, Options) of + {TabName, Pid} when is_pid(Pid) -> + {TabName,Pid}; + {TabNo, Pid} when is_pid(Pid) -> + {TabNo,Pid}; + OtherResult -> + chk(OtherResult) + end; +new(Node, false, TabName, Options) -> + case catch rpc:block_call(Node, ets, new, [TabName, Options]) of + {TabName, Pid} when is_pid(Pid) -> + {TabName,Pid}; + {TabNo, Pid} when is_pid(Pid) -> + {TabNo, Pid}; + OtherResult -> + chk(OtherResult) + end. + + + + +tab2list(_Node, true, TabId) -> + chk(catch ets:tab2list(TabId)); +tab2list(Node, false, TabId) -> + chk(catch rpc:call(Node, ets, tab2list, [TabId])). + + + + +insert(_Node, true, TabId, Object) -> + chk(catch ets:insert(TabId, Object)); +insert(Node, false, TabId, Object) -> + chk(catch rpc:call(Node, ets, insert, [TabId, Object])). + + + + +lookup(_Node, true, TabId, Key) -> + chk(catch ets:lookup(TabId, Key)); +lookup(Node, false, TabId, Key) -> + chk(catch rpc:call(Node, ets, lookup, [TabId, Key])). + + + + +delete(_Node, true, TabId, Key) -> + chk(catch ets:delete(TabId, Key)); +delete(Node, false, TabId, Key) -> + chk(catch rpc:call(Node, ets, delete, [TabId, Key])). + + + + +chk(Result) -> + case Result of + undefined -> + throw(no_table); + _Anything when is_list(Result) -> + Result; + _Anything when is_atom(Result) -> + Result; + _Anything when is_integer(Result) -> + Result; + _Anything when is_pid(Result) -> + Result; + + %% Messages received when node is down. + {badrpc, nodedown} -> + throw(nodedown); + {'EXIT', nodedown} -> + throw(nodedown); + {'EXIT', {{badarg, {gen, set_monitor_node, _Args}}, _Reason}} -> + throw(nodedown); + + %% Messages received when table doesn't exist. + {'EXIT', {badarg, {ets,local_info,_Args}}} -> + %% Due to inconsistencies in R2D and earlier versions: + %% ets:info/1 returned 'undefined' when table didn't + %% exist, while ets:info/2 returned the exit-signal + %% above. This was corrected in R3A - now both functions + %% return 'undefined' :-) + throw(no_table); + {badrpc, {'EXIT', {badarg,_Reason}}} -> + throw(no_table); + {'EXIT', {badarg,_Reason}} -> + throw(no_table); + Error when is_tuple(Error) -> + throw({unexpected_error,Error}) + end. + |