From fe508652111984ab4f2707a36d5ced39aaaf5cac Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Fri, 13 Jun 2008 23:54:53 +0000 Subject: [PATCH] =?utf8?q?MOD=20Avancement=20sur=20la=20mise=20=C3=A0=20jo?= =?utf8?q?ur=20de=20la=20BD=20pour=20la=201.1=20et=20le=20syst=C3=A8me=20d?= =?utf8?q?e=20mise=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- doc/TODO.txt | 2 +- modules/Makefile | 6 ++ modules/erl/euphorik_bd.erl | 104 +++--------------------- modules/erl/euphorik_bd_update.erl | 124 +++++++++++++++++++++++++++++ modules/erl/euphorik_daemon.erl | 10 ++- modules/include/euphorik_bd.hrl | 2 +- tools/mise_en_prod.erl | 2 +- 7 files changed, 154 insertions(+), 96 deletions(-) create mode 100644 modules/erl/euphorik_bd_update.erl diff --git a/doc/TODO.txt b/doc/TODO.txt index 06646d6..0864852 100755 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -1,4 +1,4 @@ -== TODO == +== TODO == === v1.1 === * Faire l'update vers la version 2 pour les changements de la BD : diff --git a/modules/Makefile b/modules/Makefile index 731cd71..ebeff42 100755 --- a/modules/Makefile +++ b/modules/Makefile @@ -16,11 +16,17 @@ $(rep_ebin)/euphorik_minichat_conversation.beam \ $(rep_ebin)/euphorik_requests.beam \ $(rep_ebin)/euphorik_protocole.beam \ $(rep_ebin)/euphorik_daemon.beam \ +$(rep_ebin)/euphorik_bd.beam \ +$(rep_ebin)/euphorik_bd_update.beam \ $(rep_ebin)/euphorik_common.beam \ $(rep_ebin)/euphorik_test.beam # Module pour la gestion des données persistante la BD $(rep_ebin)/euphorik_bd.beam: $(rep_erl)/euphorik_bd.erl $(rep_include)/euphorik_bd.hrl $(rep_include)/euphorik_defines.hrl + erlc $(erlc_params) + +# Module pour la mise à jour de la BD +$(rep_ebin)/euphorik_bd_update.beam: $(rep_erl)/euphorik_bd_update.erl $(rep_erl)/euphorik_bd.erl $(rep_include)/euphorik_bd.hrl $(rep_include)/euphorik_defines.hrl erlc $(erlc_params) # Module permettant l'extraction des conversations du minichat diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 4e47099..b11b4e6 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -29,8 +29,6 @@ connect/0, connect/1, reset/0, - update/0, - restore/1, % users : nouveau_user/2, @@ -50,7 +48,7 @@ toggle_ek_master/1, css_from_user_cookie/1, - % messages : + % messages :e nouveau_message/3, nouveau_message_sys/1, nouveau_message_sys/2, @@ -61,7 +59,8 @@ messages_by_ids/1, message_existe/1, reponses/0, - repond_a/1, + parents/1, + enfants/1, est_une_reponse_a_user/2, a_repondu_a_message/2, possede_message/2, @@ -84,9 +83,6 @@ elire_troll/0, message_id_associe/1, - % versions : - update_version/1, - % utiles : resultat_transaction/1 ]). @@ -171,73 +167,6 @@ reset() -> end). -% Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes' -% et exécute les patchs nécessaires. -update() -> - mnesia:transaction( - fun() -> - case mnesia:read({proprietes, version}) of - [#proprietes{nom = Version}] -> - update(Version); - _ -> - erreur - end - end - ). - - -% Mise à jour de la BD. -% attention : il est nécessaire de se trouver dans une transaction. -update(?VERSION_BD) -> fini; -update(Version) -> - 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() -> @@ -640,27 +569,27 @@ reponses() -> % Renvoie les messages auquel M_id répond. -repond_a(M_id) -> +parents(M_id) -> resultat_transaction(mnesia:transaction( fun() -> e(q( - [M || E <- mnesia:table(reponse_minichat), + [M || R <- mnesia:table(reponse_minichat), M <- mnesia:table(minichat), - E#reponse_minichat.repondant =:= M_id, - M#minichat.id =:= E#reponse_minichat.cible]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) + R#reponse_minichat.repondant =:= M_id, + M#minichat.id =:= R#reponse_minichat.cible]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). % Renvoie les message qui repondent à M_id -reponses(M_id) -> +enfants(M_id) -> resultat_transaction(mnesia:transaction( fun() -> e(q( - [M || E <- mnesia:table(reponse_minichat), + [M || R <- 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}]) + R#reponse_minichat.cible =:= M_id, + M#minichat.id =:= R#reponse_minichat.repondant]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) end )). @@ -956,16 +885,7 @@ message_id_associe(Troll_id) -> end end )). - - -update_version(1) -> - mnesia:transform_table( - ip_table, - fun() -> null end, - record_info(fields, ip_table), - ip_table - ). - + % Renvoie le résultat d'une transaction (en décomposant le tuple fournit) resultat_transaction({_, T}) -> diff --git a/modules/erl/euphorik_bd_update.erl b/modules/erl/euphorik_bd_update.erl new file mode 100644 index 0000000..a0456bc --- /dev/null +++ b/modules/erl/euphorik_bd_update.erl @@ -0,0 +1,124 @@ +% coding: utf-8 +% Copyright 2008 Grégory Burri +% +% This file is part of Euphorik. +% +% Euphorik is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Euphorik is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Euphorik. If not, see . +% +% Module permettant la mise à jour de la base de données. +% Offre aussi des possibilités de backup et de reprise. +% @author G.Burri + +-module(euphorik_bd_update). +-export([ + version_bd/0, + update/0, + restore/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"). + + +% Renvoie la version courante de la BD. +version_bd() -> + euphorik_bd:resultat_transaction(mnesia:transaction( + fun() -> + mnesia:read({proprietes, version}) + end + )). + + +% Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes' +% et exécute les patchs nécessaires. +update() -> + case mnesia:dirty_read({proprietes, version}) of + [#proprietes{valeur = Version}] -> + update(Version); + _ -> + erreur + end. + + +% Mise à jour de la BD. +% attention : il est nécessaire de se trouver dans une transaction. +update(?VERSION_BD) -> fini; +update(Version) -> + case mnesia:backup(mnesia:system_info(directory) ++ "/backup" ++ integer_to_list(Version)) of + ok -> + case patch(Version) of + ok -> + mnesia:dirty_write(#proprietes{nom = version, valeur = Version + 1}), + update(Version + 1); + Erreur -> + 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 + ), + case mnesia:transaction( + fun() -> + % met à jour les enfants des racines + % idéalement : utiliser un cursor mais je crois qu'il n'est pas possible de faire des modifs en itérant en même temps avec un cursor, a voir.. + Messages = e(q([M || M <- mnesia:table(minichat), euphorik_bd:parents(M#minichat.id) =:= []]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]), + lists:foreach(fun(M) -> patch_1_traiter_message(M, M#minichat.id) end, Messages) + end + ) of + {aborted, Raison} -> {erreur, Raison}; + {atomic, _} -> ok + end. +% 2 -> 3 +%patch(2) -> + + +patch_1_traiter_message(M, Racine) -> + % met à jour la racine de chaque message qui répond à M + lists:foreach( + fun(M2) -> + mnesia:write(M2#minichat{racine_id = Racine}), + patch_1_traiter_message(M2, Racine) + end, + euphorik_bd:enfants(M#minichat.id) + ). + + +% 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)). + diff --git a/modules/erl/euphorik_daemon.erl b/modules/erl/euphorik_daemon.erl index 00825a0..0970ef6 100755 --- a/modules/erl/euphorik_daemon.erl +++ b/modules/erl/euphorik_daemon.erl @@ -58,6 +58,14 @@ reload_euphorik() -> code:purge(M), code:load_file(M) end, - [euphorik_common, euphorik_minichat_conversation, euphorik_protocole, euphorik_requests, euphorik_bd, euphorik_daemon] + [ + euphorik_common, + euphorik_minichat_conversation, + euphorik_protocole, + euphorik_requests, + euphorik_bd, + euphorik_bd_update, + euphorik_daemon + ] ). \ No newline at end of file diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index 0d263c9..2eaf9e6 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -19,7 +19,7 @@ % Version de la BD --define(VERSION_BD, 1). +-define(VERSION_BD, 2). % Pour générer des id diff --git a/tools/mise_en_prod.erl b/tools/mise_en_prod.erl index 4b0c685..680384a 100755 --- a/tools/mise_en_prod.erl +++ b/tools/mise_en_prod.erl @@ -12,6 +12,6 @@ main(_) -> receive {'EXIT', _, _} -> io:format("mise à jour de la BD..~n"), - spawn(yaws@overnux, euphorik_bd, update, []) + spawn(yaws@overnux, euphorik_bd_update, update, []) end. -- 2.45.2