X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_bd.erl;h=f1d5a601e6cc7db50dcc9cff5aeb2983cdb3e2e8;hp=cfd0bfd673dc57d4df8f8b134fd8627ac1d37ccd;hb=861bc33f2a9d811fd6a60b11929ef74e2404848d;hpb=efae3fc07564a2a29b24f8c87b6d8f6658b873a0 diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index cfd0bfd..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"). @@ -275,13 +276,16 @@ user_by_mess(Id) -> nouveau_message(Mess, Auteur_id, Repond_A_ids) -> % regarde si les id 'Repond_A' existent F = fun() -> - Repond_a = lists:map( - fun(Repond_a_id) -> - [M] = mnesia:read({minichat, Repond_a_id}), - M - end, + Repond_a = lists:foldr( + fun(Repond_a_id, Acc) -> + case mnesia:read({minichat, Repond_a_id}) of + [M] -> [M | Acc]; + _ -> Acc % le message n'est pas trouvé + end + end, + [], Repond_A_ids - ), + ), Racine_id = case Repond_a of [] -> undefined; [M | _] -> @@ -293,16 +297,16 @@ nouveau_message(Mess, Auteur_id, Repond_A_ids) -> _ -> {erreur, "Les messages ne font pas partie de la même conversation"} end - end, - case Racine_id of - {erreur, E} -> {erreur, E}; - _ -> - % est-ce que l'auteur existe ? - case mnesia:wread({user, Auteur_id}) of - [#user{profile = Profile} = Auteur] -> - if length(Repond_a) =/= length(Repond_A_ids) -> - {erreur, "Un ou plusieurs messages introuvable"}; - true -> + end, + if length(Repond_a) =/= length(Repond_A_ids) -> + {erreur, "Un ou plusieurs messages introuvable"}; + true -> + case Racine_id of + {erreur, E} -> {erreur, E}; + _ -> + % est-ce que l'auteur existe ? + case mnesia:wread({user, Auteur_id}) of + [#user{profile = Profile} = Auteur] -> % comparaison entre la date du dernier poste et maintenant (gestion du flood) Now = now(), Delta = euphorik_common:delta_date_ms(Auteur#user.date_derniere_connexion, Now), @@ -330,11 +334,11 @@ nouveau_message(Mess, Auteur_id, Repond_A_ids) -> racine_id = if Racine_id =:= undefined -> Id; true -> Racine_id end }), Id - end - end; - _ -> - {erreur, "L'auteur du message est introuvable"} - end + end; + _ -> + {erreur, "L'auteur du message est introuvable"} + end + end end end, resultat_transaction(mnesia:transaction(F)). @@ -365,26 +369,28 @@ messages(N) -> messages(N, 1). -% Renvoie N messages se trouvant sur la page P +% Renvoie N messages se trouvant sur la page P +% TODO FIXME : fonction en O(N * P) ! messages(N, P) -> - F = fun() -> - C = cursor( - qlc:keysort( - #minichat.id, - q([E#minichat{contenu = contenu_message(E)} || E <- mnesia:table(minichat)]), - [{order, descending}] - ), - [{tmpdir, ?KEY_SORT_TEMP_DIR}] - ), - if P > 1 -> qlc:next_answers(C, N * (P - 1)); - true -> ok - end, - R = qlc:next_answers(C, N), - qlc:delete_cursor(C), - R + F = fun() -> + % % #minichat{contenu = contenu_message(E)} + get_tuples(minichat, mnesia:table_info(minichat, size) - N * P + 1, N) end, - lists:reverse(resultat_transaction(mnesia:transaction(F))). - + resultat_transaction(mnesia:transaction(F)). + + +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 % par page et que le dernier message que l'on possède est Id @@ -709,7 +715,7 @@ put_troll(User_id, Content) -> Nb_troll_poste_total >= ?NB_MAX_TROLL_WAITING -> max_troll_reached; true -> - Id = nouvel_id(minichat), + Id = nouvel_id(troll), mnesia:write(#troll{id = Id, id_user = User_id, date_create = now(), content = Content}), Id end;