-module(database).
-export([
initialize/0,
list_pollable/0,
start/0,
clean/0,
unfold_client/1,
is_client/1,
insert_poll/1,
list_poll/1,
define_stat/1,
stop/0
]).
%% Inclusion des librairies tierces
-include("datas.hrl").
%% Initialisation de la base de données
initialize() ->
mnesia:create_schema([node()]),
mnesia:start(),
case mnesia:create_table(
clients,
[{attributes, record_info(fields, clients)},
{type, ordered_set},
{disc_copies, [node()]}]
) of
{atomic, ok} -> io:format("Clients created~n", []);
{aborted, Reason} -> exit(Reason)
end,
case mnesia:create_table(
polls,
[{attributes, record_info(fields, polls)},
{type, ordered_set},
{disc_copies, [node()]}]
) of
{atomic, ok} -> io:format("Clients created~n", []);
{aborted, ReasonI} -> exit(ReasonI)
end,
insert_clients(liste_clients()),
io:format("Table Initialized~n", []),
mnesia:stop().
%% Initialisation des candidats
%% Pas besoin de le stocker en base de données
list_pollable() ->
[
{0, "Sarkozy"},
{0, "Hollande"},
{0, "Lepend"},
{0, "Melanchon"},
{0, "Bayrou"},
{0, "Joly"}
].
%% Liste des votants
%% Les clés sont des multiples de 3 :)
liste_clients() ->
lists:seq(0, 99, 3).
%% Retourne l'id adéquat
get_next_id(Table) ->
Fun = fun() -> mnesia:last(Table) end,
case mnesia:transaction(Fun) of
{aborted, Reason} -> error;
{atomic, '$end_of_table'} -> 0;
{atomic, Id} -> Id + 1
end.
%% Insertion de tous les clients
insert_clients([]) -> ok;
insert_clients([Head|Tail]) ->
insert_client(Head),
insert_clients(Tail).
%% Insertion d'un client
insert_client(Hash) ->
Id = get_next_id(clients),
Add = #clients{id=Id, hashkey=Hash},
Transaction = fun() -> mnesia:write(Add) end,
{atomic, ok} = mnesia:transaction(Transaction),
ok.
%% Insertion d'un vote
insert_poll(For) ->
Id = get_next_id(polls),
Add = #polls{id=Id, for=For},
Transaction = fun() -> mnesia:write(Add) end,
{atomic, ok} = mnesia:transaction(Transaction),
ok.
%% Déplie un client et le fait voter
unfold_client(Id) ->
Transaction = fun() -> mnesia:delete({clients, Id}) end,
case mnesia:transaction(Transaction) of
{atomic, ok} -> ok;
{aborted, Reason} -> exit(Reason)
end.
%% Retourne les informations d'un client
is_client(Hashkey) ->
Transaction = fun() -> mnesia:match_object(#clients{id='_', hashkey=Hashkey}) end,
{atomic, Result} = mnesia:transaction(Transaction),
case Result of
[{clients, Id, Key}] -> Id;
[] -> error
end.
list_poll(Id_cand) ->
Transaction = fun() -> mnesia:match_object(#polls{id='_', for=Id_cand}) end,
{atomic, Result} = mnesia:transaction(Transaction),
case Result of
[] -> 0;
_ -> length(Result)
end.
define_stat(Id_cand) ->
Transaction = fun() -> mnesia:match_object(#polls{id='_', for='_'}) end,
{atomic, Result} = mnesia:transaction(Transaction),
Total = case Result of
[] -> 0;
_ -> length(Result)
end,
N = list_poll(Id_cand),
Percent = (N * 100)/Total,
Percent.
%% lancement du serveur mnesia
start() ->
mnesia:start(),
io:format("Database Launched~n", []).
%% Fermeture du serveur
stop() ->
mnesia:stop(),
io:format("Database Stopped~n", []).
%% Clean
clean() ->
mnesia:delete_table(clients),
mnesia:delete_table(polls),
ok.