学erlang应该有6天了, 迷迷糊糊的今天突然想起还有任务写了个基于mnesia数据库的操作
- module(agent_server).
- compile(export_all).
- include_lib( " stdlib/include/qlc.hrl " ).
- record(agent,{
id,
name,
groupid,
state = ready:: ' pause ' | ' talk ' | ' wrappup ' ,
logintime::{integer(), integer(), integer()}
}).
%%% 感觉 start 和 stop 有点像打开和关闭数据库连接
% 初始化
% 创建数据库和表
init() ->
mnesia:create_schema([node()]), % 创建节点 相当数据库
mnesia:start(), % start mneisa
mnesia:create_table(agent, [{attributes, record_info(fields, agent)}]), % 根据record创建agent表
mnesia:stop(). % 关闭 mneisa
% stop
% 开始
start() ->
mnesia:start(),
mnesia:wait_for_tables([agent], 10000 ). % 等待去连接表,超时报错
% 停止(结束)
stop() ->
mnesia:stop().
% 查询全部
% mneisa 的事务
% transaction(Fun [[, Args], Retries]) -> {aborted, Reason} | {atomic, ResultOfFun}
find_all() ->
Q = qlc:q([X || X <- mnesia:table(agent)]),
F = fun() -> qlc:e(Q) end,
{atomic, Result} = mnesia:transaction(F),
Result.
% 查询记录 ByItem
find_ByItem(Item) ->
Q = qlc:q([
X || X <- mnesia:table(agent),
X # agent.id =:= Item
]),
F = fun() -> qlc:e(Q) end,
{atomic, Result} = mnesia:transaction(F),
Result.
% 测试的数据
test_example() ->
[
{agent, 1 , ' lin ' , 1 , " talk " , { 11 , 1 , 19 }},
{agent, 2 , ' hao ' , 1 , " pause " , { 11 , 1 , 19 }},
{agent, 3 , ' jie ' , 1 , " wrappup " , { 11 , 1 , 19 }},
{agent, 4 , ' study ' , 1 , " pause " , { 11 , 1 , 19 }}
].
% 插入测试数据
test_insert() ->
mnesia:clear_table(agent),
F = fun() ->
lists:foreach(fun mnesia:write / 1 , test_example())
end,
mnesia:transaction(F).
% 删除数据
deleteByItem(Item) ->
Object = {agent, Item}, % 根据 Object 删除数据
F = fun() -> mnesia:delete(Object) end,
mnesia:transaction(F).
% 插入一条数据
insert_info(Id, Name, GroupId, State, LogTime) ->
% 估计插入也要正则
% 先写
F = fun() -> mnesia:write({agent, Id, Name, GroupId, State, LogTime}) end,
mnesia:transaction(F).
% 更新一条数据
%%% 这里更新话 我想给更新的话应该是名字和状态吧
%%% 不通过 id 取数据的话还是有点不明白的
%%% 感觉写的不是很好
update_info(Item, Name, State) ->
{match, _First, Match} = regexp:first_match(State, " (pause)?|(talk)?|(wrappup)? " ), % 不是很好
case (Match > 0) of
true ->
F = fun() ->
[OldRes] = mnesia:read({agent, Item}),
NewRes = OldRes # agent{name=Name, state=State},% 需要注意一下
mnesia:write(NewRes)
end,
mnesia:transaction(F);
false -> io:format( " To check out you State Input!~n State = { pause | talk | wrappup }~n " )
end.
% 排序
%%% 关于排序不明白,是表排序还是输出排序
% eUnit_test
% test的顺序跟外部的调用顺序差不的
agent_server_test_() ->
[
?_test(init()),
?_test(start()),
?_assert(test_insert() = : = {atomic,ok}),
?_test(find_all()),
?_assert(find_ByItem( 1 ) /= []), % 返回列表判断?
?_assert(insert_info( 6 , ' aaaa ' , 1 , " pause " , { 12.12 , 12 }) = : = {atomic,ok}),
?_assert(deleteByItem( 1 ) = : = {atomic,ok})
% ?_test(stop())
].
下面的是测试:
代码
- include_lib( " eunit/include/eunit.hrl " ).
% eUnit_test
% test的顺序跟外部的调用顺序差不的
agent_server_test_() ->
[
?_test(init()),
?_test(start()),
?_assert(test_insert() = : = {atomic,ok}),
?_test(find_all()),
?_assert(find_ByItem( 1 ) /= []), % 返回列表判断?
?_assert(insert_info( 6 , ' aaaa ' , 1 , " pause " , { 12.12 , 12 }) = : = {atomic,ok}),
?_assert(deleteByItem( 1 ) = : = {atomic,ok})
% ?_test(stop())
].
% 测试的结果
27 > agent_server:test().
=== INFO REPORT ==== 20 - Jan - 2011 :: 14 : 51 : 36 ===
application: mnesia
exited: stopped
type: temporary
All 7 tests passed.
ok
写的总体感觉不是很好, 也看了些代码感觉自己也是菜鸟,继续努力吧