ADD script permettant la mise à jour de la BD et le rechargement des modules lors...
[euphorik.git] / modules / erl / euphorik_bd.erl
index b938f75..187d6ea 100755 (executable)
    connect/0,
    connect/1,
    reset/0,
+   update/0,
    
    % users :
    nouveau_user/2,
    nouveau_user/3,
-   set_profile/9,
+   set_profile/11,
    update_date_derniere_connexion/1,
    update_ip/2,
    update_pseudo_user/2,
    user_by_login_password/2,
    user_by_mess/1,
    toggle_ek_master/1,
+   css_from_user_cookie/1,
    
    % messages :
    nouveau_message/3,
    nouveau_message_sys/1,
+   nouveau_message_sys/2,
    messages/1,
    messages/2,\r
    messages/3,
@@ -78,6 +81,7 @@
    troll_by_id/1,
    current_troll/0,
    elire_troll/0,
+   message_id_associe/1,
    
    % versions :
    update_version/1,
@@ -108,9 +112,13 @@ create_tables() ->
       {attributes, record_info(fields, counter)},
       {disc_copies, [node()]}
    ]),
+   mnesia:create_table(proprietes, [
+      {attributes, record_info(fields, proprietes)},
+      {disc_copies, [node()]}
+   ]),
    mnesia:create_table(minichat, [
       {attributes, record_info(fields, minichat)},
-      {index, [auteur_id]},
+      {index, [auteur_id, troll_id]},
       {disc_copies, [node()]}
    ]),
    mnesia:create_table(reponse_minichat, [
@@ -152,13 +160,45 @@ reset() ->
    mnesia:clear_table(troll),
    mnesia:clear_table(ip_table),\r
    % crée l'utilisateur root\r
-   mnesia:transaction(fun() ->\r
+   mnesia:transaction(fun() ->
+      mnesia:write(#proprietes{nom = version, valeur = ?VERSION_BD}),\r
       User = #user{id = 0, pseudo = "Sys", login = "Sys", date_creation = now(), date_derniere_connexion = now(), ek_master = true},\r
       mnesia:write(User),\r
       User\r
    end).
 
 
+% Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes'
+% et exécute les patchs nécessaires.
+update() ->
+   mnesia:transaction(
+      fun() ->
+         case mnesia:read({proprietes, version}) of
+            [#proprietes{nom = Version}] ->
+               update(Version);
+            _ ->
+               erreur
+         end
+      end
+   ).
+   
+
+% Mise à jour de la BD.
+% attention : il est nécessaire de se trouver dans une transaction.
+update(?VERSION_BD) -> fini;
+update(Version) ->
+   patch(Version),
+   update(Version + 1).
+   
+   
+% Applique une modification de la BD pour passer d'une version à la suivante.
+% 1 -> 2
+patch(1) ->
+   ok.
+% 2 -> 3
+%patch(2) ->
+
+
 % Ajoute un nouveau user et le renvoie
 nouveau_user(Pseudo, Cookie) ->
    F = fun() ->
@@ -182,12 +222,12 @@ nouveau_user(Login, Password, Cookie) ->
 
 
 % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.
-set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, Page_principale, Conversations) ->
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Page_principale, Conversations) ->
    if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login ->
          resultat_transaction(mnesia:transaction(
             fun() ->
                case user_by_cookie(Cookie) of
-                  {ok, User} ->               
+                  {ok, User} ->
                      case user_by_login(Login) of
                         {ok, U} when Login =/= [], U#user.id =/= User#user.id ->
                            login_deja_pris;
@@ -201,6 +241,8 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, Page_princ
                               email = if is_list(Email) -> Email; true -> User#user.email end,
                               css = if is_list(Css) -> Css; true -> User#user.css end,
                               nick_format = Nick_format,
+                              view_times = View_times,
+                              view_tooltips = View_tooltips,
                               page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
                               conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end
                            },
@@ -357,7 +399,19 @@ toggle_ek_master(User_id) ->
       end
    )).
    
+
+% Renvoie une chaine représentant le cookie ou undefined si pas trouvé.
+css_from_user_cookie(Cookie) ->
+   case user_by_cookie(Cookie) of 
+      {ok, User} ->
+         User#user.css;
+      _ ->
+         undefined
+   end.
    
+
+
+
 user_by_login_password(Login, Password) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
@@ -430,13 +484,19 @@ inserer_reponses(_, []) ->
 % Permet de créer un message système.
 % Renvoie l'id du message système
 nouveau_message_sys(Mess) ->
+   nouveau_message_sys(Mess, undefined).
+   
+
+% Création d'un message système lié à un troll.
+nouveau_message_sys(Mess, Troll_id) ->
    {ok, Root} = user_by_id(0),
-   mnesia:transaction(
+   resultat_transaction(mnesia:transaction(
       fun() ->
          Id = nouvel_id(minichat),
-         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess})
+         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess, troll_id=Troll_id}),
+         Id
       end
-   ).
+   )).
    
    
 % Renvoie N messages se trouvant sur la première page
@@ -447,7 +507,10 @@ messages(N) ->
 % Renvoie N messages se trouvant sur la page P
 messages(N, P) ->  
    F = fun() ->
-      C = cursor(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])])),
+      C = cursor(q([
+         E#minichat{contenu = contenu_message(E)} ||
+         E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])
+      ])),
       if P > 1 -> qlc:next_answers(C, N * (P - 1));
          true -> ok
       end,
@@ -468,12 +531,18 @@ messages(Id, N, P) ->
 message_by_id(Id) ->
    case resultat_transaction(mnesia:transaction(
       fun() ->
-         e(q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id]))
+         e(q([E#minichat{contenu = contenu_message(E)} || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id]))
       end
    )) of
       [M] -> {ok, M};
       _ -> erreur
    end.
+   
+   
+% Renvoie le contenu d'un message donnée, à utiliser à l'intérieur d'une transaction.
+% TODO : Cette fonction pourrait être remplacé par un "outer-join", est-ce possible avec qlc ?
+contenu_message(E) ->
+   lists:flatten(E#minichat.contenu ++ e(q([T#troll.content || T <- mnesia:table(troll), T#troll.id =:= E#minichat.troll_id]))).
   
 
 % Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids).
@@ -678,6 +747,7 @@ trolls(Last_id) ->
    )).
    
  
+ % Crée un nouveau troll.
  % Renvoie l'id du nouveau troll
  % ou max_troll_reached_per_user si le nombre de troll posté par l'utilisateur max a été atteind
  % ou max_troll_reached si le nombre de troll posté max a été atteind
@@ -775,6 +845,7 @@ current_troll() ->
 
 
 % Elit un troll au hasard parmis les trolls en attente (leur date_post =:= undefined)
+% Un message est posté par 'Sys' et le troll elu est lié à ce message
 % met à jour sa date de post.
 % renvoie plus_de_trolls si il n'y a aucun troll en attente.
 elire_troll() ->       
@@ -788,12 +859,25 @@ elire_troll() ->
             Trolls ->
                Troll = lists:nth(random:uniform(length(Trolls)), Trolls),
                Troll2 = Troll#troll{date_post = now()},
-               mnesia:write(Troll2)
+               mnesia:write(Troll2),
+               nouveau_message_sys("Troll de la semaine : ", Troll2#troll.id)
          end
       end
    ).
    
-   
+
+% Renvoie l'id du message associé au troll dont l'id est donnée.
+% Renvoie undefined si il n'y en a pas.
+message_id_associe(Troll_id) ->
+   resultat_transaction(mnesia:transaction(
+      fun() ->
+         case e(q([M#minichat.id || M <- mnesia:table(minichat), M#minichat.troll_id =:= Troll_id])) of
+            [Id] -> Id;
+            _ -> undefined
+         end
+      end
+   )).
+      
    
 update_version(1) ->
    mnesia:transform_table(