Erlang Mnesia数据库操作和eUnit测试

学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())
].

下面的是测试:

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
- 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

 写的总体感觉不是很好, 也看了些代码感觉自己也是菜鸟,继续努力吧

转载于:https://www.cnblogs.com/clinglin/archive/2011/01/20/1940602.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值