Professional Documents
Culture Documents
Tutorial
by Flavio Ishii
Erlang Data Storage Modules
•Modules:
•Erlang Terms Storage (ETS)
•Disk Erlang Term Storage (DETS)
•Mnesia Distributed DBMS
• Data Storage Design
> P = { person, { 1, N, S } }.
> Properties.
> X.
* default
Flavio Ishii, Sept. 17, 2009
ETS Table Access Rights
• private - Only owner process can read/write
> ets:info(Tab).
> ets:match(Tab,'$1').
> ets:match(Tab,{'$1',bob}).
> ets:match_object(Tab,{'$1',bob}).
> ets:select(Tab,[{{'$1',bob},[],['$$']}]).
> ets:select(Tab,[{{'$1',bob},[],['$_']}]).
> dets:info(user).
> dets:match(user,'$1').
> dets:match(user,{'$1',bob}).
> dets:match_object(user,{'$1',bob}).
> dets:select(user,[{{'$1',bob},[],['$$']}]).
> dets:select(user,[{{'$1',bob},[],['$_']}]).
-record(counter,{id_name,value}).
-record(user_details,
{password,firstname,lastname,sports=[]}).
-record(user,{id,username,user_details}).
init_db() ->
mnesia:create_schema([node()]),
io:format("Mnesia schema created~n"),
mnesia:start(),
mnesia:change_table_copy_type(schema, node(), disc_copies),
mnesia:create_table(counter, [{disc_copies,[node()]}
, {attributes, record_info(fields,
counter)}]),
mnesia:create_table(user, [{disc_copies,[node()]}, {index, [username]}
, {attributes, record_info(fields, user)}]),
add_sample_data().
Flavio Ishii, Sept. 17, 2009
Part 2/4 of api_db.erl
insert_user(UserRecord) ->
case UserRecord#user.id =:= undefined of
true -> NewUser = UserRecord#user{ id =
mnesia:dirty_update_counter(counter, user_id, 1) };
false -> NewUser = UserRecord
end,
% mnesia:dirty_write(NewUser). or use a transaction...
Fun = fun() ->
mnesia:write(NewUser)
end,
mnesia:transaction(Fun).
add_sample_data() ->
Flavio = #user{username="flavio"
, user_details=#user_details{ password="mypassword", firstname="Flavio",
lastname="Ishii", sports=["biking","basketball"]}},
insert_user(Flavio),
Bob = #user{username="bob",
user_details=#user_details{ password="hispassword", firstname="Bob",
lastname="The Builder", sports=["soccer"]}},
insert_user(Bob),
io:format("Users added to table.~n").
% > api_db:mne_fun_query({sport,"soccer"}).
mne_fun_query({sport,Sport}) ->
UserDetails = #user_details{_='_',sports='$1'},
MatchHead = #user{user_details=UserDetails,_='_'},
Guard = [{'=:=','$1',[Sport]}],
Result = ['$_'],
MatchSpec = [{MatchHead, Guard, Result}],
F = fun() -> mnesia:select(user, MatchSpec) end,
mnesia:transaction(F);