Merge branch 'master' of github.com:jeena/GGS

This commit is contained in:
Jeena Paradies 2011-02-22 03:11:47 +01:00
commit 8953d23dca
7 changed files with 148 additions and 1 deletions

@ -1 +1 @@
Subproject commit 709b568efbc99c954507d1593bc5633f900bc5dc Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270

4
mnesia/build_db Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/env bash
erlc -o . ggs_db.erl
erlc -o . ggs_db_test.erl

4
mnesia/build_test_db Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/env bash
./build_db
./test_db

6
mnesia/ggs_db.hrl Normal file
View file

@ -0,0 +1,6 @@
%% gamedb.hrl
-record(player, {id, name}).
-record(data, {key, value}).

3
mnesia/test_db Executable file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
erl -eval 'eunit:test(ggs_db_test), q().'

86
src/ggs_db.erl Normal file
View file

@ -0,0 +1,86 @@
%%%%----------------------------------------------------
%%% @author Mattias Pettersson <mattiaspgames@gmail.com>
%%% @copyright 2011 Mattias Pettersson
%%% @doc Database for runtime game variable storage.
%%% @end
-module(ggs_db).
-import(mnesia).
%-compile({no_auto_import,[length/2]}).
-export([init/0,setItem/4,getItem/3,removeItem/3,key/3,clear/2,length/2]).
-include("ggs_db.hrl").
%%-----------------------------------------------------
%% Creation
%%-----------------------------------------------------
init() ->
mnesia:create_table(data, [{attributes, record_info(fields, data)}]).
%%-----------------------------------------------------
%% Test
%%-----------------------------------------------------
%test_data() ->
% set(0, "Hello"),
% get(0).
%%-----------------------------------------------------
%% Insertions
%%-----------------------------------------------------
setItem(Db,Ns,Key,Value) ->
Fun = fun() ->
Data = #data{key = {Db,Ns,Key}, value = Value},
mnesia:write(Data)
end,
mnesia:transaction(Fun).
%%-----------------------------------------------------
%% Deletions
%%-----------------------------------------------------
removeItem(Db,Ns,Key) ->
Fun = fun() ->
mnesia:delete({data,{Db,Ns,Key}})
end,
mnesia:transaction(Fun).
clear(Db,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==Db) and (B==Ns)) end, Keys),
lists:map(fun({A,B,C}) -> removeItem(A,B,C) end, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
%%-----------------------------------------------------
%% Querries
%%-----------------------------------------------------
getItem(Db,Ns,Key) ->
Fun = fun() ->
[Data] = mnesia:read(data, {Db,Ns,Key}),
Data#data.value
end,
mnesia:transaction(Fun).
length(Db,Ns) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
length(lists:filter(fun({A,B,_}) -> ((A==Db) and (B==Ns)) end, Keys))
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.
key(Db,Ns,Position) ->
Fun = fun() ->
Keys = mnesia:all_keys(data),
Rest = lists:filter(fun({A,B,_}) -> ((A==Db) and (B==Ns)) end, Keys),
lists:nth(Position, Rest)
end,
{atomic, Ret} = mnesia:transaction(Fun),
Ret.

44
tests/ggs_db_test.erl Normal file
View file

@ -0,0 +1,44 @@
-module(ggs_db_test).
%-compile({no_auto_import,[get/1,set/2]}).
-include_lib("eunit/include/eunit.hrl").
%ggs_db_test_() ->
% {spawn,
% {setup, fun setup/0, fun cleanup/1,[ fun ggs_db_test/0 ]}
% }.
%Key should be a tuple of two elements
getItem_setItem_test() ->
mnesia:start(),
ggs_db:init(),
ggs_db:setItem("dbname","nsname","keyname","Hello"),
?assertMatch({atomic,"Hello"},ggs_db:getItem("dbname","nsname","keyname")).
length_test() ->
ggs_db:setItem(1,1,2,"112"),
ggs_db:setItem(1,2,2,"122"),
ggs_db:setItem(1,1,3,"113"),
ggs_db:setItem(1,1,4,"114"),
?assertEqual(ggs_db:length(1,1), 3).
removeItem_test() ->
ggs_db:removeItem(1,1,4),
?assertNot(ggs_db:getItem(1,1,4) =:= {atomic,"114"}).
key_test() ->
?assert(ggs_db:key(1,1,2) =:= {1,1,3}).
clear_test() ->
ggs_db:clear(1,1),
?assert(ggs_db:length(1,1) =:= 0),
mnesia:stop().
%tests() ->
% ggs_db_test().
%ggs_db_test() ->
% ggs_db:set(0, "Hello"),
%io:format("~s",[Val]),
% ?assertMatch({atomic,"Hello"},ggs_db:get(0)).