From 861bc33f2a9d811fd6a60b11929ef74e2404848d Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Tue, 7 Oct 2008 21:40:23 +0000 Subject: [PATCH] =?utf8?q?FIX=20#88=20(pas=20test=C3=A9=20la=20conversion?= =?utf8?q?=20de=20la=20BD=20vers=20la=20version=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- modules/erl/euphorik_bd.erl | 28 +++++++++---------- modules/erl/euphorik_bd_admin.erl | 26 ++++++++++------- .../erl/euphorik_minichat_conversation.erl | 13 ++++----- modules/erl/euphorik_protocole.erl | 2 +- modules/include/euphorik_bd.hrl | 3 +- 5 files changed, 39 insertions(+), 33 deletions(-) diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 7d5c79c..f1d5a60 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -79,7 +79,8 @@ elire_troll/0, % utiles : - resultat_transaction/1 + resultat_transaction/1, + get_tuples/3 % must be in a transaction ]). -import(qlc, [e/2, q/1, cursor/2]). -include("../include/euphorik_bd.hrl"). @@ -373,23 +374,22 @@ messages(N) -> messages(N, P) -> F = fun() -> % % #minichat{contenu = contenu_message(E)} - get_tuples_avant(minichat, reculer(minichat, mnesia:last(minichat), N * (P - 1)), N) + get_tuples(minichat, mnesia:table_info(minichat, size) - N * P + 1, N) end, 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) + ). % Renvoie les messages manquants pour la page P en sachant qu'il y a N message diff --git a/modules/erl/euphorik_bd_admin.erl b/modules/erl/euphorik_bd_admin.erl index 66427d3..037de96 100644 --- a/modules/erl/euphorik_bd_admin.erl +++ b/modules/erl/euphorik_bd_admin.erl @@ -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; % 2 -> 3 -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"), +patch(2) -> mnesia:transform_table( troll, fun({troll, Id_troll, Id_user, Date_create, Date_post, Content}) -> @@ -292,10 +285,23 @@ patch(2) -> mnesia:transform_table( minichat, fun({minichat, Id, Auteur_id, Date, Pseudo, Contenu, _Troll_id, Racine_id}) -> - {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Racine_id} + {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Racine_id, normal} end, record_info(fields, minichat) - ), + ), + % 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), creer_indexes(). % uniquement pour l'indice sur id_minichat de la table troll diff --git a/modules/erl/euphorik_minichat_conversation.erl b/modules/erl/euphorik_minichat_conversation.erl index 4d0b3a8..2b4453f 100755 --- a/modules/erl/euphorik_minichat_conversation.erl +++ b/modules/erl/euphorik_minichat_conversation.erl @@ -109,7 +109,7 @@ mise_en_forme_conversation(Messages) -> conversations_detailees(Racines, N, D, P) -> Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines), Conversation_principale = resultat_transaction(transaction(fun() -> - Dernier_id = mnesia:last(minichat), + Dernier_id = mnesia:table_info(minichat, size), {CP, Plus} = conversation_principale(Dernier_id, Conversations, N, P), {[M || M <- CP, M > D], Plus} % filtre en fonction de D end)), @@ -142,18 +142,17 @@ conversation_principale(Id, Conversations, N, P) -> % @spec conversation_principale2(integer(), [integer()], integer(), integer()) -> [integer()] conversation_principale2(_, _, 0, _) -> []; -conversation_principale2('$end_of_table', _, _, _) -> +conversation_principale2(0, _, _, _) -> []; conversation_principale2(Id, Messages, N, S) -> - % traitement message par message (pas des plus performant :/) - Id_prev = mnesia:prev(minichat, Id), + % traitement message par message (pas des plus performant :/) Doit_etre_saute = any(fun(E) -> E == Id end, Messages), if Doit_etre_saute -> - conversation_principale2(Id_prev, Messages, N, S); % le message ne fait pas partie de la conversation + conversation_principale2(Id - 1, Messages, N, S); % le message ne fait pas partie de la conversation S =:= 0 -> - [Id | conversation_principale2(Id_prev, Messages, N - 1, S)]; % ok : le message fait partie de la conversation + [Id | conversation_principale2(Id - 1, Messages, N - 1, S)]; % ok : le message fait partie de la conversation true -> - conversation_principale2(Id_prev, Messages, N, S - 1) % on n'a pas encore atteint le début de la page + conversation_principale2(Id - 1, Messages, N, S - 1) % on n'a pas encore atteint le début de la page end. diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index 1fb3cc1..24768ea 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -308,7 +308,7 @@ wait_event_page_chat(User, Racines_conversations, Message_count, Last_message_id {Racine_id, _, _} = Racine, case euphorik_bd:message_by_id(Racine_id) of {ok, Mess} -> - json_message(Mess, euphorik_bd:parents(Racine), User); + json_message(Mess, euphorik_bd:parents(Racine_id), User); _ -> null end diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index 0b04c4b..4838b30 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -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 }). -- 2.45.2