MOD Avancement sur la mise à jour de la BD pour la 1.1 et le système de mise à jour
authorGreg Burri <greg.burri@gmail.com>
Fri, 13 Jun 2008 23:54:53 +0000 (23:54 +0000)
committerGreg Burri <greg.burri@gmail.com>
Fri, 13 Jun 2008 23:54:53 +0000 (23:54 +0000)
doc/TODO.txt
modules/Makefile
modules/erl/euphorik_bd.erl
modules/erl/euphorik_bd_update.erl [new file with mode: 0644]
modules/erl/euphorik_daemon.erl
modules/include/euphorik_bd.hrl
tools/mise_en_prod.erl

index 06646d6..0864852 100755 (executable)
@@ -1,4 +1,4 @@
-== TODO ==\r
+== TODO ==
 \r
 === v1.1 ===
 * Faire l'update vers la version 2 pour les changements de la BD :
index 731cd71..ebeff42 100755 (executable)
@@ -16,11 +16,17 @@ $(rep_ebin)/euphorik_minichat_conversation.beam \
 $(rep_ebin)/euphorik_requests.beam \\r
 $(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
 \r
 # Module pour la gestion des données persistante la BD\r
 $(rep_ebin)/euphorik_bd.beam: $(rep_erl)/euphorik_bd.erl $(rep_include)/euphorik_bd.hrl $(rep_include)/euphorik_defines.hrl\r
+       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)\r
 
 # Module permettant l'extraction des conversations du minichat
index 4e47099..b11b4e6 100755 (executable)
@@ -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\r
 ]).
@@ -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<num>" où <num> 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 (file)
index 0000000..a0456bc
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+% 
+% 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<num>" où <num> 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)).
+
index 00825a0..0970ef6 100755 (executable)
@@ -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
index 0d263c9..2eaf9e6 100755 (executable)
@@ -19,7 +19,7 @@
 
 
 % Version de la BD
--define(VERSION_BD, 1).
+-define(VERSION_BD, 2).
 
 
 % Pour générer des id\r
index 4b0c685..680384a 100755 (executable)
@@ -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.