X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_bd.erl;h=4e470993240cd4649307dd840e27f0c7d8fbc3a2;hp=187d6eaea9c722223ddb47f48d5b8c7e001747c5;hb=8bede29111bde3481ed8b3d6637c241c8d241544;hpb=64ef87442b933d47f4dbc9dfec9a5a16e522c375 diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 187d6ea..4e47099 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -30,11 +30,12 @@ connect/1, reset/0, update/0, + restore/1, % users : nouveau_user/2, nouveau_user/3, - set_profile/11, + set_profile/10, update_date_derniere_connexion/1, update_ip/2, update_pseudo_user/2, @@ -89,7 +90,7 @@ % utiles : resultat_transaction/1 ]). --import(qlc, [e/1, e/2, q/1, cursor/1]). +-import(qlc, [e/2, q/1, cursor/2]). -include("../include/euphorik_bd.hrl"). -include("../include/euphorik_defines.hrl"). -include_lib("stdlib/include/qlc.hrl"). @@ -107,6 +108,7 @@ create() -> mnesia:start(), create_tables(), reset(). + create_tables() -> mnesia:create_table(counter, [ {attributes, record_info(fields, counter)}, @@ -153,7 +155,8 @@ connect(Node) -> % Efface tous les users, minichat_reponse et minichat. reset() -> - mnesia:clear_table(counter), + mnesia:clear_table(counter), + mnesia:clear_table(proprietes), mnesia:clear_table(user), mnesia:clear_table(reponse_minichat), mnesia:clear_table(minichat), @@ -187,18 +190,54 @@ update() -> % attention : il est nécessaire de se trouver dans une transaction. update(?VERSION_BD) -> fini; update(Version) -> - patch(Version), - update(Version + 1). + case mnesia:backup(mnesia:system_info(directory) ++ "/backup" ++ integer_to_list(Version)) of + ok -> + case patch(Version) of + ok -> + mnesia:write(#proprietes{nom = version, valeur = Version + 1}), + update(Version + 1); + _ -> + erreur + end; + {error, Raison} -> {error, lists:flatten(io_lib:format("Erreur de création du backup de la version ~w : ~w", [Version, Raison]))} + end. % Applique une modification de la BD pour passer d'une version à la suivante. +% crée un backup avant l'application du patch +% dans BD/backups nommé "backup" où et le numéro de la version. % 1 -> 2 patch(1) -> + % traitement des users + mnesia:transform_table( + user, + fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Nick_format, View_times, View_tooltips, Indice_flood, _Page_principale, Conversations, Ek_master, Last_ip}) -> + {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Nick_format, View_times, View_tooltips, reverse, Indice_flood, lists:map(fun({C, _}) -> C end, Conversations), Ek_master, Last_ip} + end, + record_info(fields, user), + user + ), + mnesia:transform_table( + minichat, + fun({minichat, Id, Auteur_id, Date, Pseudo, Contenu, Troll_id}) -> + {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Troll_id, Id} + end, + record_info(fields, minichat), + minichat + ), + % met à jour les racines des messages + TODO ! -> mnesia:foldl(...) ok. % 2 -> 3 %patch(2) -> +% Reviens à une version précédente de la base de données +% (les données insérées durant les versions plus récentes sont perdues) +restore(N) -> + mnesia:restore(mnesia:system_info(directory) ++ "/backup" ++ integer_to_list(N)). + + % Ajoute un nouveau user et le renvoie nouveau_user(Pseudo, Cookie) -> F = fun() -> @@ -222,7 +261,7 @@ nouveau_user(Login, Password, Cookie) -> % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. -set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Page_principale, Conversations) -> +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Conversations) -> if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login -> resultat_transaction(mnesia:transaction( fun() -> @@ -243,7 +282,6 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times nick_format = Nick_format, view_times = View_times, view_tooltips = View_tooltips, - page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end, conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end }, mnesia:write(User_modifie), @@ -301,10 +339,23 @@ update_pseudo_user(UserId, Pseudo) -> % Affiche N user trié par leur date de dernière connexion. -% Attention : pas d'index sur ce champs (la date) -print_users(N) -> +% Opt est une liste d'option d'affichage : +% * ekmaster : n'affiche que les admins +print_users(N, Opt) -> + AfficheQueLesEkMaster = lists:any(fun(O) -> O =:= ekmaster end, Opt), resultat_transaction(mnesia:transaction(fun() -> - C = cursor(q([E || E <- qlc:keysort(9, mnesia:table(user), [{order, descending}])])), + C = cursor( + qlc:keysort( + #user.date_derniere_connexion, + if AfficheQueLesEkMaster -> + q([E || E <- mnesia:table(user), E#user.ek_master =:= true]); + true -> + q([E || E <- mnesia:table(user)]) + end, + [{order, descending}] + ), + [{tmpdir, ?KEY_SORT_TEMP_DIR}] + ), Users = qlc:next_answers(C, N), lists:foreach( fun(U) -> @@ -316,20 +367,25 @@ print_users(N) -> end)). +% Affiche tous les users. +print_users(Opt) -> + print_users(all_remaining, Opt). + % Affiche tous les users. print_users() -> - print_users(all_remaining). - + print_users(all_remaining, []). print_user(User) when is_record(User, user) -> - #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date} = User, + #user{id = Id, pseudo = Pseudo, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User, {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date), io:format( - "~4w : ~10.10..s~10.10..s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n", + % id pseudo (login) IP Jour Mois Année Heure Minute + "~4w : ~10.10..s(~10.10..s) ~s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n", [ Id, if Ek_master -> "*"; true -> "" end ++ Pseudo, - "(" ++ Login ++ ")", + Login, + euphorik_common:serialize_ip(IP), Jour, Mois, Annee, Heure, Min ] ); @@ -356,7 +412,7 @@ print_user(Id) when is_integer(Id) -> user_by_cookie(Cookie) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([E || E <- mnesia:table(user), E#user.cookie =:= Cookie])) of + case e(q([E || E <- mnesia:table(user), E#user.cookie =:= Cookie]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [User] -> {ok, User}; _ -> erreur end @@ -367,7 +423,7 @@ user_by_cookie(Cookie) -> user_by_id(ID) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([E || E <- mnesia:table(user), E#user.id =:= ID])) of + case e(q([E || E <- mnesia:table(user), E#user.id =:= ID]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [User] -> {ok, User}; _ -> erreur end @@ -378,7 +434,7 @@ user_by_id(ID) -> user_by_login(Login) -> resultat_transaction(mnesia:transaction( fun() -> - Users = e(q([E || E <- mnesia:table(user), E#user.login =:= Login])), + Users = e(q([E || E <- mnesia:table(user), E#user.login =:= Login]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]), case Users of [User] -> {ok, User}; _ -> erreur @@ -390,7 +446,7 @@ user_by_login(Login) -> toggle_ek_master(User_id) -> resultat_transaction(mnesia:transaction( fun() -> - Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id])), + Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]), case Users of [User] -> mnesia:write(User#user{ek_master = not User#user.ek_master}); @@ -410,12 +466,10 @@ css_from_user_cookie(Cookie) -> end. - - user_by_login_password(Login, Password) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([E || E <- mnesia:table(user), E#user.login =:= Login, E#user.password =:= Password])) of + case e(q([E || E <- mnesia:table(user), E#user.login =:= Login, E#user.password =:= Password]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [User | _] -> {ok, User}; _ -> erreur end @@ -427,7 +481,7 @@ user_by_login_password(Login, Password) -> user_by_mess(Id) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([U || U <- mnesia:table(user), M <- mnesia:table(minichat), M#minichat.id =:= Id, M#minichat.auteur_id =:= U#user.id])) of + case e(q([U || U <- mnesia:table(user), M <- mnesia:table(minichat), M#minichat.id =:= Id, M#minichat.auteur_id =:= U#user.id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [User | _] -> {ok, User}; _ -> erreur end @@ -440,35 +494,36 @@ user_by_mess(Id) -> nouveau_message(Mess, Auteur_id, Repond_A) -> % regarde si les id 'Repond_A' existent F = fun() -> - Nb_id_trouve = length(e(q([E#minichat.id || E <- mnesia:table(minichat), lists:member(E#minichat.id, Repond_A)]))), + Nb_id_trouve = length(e(q([E#minichat.id || E <- mnesia:table(minichat), lists:member(E#minichat.id, Repond_A)]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])), % est-ce que l'auteur existe ? - Auteur = case e(q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id])) of - [A] -> A; - _ -> {erreur, "L'auteur du message est introuvable"} - end, - if Nb_id_trouve =/= length(Repond_A) -> - {erreur, "Un ou plusieurs messages introuvable"}; - true -> - % comparaison entre la date du dernier poste et maintenant (gestion du flood) - Delta = delta_date_ms(Auteur#user.date_derniere_connexion, now()), - Nouvel_indice_flood = Auteur#user.indice_flood + if Delta =< ?DUREE_SPAM -> 2; true -> -1 end, - Auteur_maj = Auteur#user{ - indice_flood = if Nouvel_indice_flood > ?INDICE_SPAM_MAX -> ?INDICE_SPAM_MAX; Nouvel_indice_flood < 0 -> 0; true -> Nouvel_indice_flood end, - date_derniere_connexion = now() - }, - % est-ce que l'auteur à trop floodé ? - if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> - mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), - nouveau_message_sys("''" ++ Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ "'' est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood."); - Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> - {erreur, "Bloqué pour cause de flood"}; - true -> - mnesia:write(Auteur_maj), - Id = nouvel_id(minichat), - inserer_reponses(Id, Repond_A), - mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}), - Id - end + case e(q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of + [Auteur] -> + if Nb_id_trouve =/= length(Repond_A) -> + {erreur, "Un ou plusieurs messages introuvable"}; + true -> + % comparaison entre la date du dernier poste et maintenant (gestion du flood) + Delta = delta_date_ms(Auteur#user.date_derniere_connexion, now()), + Nouvel_indice_flood = Auteur#user.indice_flood + if Delta =< ?DUREE_SPAM -> 2; true -> -1 end, + Auteur_maj = Auteur#user{ + indice_flood = if Nouvel_indice_flood > ?INDICE_SPAM_MAX -> ?INDICE_SPAM_MAX; Nouvel_indice_flood < 0 -> 0; true -> Nouvel_indice_flood end, + date_derniere_connexion = now() + }, + % est-ce que l'auteur à trop floodé ? + if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> + mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), + nouveau_message_sys("''" ++ Auteur#user.pseudo ++ if Auteur#user.login =/= [] -> " (" ++ Auteur#user.login ++ ")"; true -> "" end ++ "'' est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood."); + Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> + {erreur, "Bloqué pour cause de flood"}; + true -> + mnesia:write(Auteur_maj), + Id = nouvel_id(minichat), + inserer_reponses(Id, Repond_A), + mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}), + Id + end + end; + _ -> + {erreur, "L'auteur du message est introuvable"} end end, resultat_transaction(mnesia:transaction(F)). @@ -505,20 +560,24 @@ messages(N) -> % Renvoie N messages se trouvant sur la page P -messages(N, P) -> +messages(N, P) -> F = fun() -> - C = cursor(q([ - E#minichat{contenu = contenu_message(E)} || - E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}]) - ])), + 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), - lists:reverse(R) + R end, - resultat_transaction(mnesia:transaction(F)). + lists:reverse(resultat_transaction(mnesia:transaction(F))). % Renvoie les messages manquants pour la page P en sachant qu'il y a N message @@ -529,29 +588,37 @@ messages(Id, N, P) -> % Renvoie {ok, #minichat} (voir #minichat de euphorik_bd.hrl) à partir de son id. message_by_id(Id) -> - case resultat_transaction(mnesia:transaction( + resultat_transaction(mnesia:transaction( fun() -> - e(q([E#minichat{contenu = contenu_message(E)} || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), Id =:= E#minichat.id])) + case mnesia:read({minichat, Id}) of + [] -> erreur; + [M] -> + {ok, M#minichat{contenu = contenu_message(M)}} + end end - )) of - [M] -> {ok, M}; - _ -> erreur - end. + )). % Renvoie le contenu d'un message donnée, à utiliser à l'intérieur d'une transaction. % TODO : Cette fonction pourrait être remplacé par un "outer-join", est-ce possible avec qlc ? contenu_message(E) -> - lists:flatten(E#minichat.contenu ++ e(q([T#troll.content || T <- mnesia:table(troll), T#troll.id =:= E#minichat.troll_id]))). + case mnesia:read({troll, E#minichat.troll_id}) of + [] -> E#minichat.contenu; + [T] -> E#minichat.contenu ++ T#troll.content + end. % Renvoie une liste de message (voir #minichat de euphorik_bd.hrl) à partir d'une liste d'id (Ids). +% TODO : optimisations ? serait-ce du O(n) ? +% Bon de toutes façons on s'en fout c'est pas utilisé :) messages_by_ids(Ids) -> resultat_transaction(mnesia:transaction( fun() -> - % TODO : optimisations ? serait-ce du O(n) ? - Query = q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, ascending}]), lists:any(fun(Id) -> Id =:= E#minichat.id end, Ids)]), - e(Query) + e(qlc:keysort( + #minichat.id, + q([E || E <- mnesia:table(minichat), lists:any(fun(Id) -> Id =:= E#minichat.id end, Ids)]), + [{order, ascending}] + ),[{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -560,14 +627,14 @@ messages_by_ids(Ids) -> % TODO : ya pas plus simple ? message_existe(Id) -> resultat_transaction(mnesia:transaction(fun() -> - length(e(q([E#minichat.id || E <- mnesia:table(minichat), E#minichat.id =:= Id]))) =:= 1 + length(e(q([E#minichat.id || E <- mnesia:table(minichat), E#minichat.id =:= Id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}])) =:= 1 end)). % Renvoie les reponses (utilisé normalement uniquement pendant le debug). reponses() -> F = fun() -> - e(q([E || E <- mnesia:table(reponse_minichat)])) + e(q([E || E <- mnesia:table(reponse_minichat)]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end, resultat_transaction(mnesia:transaction(F)). @@ -580,7 +647,20 @@ repond_a(M_id) -> [M || E <- mnesia:table(reponse_minichat), M <- mnesia:table(minichat), E#reponse_minichat.repondant =:= M_id, - M#minichat.id =:= E#reponse_minichat.cible])) + M#minichat.id =:= E#reponse_minichat.cible]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) + end + )). + + +% Renvoie les message qui repondent à M_id +reponses(M_id) -> + resultat_transaction(mnesia:transaction( + fun() -> + e(q( + [M || E <- mnesia:table(reponse_minichat), + M <- mnesia:table(minichat), + E#reponse_minichat.cible =:= M_id, + M#minichat.id =:= E#reponse_minichat.repondant]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -592,7 +672,7 @@ est_une_reponse_a_user(Id_user, Id_mess) -> e(q([ M#minichat.auteur_id || M <- mnesia:table(minichat), R <- mnesia:table(reponse_minichat), M#minichat.auteur_id =:= Id_user, M#minichat.id =:= R#reponse_minichat.cible, R#reponse_minichat.repondant =:= Id_mess - ]), [{unique_all, true}]) + ]), [{unique_all, true}, {tmpdir, ?KEY_SORT_TEMP_DIR}]) end ) of {atomic, [_]} -> true; @@ -607,7 +687,7 @@ a_repondu_a_message(Id_user, Id_mess) -> e(q([ M#minichat.auteur_id || M <- mnesia:table(minichat), R <- mnesia:table(reponse_minichat), R#reponse_minichat.cible =:= Id_mess, R#reponse_minichat.repondant =:= M#minichat.id, M#minichat.auteur_id =:= Id_user - ]), [{unique_all, true}]) + ]), [{unique_all, true}, {tmpdir, ?KEY_SORT_TEMP_DIR}]) end ) of {atomic, [_]} -> true; @@ -619,7 +699,7 @@ a_repondu_a_message(Id_user, Id_mess) -> possede_message(Id_user, Id_mess) -> case mnesia:transaction( fun() -> - e(q([E#minichat.auteur_id || E <- mnesia:table(minichat), E#minichat.id =:= Id_mess])) + e(q([E#minichat.auteur_id || E <- mnesia:table(minichat), E#minichat.id =:= Id_mess]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end ) of {atomic, [Id_user | []]} -> true; @@ -634,15 +714,15 @@ list_ban() -> resultat_transaction(mnesia:transaction( fun() -> Now = now(), - e(q([ + e(qlc:keysort(1, q([ { IP#ip_table.ip, delta_date_minute(date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration), Now), - e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip])) + e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) } || - IP <- qlc:keysort(2, mnesia:table(ip_table)), + IP <- mnesia:table(ip_table), if IP#ip_table.ban =:= undefined -> false; true -> date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration) > Now end - ])) + ])), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -677,7 +757,7 @@ est_banni(User_id) -> U#user.id =:= User_id, IP <- mnesia:table(ip_table), IP#ip_table.ip =:= U#user.last_ip - ])) of + ]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [{Ban, Ban_duration}] -> Echeance = date_plus_minutes(Ban, Ban_duration), Now = now(), @@ -708,7 +788,7 @@ date_plus_minutes(Ban, Ban_duration) -> can_register(IP) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([I || I <- mnesia:table(ip_table), I#ip_table.ip =:= IP])) of + case e(q([I || I <- mnesia:table(ip_table), I#ip_table.ip =:= IP]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [] -> mnesia:write(#ip_table{ip = IP, date_last_try_register = now()}), true; @@ -733,7 +813,7 @@ can_register(IP) -> trolls() -> resultat_transaction(mnesia:transaction( fun() -> - e(q([T || T <- qlc:keysort(2, mnesia:table(troll))])) + e(qlc:keysort(#troll.id, q([T || T <- mnesia:table(troll)])), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -742,7 +822,7 @@ trolls() -> trolls(Last_id) -> resultat_transaction(mnesia:transaction( fun() -> - e(q([T || T <- qlc:keysort(2, mnesia:table(troll)), T#troll.id > Last_id, T#troll.date_post =:= undefined])) + e(qlc:keysort(#troll.id, q([T || T <- mnesia:table(troll), T#troll.id > Last_id, T#troll.date_post =:= undefined])), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -762,13 +842,13 @@ put_troll(User_id, Content) -> E#troll.id_user =:= User_id, E#troll.date_post =:= undefined ] - ))), + ), [{tmpdir, ?KEY_SORT_TEMP_DIR}])), Nb_troll_poste_total = length(e(q( [ E#troll.id || E <- mnesia:table(troll), E#troll.date_post =:= undefined ] - ))), + ), [{tmpdir, ?KEY_SORT_TEMP_DIR}])), User = user_by_id(User_id), case User of {ok, _} -> @@ -818,7 +898,7 @@ del_troll(Troll_id) -> troll_by_id(Troll_id) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([T || T <- mnesia:table(troll), T#troll.id =:= Troll_id])) of + case e(q([T || T <- mnesia:table(troll), T#troll.id =:= Troll_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [T] -> {ok, T}; _ -> erreur @@ -832,8 +912,7 @@ troll_by_id(Troll_id) -> current_troll() -> resultat_transaction(mnesia:transaction( fun() -> - % TODO : ya pas moyen de désigner le champs plutot qu'avec un nombre pour le tri ? - C = cursor(q([T || T <- qlc:keysort(5, mnesia:table(troll), [{order, descending}]), T#troll.date_post =/= undefined])), + C = cursor(qlc:keysort(#troll.date_post, q([T || T <- mnesia:table(troll), T#troll.date_post =/= undefined]), [{order, descending}]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]), R = case qlc:next_answers(C, 1) of [T] -> T; _ -> aucun @@ -853,7 +932,7 @@ elire_troll() -> random:seed(A1, A2, A3), mnesia:transaction( fun() -> - case e(q([T || T <- mnesia:table(troll), T#troll.date_post =:= undefined])) of + case e(q([T || T <- mnesia:table(troll), T#troll.date_post =:= undefined]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [] -> plus_de_trolls; Trolls -> @@ -871,7 +950,7 @@ elire_troll() -> message_id_associe(Troll_id) -> resultat_transaction(mnesia:transaction( fun() -> - case e(q([M#minichat.id || M <- mnesia:table(minichat), M#minichat.troll_id =:= Troll_id])) of + case e(q([M#minichat.id || M <- mnesia:table(minichat), M#minichat.troll_id =:= Troll_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of [Id] -> Id; _ -> undefined end