实现ets表数据放入dets,dets数据load进ets。
实现代码如下:
-module(ets_dets).
-author("chen").
%% API
-export([start/0, stop/0, new_dets/1, new_ets/1, write_ets/2, read_dets/2, read_ets/1, to_dets/2, to_ets/2]).
start() ->
register(server, spawn(fun() -> loop([]) end)),
io:format("server name is:~p~n", [server]).
stop() ->
server ! stop.
write_ets(TableName, {K, V}) ->
server ! {write, TableName, {K, V}}.
new_dets(TableName) ->
server ! {new_dets, TableName}.
new_ets(TableName) ->
server ! {new_ets, TableName}.
read_ets(TableName) ->
server ! {read_ets, TableName}.
read_dets(TableName, K) ->
server ! {read_dets, TableName, K}.
to_dets(Ets, Dets) ->
server ! {to_dets, Ets, Dets}.
to_ets(Dets, Ets) ->
server ! {to_ets, Dets, Ets}.
loop(List) ->
receive
{new_ets, TableName} ->
E = ets:new(TableName, [named_table]),
loop([E | List]);
{new_dets, TableName} ->
{_, E} = dets:open_file(TableName, []),
loop([E | List]);
{write, TableName, {K, V}} ->
Reply = ets:insert(TableName, {K, V}),
io:format("~p~n", [Reply]),
loop(List);
{read_ets, TableName} ->
Reply=ets:tab2list(TableName),
io:format("~p~n", [Reply]),
loop(List);
{read_dets, TableName, Key} ->
case dets:lookup(TableName, Key) of
[{K, V}] when K == Key ->
io:format("the value is~p~n", [V]),
loop(List);
[] ->
io:format("Not found~n", []),
loop(List);
Error ->
io:format("Error: ~p~n", [Error]),
loop(List)
end;
{to_dets, Ets, Dets}->
ets:to_dets(Ets, Dets),
loop(List);
{to_ets, Dets, Ets}->
dets:to_ets(Dets, Ets),
loop(List);
stop ->
ok
end.
创建并注册进程 start() -> register(server, spawn(fun() -> loop([]) end))。 停止 stop() -> server ! stop. 创建dets new_dets(TableName) -> server ! {new_dets, TableName}. 创建ets new_ets(TableName) -> server ! {new_ets, TableName}. 向ets插入数据 write_ets(TableName, {K, V}) -> server ! {write, TableName, {K, V}}. 读取ets read_ets(TableName) -> server ! {read_ets, TableName}. 读取dets read_dets(TableName, K) -> server ! {read_dets, TableName, K}. 将ets放入dets to_dets(Ets, Dets) -> server ! {to_dets, Ets, Dets}. 将dets加载进ets to_ets(Dets, Ets) -> server ! {to_ets, Dets, Ets}.
运行结果:
1.首先启动进程
2.成功创建一个名为ets1的Ets。
3.向ets1中插入{a,"hello"}数据。
4.创建一个名为dets1的Dets。
5.读取显示ets1和dets1中的数据,此时,ets1中含有刚才插入的数据,dets1中没有。
6.执行to_dets方法,会把一个已打开的 ETS 表 Tab 里的对象数据插入到一个已创建或已打开的Dets。表 Dets 里的数据在对象数据插入前会被清空。
此时查看dets1的数据,发现有以上在ets1中插入的数据。
成功将ets中的数据放入dets。
7.创建并查看名为ets2的Ets,此时其中为空列表
8.这时将dets1中的数据通过to_ets方法加载到ets2中,
再次查看发现ets2中已拥有数据。
成功将dets中的数据导入到ets中。