diff --git a/erlang_js b/erlang_js index 709b568..5350ed2 160000 --- a/erlang_js +++ b/erlang_js @@ -1 +1 @@ -Subproject commit 709b568efbc99c954507d1593bc5633f900bc5dc +Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270 diff --git a/mnesia/build_db b/mnesia/build_db new file mode 100755 index 0000000..0aa2042 --- /dev/null +++ b/mnesia/build_db @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + + erlc -o . ggs_db.erl + erlc -o . ggs_db_test.erl diff --git a/mnesia/build_test_db b/mnesia/build_test_db new file mode 100755 index 0000000..f5aa938 --- /dev/null +++ b/mnesia/build_test_db @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +./build_db +./test_db diff --git a/mnesia/ggs_db.hrl b/mnesia/ggs_db.hrl new file mode 100644 index 0000000..bc13c3a --- /dev/null +++ b/mnesia/ggs_db.hrl @@ -0,0 +1,6 @@ +%% gamedb.hrl + +-record(player, {id, name}). +-record(data, {key, value}). + + diff --git a/mnesia/test_db b/mnesia/test_db new file mode 100755 index 0000000..958b005 --- /dev/null +++ b/mnesia/test_db @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +erl -eval 'eunit:test(ggs_db_test), q().' diff --git a/src/ggs_db.erl b/src/ggs_db.erl new file mode 100644 index 0000000..912d349 --- /dev/null +++ b/src/ggs_db.erl @@ -0,0 +1,86 @@ +%%%%---------------------------------------------------- +%%% @author Mattias Pettersson +%%% @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. + + + diff --git a/tests/ggs_db_test.erl b/tests/ggs_db_test.erl new file mode 100644 index 0000000..ea6e12e --- /dev/null +++ b/tests/ggs_db_test.erl @@ -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)). +