This repository has been archived on 2025-08-18. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
GGS/src/ggs_db.erl
2011-04-12 00:58:29 +02:00

83 lines
2.5 KiB
Erlang

-module(ggs_db).
-export([init/0,stop/0,setItem/4,getItem/3,removeItem/3,key/3,clear/2,clear/1,length/2]).
%-include("ggs_db.hrl").
-record(data, {key, value}).
%%-----------------------------------------------------
%% Creation
%%-----------------------------------------------------
init() ->
% mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(data, [{attributes, record_info(fields, data)}]).
stop() ->
mnesia:stop().
%%-----------------------------------------------------
%% Insertions
%%-----------------------------------------------------
setItem(GameToken,Ns,Key,Value) ->
Fun = fun() ->
Data = #data{key = {GameToken,Ns,Key}, value = Value},
mnesia:write(Data)
end,
mnesia:transaction(Fun).
%%-----------------------------------------------------
%% Deletions
%%-----------------------------------------------------
removeItem(GameToken,Ns,Key) ->
Fun = fun() ->
mnesia:delete({data,{GameToken,Ns,Key}})
end,
mnesia:transaction(Fun).
clear(GameToken,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
clear(GameToken) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,_,_}) -> (A==GameToken) end, Keys),
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
%%-----------------------------------------------------
%% Queries
%%-----------------------------------------------------
getItem(GameToken,Ns,Key) ->
Fun = fun() ->
mnesia:read(data, {GameToken,Ns,Key})
end,
case mnesia:transaction(Fun) of
{atomic, []} -> {error};
{atomic, [Ret]} -> Ret#data.value
end.
length(GameToken,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
length(lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys))
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
key(GameToken,Ns,Position) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==GameToken) and (B==Ns)) end, Keys),
lists:nth(Position, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.