FIX #88 (pas testé la conversion de la BD vers la version 3)
authorGreg Burri <greg.burri@gmail.com>
Tue, 7 Oct 2008 21:40:23 +0000 (21:40 +0000)
committerGreg Burri <greg.burri@gmail.com>
Tue, 7 Oct 2008 21:40:23 +0000 (21:40 +0000)
modules/erl/euphorik_bd.erl
modules/erl/euphorik_bd_admin.erl
modules/erl/euphorik_minichat_conversation.erl
modules/erl/euphorik_protocole.erl
modules/include/euphorik_bd.hrl

index 7d5c79c..f1d5a60 100755 (executable)
@@ -79,7 +79,8 @@
    elire_troll/0,\r
    \r
    % utiles :\r
-   resultat_transaction/1\r
+   resultat_transaction/1,
+   get_tuples/3 % must be in a transaction\r
 ]).\r
 -import(qlc, [e/2, q/1, cursor/2]).\r
 -include("../include/euphorik_bd.hrl").\r
@@ -373,23 +374,22 @@ messages(N) ->
 messages(N, P) ->\r
    F = fun() ->
       % % #minichat{contenu = contenu_message(E)}
-      get_tuples_avant(minichat, reculer(minichat, mnesia:last(minichat), N * (P - 1)), N)     \r
+      get_tuples(minichat, mnesia:table_info(minichat, size) - N * P + 1, N)\r
    end,\r
    resultat_transaction(mnesia:transaction(F)).
    
-get_tuples_avant(Table, Id, N) ->
-   get_tuples_avant(Table, Id, N, []).
-get_tuples_avant(_, '$end_of_table', _, Tuples) -> Tuples;
-get_tuples_avant(_, _, 0, Tuples) ->
-   Tuples;
-get_tuples_avant(Table, Id, N, Tuples) ->
-   [T] = mnesia:read({Table, Id}),
-   get_tuples_avant(Table, mnesia:prev(Table, Id), N - 1, [T | Tuples]).
 
-reculer(_, '$end_of_table' = Fin, _) -> Fin;
-reculer(_, Id, 0) -> Id;
-reculer(Table, Id, N) ->
-   reculer(Table, mnesia:prev(Table, Id), N - 1).
+get_tuples(Table, First_id, N) ->
+   lists:foldr(
+      fun(Id, Acc) ->
+         case mnesia:read({Table, Id}) of
+            [T] -> [T | Acc];
+            _ -> Acc
+         end
+      end,
+      [],
+      lists:seq(First_id, First_id + N - 1)
+   ).
    \r
 \r
 % Renvoie les messages manquants pour la page P en sachant qu'il y a N message\r
index 66427d3..037de96 100644 (file)
@@ -85,7 +85,6 @@ create_tables() ->
       {disc_copies, [node()]}
    ]),
    mnesia:create_table(minichat, [
-      {type, ordered_set},
       {attributes, record_info(fields, minichat)},
       {disc_copies, [node()]}
    ]),
@@ -269,13 +268,7 @@ patch(1) ->
       {atomic, _} -> ok
    end;\r
 % 2 -> 3\r
-patch(2) ->
-   % première étape : changer le type de la table minichat de set à ordered_set
-   % TODO : trouver un meilleur moyen que de passer par un backup
-   backup("tmp"),
-   create(),
-   restore("tmp"),
-   file:delete(dossier_backups() ++ "tmp"),\r
+patch(2) ->\r
    mnesia:transform_table(\r
       troll,\r
       fun({troll, Id_troll, Id_user, Date_create, Date_post, Content}) ->\r
@@ -292,10 +285,23 @@ patch(2) ->
    mnesia:transform_table(\r
       minichat,\r
       fun({minichat, Id, Auteur_id, Date, Pseudo, Contenu, _Troll_id, Racine_id}) ->\r
-         {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Racine_id}\r
+         {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Racine_id, normal}\r
       end,\r
       record_info(fields, minichat)\r
-   ),\r
+   ),
+   % comble les trous entre les id non-contigues
+   mnesia:transaction(fun() ->
+      lists:foreach(fun(Id) ->
+            case mnesia:read({minichat, Id}) of
+               [] -> 
+                  {ok, #user{profile = Profile}} = euphorik_bd:user_by_id(0),
+                  mnesia:write(#minichat{id = Id, auteur_id = 0, date = undefined, pseudo = Profile#profile.pseudo, contenu = "Comblement...", racine_id = Id, status = deleted});
+               _ -> rien
+            end
+         end,
+         lists:seq(1, mnesia:table_info(minichat, size))
+      )
+   end),\r
    creer_indexes(). % uniquement pour l'indice sur id_minichat de la table troll\r
 
 
index 4d0b3a8..2b4453f 100755 (executable)
@@ -109,7 +109,7 @@ mise_en_forme_conversation(Messages) ->
 conversations_detailees(Racines, N, D, P) ->   \r
    Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines),\r
    Conversation_principale = resultat_transaction(transaction(fun() ->
-      Dernier_id = mnesia:last(minichat),\r
+      Dernier_id = mnesia:table_info(minichat, size),\r
       {CP, Plus} = conversation_principale(Dernier_id, Conversations, N, P),\r
       {[M || M <- CP, M > D], Plus} % filtre en fonction de D\r
    end)),\r
@@ -142,18 +142,17 @@ conversation_principale(Id, Conversations, N, P) ->
 % @spec conversation_principale2(integer(), [integer()], integer(), integer()) -> [integer()]\r
 conversation_principale2(_, _, 0, _) ->\r
    [];
-conversation_principale2('$end_of_table', _, _, _) ->
+conversation_principale2(0, _, _, _) ->
    [];\r
 conversation_principale2(Id, Messages, N, S) ->
-   % traitement message par message (pas des plus performant :/)
-   Id_prev = mnesia:prev(minichat, Id),\r
+   % traitement message par message (pas des plus performant :/)\r
    Doit_etre_saute = any(fun(E) -> E == Id end, Messages),\r
    if  Doit_etre_saute -> \r
-         conversation_principale2(Id_prev, Messages, N, S); % le message ne fait pas partie de la conversation\r
+         conversation_principale2(Id - 1, Messages, N, S); % le message ne fait pas partie de la conversation\r
       S =:= 0 ->\r
-         [Id | conversation_principale2(Id_prev, Messages, N - 1, S)]; % ok : le message fait partie de la conversation\r
+         [Id | conversation_principale2(Id - 1, Messages, N - 1, S)]; % ok : le message fait partie de la conversation\r
       true ->\r
-         conversation_principale2(Id_prev, Messages, N, S - 1) % on n'a pas encore atteint le début de la page\r
+         conversation_principale2(Id - 1, Messages, N, S - 1) % on n'a pas encore atteint le début de la page\r
       end.\r
    \r
    \r
index 1fb3cc1..24768ea 100755 (executable)
@@ -308,7 +308,7 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id
                                        {Racine_id, _, _} = Racine,\r
                                        case euphorik_bd:message_by_id(Racine_id) of\r
                                           {ok, Mess} ->\r
-                                             json_message(Mess, euphorik_bd:parents(Racine), User);\r
+                                             json_message(Mess, euphorik_bd:parents(Racine_id), User);\r
                                           _ ->\r
                                              null\r
                                        end\r
index 0b04c4b..4838b30 100755 (executable)
@@ -56,7 +56,8 @@
       date, % erlang:now()
       pseudo, % chaine de caractère
       contenu, % chaine de caractère
-      racine_id = undefined % la racine, par défaut correspond à l'id du message
+      racine_id = undefined, % la racine, par défaut correspond à l'id du message
+      status = normal % can be equal to normal, censored or deleted
    }).