Don't like ads? PRO users don't see any ads ;-)
Guest

Erlang DB elections

By: a guest on Apr 25th, 2012  |  syntax: Erlang  |  size: 3.33 KB  |  hits: 33  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. -module(database).
  2. -export([
  3.                         initialize/0,
  4.                         list_pollable/0,
  5.                         start/0,
  6.                         clean/0,
  7.                         unfold_client/1,
  8.                         is_client/1,
  9.                         insert_poll/1,
  10.                         list_poll/1,
  11.                         define_stat/1,
  12.                         stop/0
  13.                 ]).
  14.  
  15. %% Inclusion des librairies tierces
  16. -include("datas.hrl").
  17.  
  18. %% Initialisation de la base de données
  19. initialize() ->
  20.         mnesia:create_schema([node()]),
  21.         mnesia:start(),
  22.         case mnesia:create_table(
  23.                 clients,
  24.                 [{attributes, record_info(fields, clients)},
  25.                 {type, ordered_set},
  26.                 {disc_copies, [node()]}]
  27.         ) of
  28.                 {atomic, ok} -> io:format("Clients created~n", []);
  29.                 {aborted, Reason} -> exit(Reason)
  30.         end,
  31.         case mnesia:create_table(
  32.                 polls,
  33.                 [{attributes, record_info(fields, polls)},
  34.                 {type, ordered_set},
  35.                 {disc_copies, [node()]}]
  36.         ) of
  37.                 {atomic, ok} -> io:format("Clients created~n", []);
  38.                 {aborted, ReasonI} -> exit(ReasonI)
  39.         end,
  40.         insert_clients(liste_clients()),
  41.         io:format("Table Initialized~n", []),
  42.         mnesia:stop().
  43.  
  44. %% Initialisation des candidats
  45. %% Pas besoin de le stocker en base de données
  46. list_pollable() ->
  47.         [
  48.                 {0, "Sarkozy"},
  49.                 {0, "Hollande"},
  50.                 {0, "Lepend"},
  51.                 {0, "Melanchon"},
  52.                 {0, "Bayrou"},
  53.                 {0, "Joly"}
  54.         ].
  55.  
  56. %% Liste des votants
  57. %% Les clés sont des multiples de 3 :)
  58. liste_clients() ->
  59.         lists:seq(0, 99, 3).
  60.  
  61. %% Retourne l'id adéquat
  62. get_next_id(Table) ->
  63.         Fun = fun() -> mnesia:last(Table) end,
  64.         case mnesia:transaction(Fun) of
  65.                 {aborted, Reason} -> error;
  66.                 {atomic, '$end_of_table'} -> 0;
  67.                 {atomic, Id} -> Id + 1
  68.         end.
  69.  
  70. %% Insertion de tous les clients
  71. insert_clients([]) -> ok;
  72. insert_clients([Head|Tail]) ->
  73.         insert_client(Head),
  74.         insert_clients(Tail).
  75.  
  76. %% Insertion d'un client
  77. insert_client(Hash) ->
  78.         Id = get_next_id(clients),
  79.         Add = #clients{id=Id, hashkey=Hash},
  80.         Transaction = fun() -> mnesia:write(Add) end,
  81.         {atomic, ok} = mnesia:transaction(Transaction),
  82.         ok.
  83.  
  84. %% Insertion d'un vote
  85. insert_poll(For) ->
  86.         Id = get_next_id(polls),
  87.         Add = #polls{id=Id, for=For},
  88.         Transaction = fun() -> mnesia:write(Add) end,
  89.         {atomic, ok} = mnesia:transaction(Transaction),
  90.         ok.
  91.  
  92. %% Déplie un client et le fait voter
  93. unfold_client(Id) ->
  94.         Transaction = fun() -> mnesia:delete({clients, Id}) end,
  95.         case mnesia:transaction(Transaction) of
  96.                 {atomic, ok} -> ok;
  97.                 {aborted, Reason} -> exit(Reason)
  98.         end.
  99.        
  100. %% Retourne les informations d'un client
  101. is_client(Hashkey) ->
  102.         Transaction = fun() -> mnesia:match_object(#clients{id='_', hashkey=Hashkey}) end,
  103.         {atomic, Result} = mnesia:transaction(Transaction),
  104.         case Result of
  105.                 [{clients, Id, Key}] -> Id;
  106.                 [] -> error
  107.         end.
  108.  
  109. list_poll(Id_cand) ->
  110.         Transaction = fun() -> mnesia:match_object(#polls{id='_', for=Id_cand}) end,
  111.         {atomic, Result} = mnesia:transaction(Transaction),
  112.         case Result of
  113.                 [] -> 0;
  114.                 _ -> length(Result)
  115.         end.
  116.  
  117. define_stat(Id_cand) ->
  118.         Transaction = fun() -> mnesia:match_object(#polls{id='_', for='_'}) end,
  119.         {atomic, Result} = mnesia:transaction(Transaction),
  120.         Total = case Result of
  121.                 [] -> 0;
  122.                 _ -> length(Result)
  123.         end,
  124.         N = list_poll(Id_cand),
  125.         Percent = (N * 100)/Total,
  126.         Percent.
  127.        
  128. %% lancement du serveur mnesia
  129. start() ->
  130.         mnesia:start(),
  131.         io:format("Database Launched~n", []).
  132.  
  133. %% Fermeture du serveur
  134. stop() ->
  135.         mnesia:stop(),
  136.         io:format("Database Stopped~n", []).
  137.  
  138. %% Clean
  139. clean() ->
  140.         mnesia:delete_table(clients),
  141.         mnesia:delete_table(polls),
  142.         ok.