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
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
{disc_copies, [node()]}
]),
mnesia:create_table(minichat, [
- {type, ordered_set},
{attributes, record_info(fields, minichat)},
{disc_copies, [node()]}
]),
{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
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
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
% @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
{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
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
}).