MOD avancement dans l'extraction d'une conversation entière
[euphorik.git] / modules / erl / euphorik_bd.erl
index 6dff985..4c27577 100755 (executable)
    connect/0,
    connect/1,
    reset/0,
-   update/0,
    
    % users :
    nouveau_user/2,
    nouveau_user/3,
-   set_profile/11,
+   set_profile/10,
    update_date_derniere_connexion/1,
    update_ip/2,
    update_pseudo_user/2,
@@ -49,7 +48,7 @@
    toggle_ek_master/1,
    css_from_user_cookie/1,
    
-   % messages :
+   % messages :e
    nouveau_message/3,
    nouveau_message_sys/1,
    nouveau_message_sys/2,
@@ -60,7 +59,8 @@
    messages_by_ids/1,
    message_existe/1,
    reponses/0,
-   repond_a/1,
+   parents/1,
+   enfants/1,
    est_une_reponse_a_user/2,
    a_repondu_a_message/2,
    possede_message/2,
@@ -83,9 +83,6 @@
    elire_troll/0,
    message_id_associe/1,
    
-   % versions :
-   update_version/1,
-   
    % utiles :
    resultat_transaction/1\r
 ]).
@@ -170,37 +167,6 @@ reset() ->
    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() ->
@@ -224,7 +190,7 @@ 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, View_times, View_tooltips, Page_principale, Conversations) ->
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Conversations) ->
    if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login ->
          resultat_transaction(mnesia:transaction(
             fun() ->
@@ -245,7 +211,6 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times
                               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
                            },
                            mnesia:write(User_modifie),
@@ -455,14 +420,21 @@ user_by_mess(Id) ->
    
 % Ajoute un message. Repond_A est une liste d'id auquel le message répond
 % retourne soit l'id du message soit {erreur, <raison>}.
-nouveau_message(Mess, Auteur_id, Repond_A) ->
+nouveau_message(Mess, Auteur_id, Repond_A_ids) ->
    % regarde si les id 'Repond_A' existent
    F = fun() ->   
-      Nb_id_trouve = length(e(q([E#minichat.id || E <- mnesia:table(minichat), lists:member(E#minichat.id, Repond_A)]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])),
+      Repond_A = e(
+         q([M || M <- mnesia:table(minichat), lists:member(M#minichat.id, Repond_A_ids)]),
+         [{tmpdir, ?KEY_SORT_TEMP_DIR}]
+      ),
+      Racine_id = case Repond_A of
+         [] -> undefined;
+         [M | _ ] -> M#minichat.racine_id
+      end,
       % est-ce que l'auteur existe ?
       case e(q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of
          [Auteur] ->
-            if Nb_id_trouve =/= length(Repond_A) ->
+            if length(Repond_A) =/= length(Repond_A_ids) ->
                   {erreur, "Un ou plusieurs messages introuvable"};
                true ->
                   % comparaison entre la date du dernier poste et maintenant (gestion du flood)
@@ -481,8 +453,15 @@ nouveau_message(Mess, Auteur_id, Repond_A) ->
                   true ->     
                      mnesia:write(Auteur_maj),
                      Id = nouvel_id(minichat),
-                     inserer_reponses(Id, Repond_A),
-                     mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}),
+                     inserer_reponses(Id, Repond_A_ids),
+                     mnesia:write(#minichat{
+                        id = Id,
+                        auteur_id = Auteur#user.id,
+                        date = now(),
+                        pseudo = Auteur#user.pseudo,
+                        contenu = Mess,
+                        racine_id = if Racine_id =:= undefined -> Id; true -> Racine_id end
+                     }),
                      Id
                   end
             end;
@@ -512,7 +491,7 @@ nouveau_message_sys(Mess, Troll_id) ->
    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, troll_id=Troll_id}),
+         mnesia:write(#minichat{id=Id, auteur_id=0, date=now(), pseudo=Root#user.pseudo, contenu=Mess, troll_id=Troll_id, racine_id=Id}),
          Id
       end
    )).
@@ -604,14 +583,27 @@ reponses() ->
    
    
 % Renvoie les messages auquel M_id répond.
-repond_a(M_id) ->
+parents(M_id) ->
+   resultat_transaction(mnesia:transaction(
+      fun() ->
+         e(q(
+            [M || R <- mnesia:table(reponse_minichat),
+            M <- mnesia:table(minichat),
+            R#reponse_minichat.repondant =:= M_id,
+            M#minichat.id =:= R#reponse_minichat.cible]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
+      end
+   )).
+   
+   
+% Renvoie les message qui repondent à M_id
+enfants(M_id) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
          e(q(
-            [M || E <- mnesia:table(reponse_minichat),
+            [M || R <- mnesia:table(reponse_minichat),
             M <- mnesia:table(minichat),
-            E#reponse_minichat.repondant =:= M_id,
-            M#minichat.id =:= E#reponse_minichat.cible]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
+            R#reponse_minichat.cible =:= M_id,
+            M#minichat.id =:= R#reponse_minichat.repondant]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])
       end
    )).
    
@@ -907,16 +899,7 @@ message_id_associe(Troll_id) ->
          end
       end
    )).
-      
-   
-update_version(1) ->
-   mnesia:transform_table(
-      ip_table,
-      fun() -> null end,
-      record_info(fields, ip_table),
-      ip_table
-   ).
-   
+
    
 % Renvoie le résultat d'une transaction (en décomposant le tuple fournit)
 resultat_transaction({_, T}) ->
@@ -932,17 +915,6 @@ delta_date_minute(D1, D2) ->
    trunc(delta_date_ms(D1, D2) / 1000 / 60).
 
 
-% Bizarre, cette fonction n'existe pas dans la stdlib.
-% Pas utilisé mais bon ca me fait de la peine de l'enlever.
-ceiling(X) ->
-   T = trunc(X),
-   case (X - T) of
-      Neg when Neg < 0 -> T;
-      Pos when Pos > 0 -> T + 1;
-      _ -> T
-   end.
-
-
 % Renvoie un nouvel id pour une table donnée
 nouvel_id(Table) ->
    mnesia:dirty_update_counter(counter, Table, 1).\r