[erlang-questions] mnesia question
Linan Wang
tali.wang@REDACTED
Sat Nov 22 01:28:03 CET 2008
hi,
I'm coding a simple queue application on top of mnesia. I found one strange
thing that the last inserted row would lost if not referenced after restart.
Is this a feature, bug, or my mistake? It has been troubling me for two
days. I'm running R12 B5 on an iMac. Any suggestion is appreciated.
=================================
My codes:
=================================
-module(taskq).
-export([start/0, db_put/1, db_get/0]).
-record(oid, {name, id}).
-record(task, {id, info}).
start()->
%% start db or create;
mnesia:start(),
try
mnesia:table_info(task, type)
catch
exit: _ ->
utils:log("No db exists, create one."),
mnesia:stop(),
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(oid, [{disc_copies, [node()]}, {type, set},
{attributes, record_info(fields, oid)}]),
mnesia:create_table(task, [{disc_copies, [node()]}, {type,
ordered_set}, {attributes, record_info(fields, task)}]),
mnesia:transaction(fun()->
mnesia:s_write(#oid{name = task, id = 0})
end),
utils:log("Taskdb created.")
end.
db_put(Info)->
mnesia:transaction(fun()->
Id = mnesia:dirty_update_counter({oid, task}, 1),
mnesia:s_write(#task{id = Id, info = Info})
end).
db_get()->
{atomic, R} = mnesia:transaction(fun()->
Id = mnesia:first(task),
case Id of
'$end_of_table' ->
none;
_ ->
[Ret] = mnesia:wread({task, Id}),
mnesia:s_delete({task, Id}),
Ret#task.info
end
end),
R.
==================================
Execution session:
==================================
Linan-iMac:~$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0]
[kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> c(taskq).
{ok,taskq}
2> c(utils).
{ok,utils}
3> taskq:start().
2008/11/22 0:23:17 No db exists, create one.
=INFO REPORT==== 22-Nov-2008::00:23:17 ===
application: mnesia
exited: stopped
type: temporary
2008/11/22 0:23:18 Taskdb created.
ok
4> taskq:put(abcde).
{atomic,ok}
5>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
q
Linan-iMac:~$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0]
[kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> taskq:start().
ordered_set
2> taskq:get().
none
3>
Linan Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20081122/09d0149d/attachment.htm>
More information about the erlang-questions
mailing list