nouveau_message(Mess, Auteur_id, Repond_A_ids) ->\r
% regarde si les id 'Repond_A' existent\r
F = fun() -> \r
- Repond_a = lists:map(\r
- fun(Repond_a_id) ->\r
- [M] = mnesia:read({minichat, Repond_a_id}),\r
- M\r
- end,\r
+ Repond_a = lists:foldr(\r
+ fun(Repond_a_id, Acc) ->\r
+ case mnesia:read({minichat, Repond_a_id}) of
+ [M] -> [M | Acc];\r
+ _ -> Acc % le message n'est pas trouvé
+ end\r
+ end,
+ [],\r
Repond_A_ids\r
- ), \r
+ ),\r
Racine_id = case Repond_a of\r
[] -> undefined;\r
[M | _] -> \r
_ ->\r
{erreur, "Les messages ne font pas partie de la même conversation"}\r
end\r
- end,\r
- case Racine_id of\r
- {erreur, E} -> {erreur, E};\r
- _ ->\r
- % est-ce que l'auteur existe ?\r
- case mnesia:wread({user, Auteur_id}) of\r
- [#user{profile = Profile} = Auteur] ->\r
- if length(Repond_a) =/= length(Repond_A_ids) ->\r
- {erreur, "Un ou plusieurs messages introuvable"};\r
- true ->\r
+ end,
+ if length(Repond_a) =/= length(Repond_A_ids) ->
+ {erreur, "Un ou plusieurs messages introuvable"};
+ true ->\r
+ case Racine_id of\r
+ {erreur, E} -> {erreur, E};\r
+ _ ->\r
+ % est-ce que l'auteur existe ?\r
+ case mnesia:wread({user, Auteur_id}) of\r
+ [#user{profile = Profile} = Auteur] ->\r
% comparaison entre la date du dernier poste et maintenant (gestion du flood)\r
Now = now(),\r
Delta = euphorik_common:delta_date_ms(Auteur#user.date_derniere_connexion, Now),\r
racine_id = if Racine_id =:= undefined -> Id; true -> Racine_id end\r
}),\r
Id\r
- end\r
- end;\r
- _ ->\r
- {erreur, "L'auteur du message est introuvable"}\r
- end\r
+ end;\r
+ _ ->\r
+ {erreur, "L'auteur du message est introuvable"}\r
+ end\r
+ end
end\r
end,\r
resultat_transaction(mnesia:transaction(F)).\r
messages(N, 1).\r
\r
\r
-% Renvoie N messages se trouvant sur la page P\r
+% Renvoie N messages se trouvant sur la page P
+% TODO FIXME : fonction en O(N * P) !\r
messages(N, P) ->\r
- F = fun() ->\r
- C = cursor(\r
- qlc:keysort(\r
- #minichat.id, \r
- q([E#minichat{contenu = contenu_message(E)} || E <- mnesia:table(minichat)]),\r
- [{order, descending}]\r
- ),\r
- [{tmpdir, ?KEY_SORT_TEMP_DIR}]\r
- ),\r
- if P > 1 -> qlc:next_answers(C, N * (P - 1));\r
- true -> ok\r
- end,\r
- R = qlc:next_answers(C, N),\r
- qlc:delete_cursor(C),\r
- R\r
+ F = fun() ->
+ % % #minichat{contenu = contenu_message(E)}
+ get_tuples_avant(minichat, reculer(minichat, mnesia:last(minichat), N * (P - 1)), N) \r
end,\r
- lists:reverse(resultat_transaction(mnesia:transaction(F))).\r
-\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).
+ \r
\r
% Renvoie les messages manquants pour la page P en sachant qu'il y a N message\r
% par page et que le dernier message que l'on possède est Id\r