mnesia のお勉強。

mnesia は Erlang に最初から入っている DBMS です。

簡単な認証を書いてみました。
username と userpassword を送って mnesia 引いて、accept/reject を返すだけ。
はっきりいってたいしたことしてない。
ここからもっと広げていくつもり。

mnesia に興味持った人は mnesia.pdf で検索するとよいです。

-module(mnesia_test).
-compile(export_all).
-include_lib("stdlib/include/qlc.hrl").

-record(users, {user_name, user_password}).

users_table() ->
    [
        {users, <<"spam">>, <<"eubIZs47">>},
        {users, <<"eggs">>, <<"bgOYF0bT">>},
        {users, <<"bacon">>, <<"QekmMgcP">>},
        {users, <<"ham">>, <<"XQQS5R91">>}
    ].

insert_users_table() ->
    F = fun() ->
            lists:foreach(fun mnesia:write/1, users_table())
        end,
    mnesia:transaction(F).

init() ->
    mnesia:create_schema([node()]),
    mnesia:start(),
    mnesia:create_table(users, [{attributes, record_info(fields, users)}]),
    mnesia:stop().

%% accept
start() ->
    mnesia:start(),
    insert_users_table(),
    auth_spam(<<"spam">>, <<"eubIZs47">>).


auth_spam(UserName, UserPassword) ->
    case auth_eggs(UserName, UserPassword) of
        [] ->
            reject;
        [{_, _}] ->
            accept
    end.

auth_eggs(UserName, UserPassword) ->
    do(qlc:q([{User#users.user_name,
               User#users.user_password} || User <- mnesia:table(users),
                                            User#users.user_name =:= UserName,
                                            User#users.user_password =:= UserPassword])).

do(Q) ->
    F = fun() -> qlc:e(Q) end,
    {atomic, Result} = mnesia:transaction(F),
    Result.