2 % Copyright 2008 Grégory Burri
4 % This file is part of Euphorik.
6 % Euphorik is free software: you can redistribute it and/or modify
7 % it under the terms of the GNU General Public License as published by
8 % the Free Software Foundation, either version 3 of the License, or
9 % (at your option) any later version.
11 % Euphorik is distributed in the hope that it will be useful,
12 % but WITHOUT ANY WARRANTY; without even the implied warranty of
13 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 % GNU General Public License for more details.
16 % You should have received a copy of the GNU General Public License
17 % along with Euphorik. If not, see <http://www.gnu.org/licenses/>.
19 % Module permettant la mise à jour de la base de données.
20 % Offre aussi des possibilités de backup et de reprise.
23 -module(euphorik_bd_update
).
30 -import(qlc
, [e
/2, q
/1, cursor
/2]).
31 -include("../include/euphorik_bd.hrl").
32 -include("../include/euphorik_defines.hrl").
33 -include_lib("stdlib/include/qlc.hrl").
36 % Renvoie la version courante de la BD.
38 euphorik_bd:resultat_transaction(mnesia:transaction(
40 mnesia:read({proprietes
, version
})
45 % Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes'
46 % et exécute les patchs nécessaires.
48 case mnesia:dirty_read({proprietes
, version
}) of
49 [#proprietes
{valeur
= Version
}] ->
56 % Mise à jour de la BD.
57 % attention : il est nécessaire de se trouver dans une transaction.
58 update(?VERSION_BD
) -> fini
;
60 case mnesia:backup(fichier_backup(Version
)) of
62 case patch(Version
) of
64 mnesia:dirty_write(#proprietes
{nom
= version
, valeur
= Version
+ 1}),
69 {error
, Raison
} -> {error
, lists:flatten(io_lib:format("Erreur de création du backup de la version ~w : ~w", [Version
, Raison
]))}
73 % Applique une modification de la BD pour passer d'une version à la suivante.
74 % crée un backup avant l'application du patch
75 % dans BD/backups nommé "backup<num>" où <num> et le numéro de la version.
78 % traitement des users
79 mnesia:transform_table(
81 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
}) ->
82 {user
, Id
, Cookie
, Pseudo
, Login
, Password
, Email
, Date_creation
, Date_derniere_connexion
, patch1_transforme_css(Css
), Nick_format
, View_times
, View_tooltips
, light
, reverse
, Indice_flood
, lists:map(fun({R
, _
}) -> {R
, false
} end, Conversations
), Ek_master
, Last_ip
}
84 record_info(fields
, user
),
87 mnesia:transform_table(
89 fun({minichat
, Id
, Auteur_id
, Date
, Pseudo
, Contenu
, Troll_id
}) ->
90 {minichat
, Id
, Auteur_id
, Date
, Pseudo
, Contenu
, Troll_id
, Id
}
92 record_info(fields
, minichat
),
95 case mnesia:transaction(
97 % met à jour les enfants des racines
98 % 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..
99 Messages
= e(q([M
|| M
<- mnesia:table(minichat
), euphorik_bd:parents(M#minichat
.id
) =:= []]), [{tmpdir
, ?KEY_SORT_TEMP_DIR
}]),
100 lists:foreach(fun(M
) -> patch_1_traiter_message(M
, M#minichat
.id
) end, Messages
)
103 {aborted
, Raison
} -> {erreur
, Raison
};
110 % Prend un chemin vers la feuille de style de type "css/1/euphorik.css"
111 % et renvoie "styles/1/euphorik.css"
112 patch1_transforme_css(["css" | Reste
]) ->
114 patch1_transforme_css(F
) ->
118 patch_1_traiter_message(M
, Racine
) ->
119 % met à jour la racine de chaque message qui répond à M
122 mnesia:write(M2#minichat
{racine_id
= Racine
}),
123 patch_1_traiter_message(M2
, Racine
)
125 euphorik_bd:enfants(M#minichat
.id
)
128 % crée un backup dont le nom est fournit dans le repertoire backups qui se trouve dans le repertoire de la BD.
130 mnesia:backup(mnesia:system_info(directory
) ++ "/backups/" ++ Nom
).
133 % Reviens à une version précédente de la base de données
134 % (les données insérées durant les versions plus récentes sont perdues)
135 restore(N
) when is_integer(N
) ->
136 mnesia:restore(fichier_backup(N
), [{default_op
, recreate_tables
}]);
137 restore(Nom
) when is_string(Nom
) ->
140 % Renvoie le fichier (avec le chemin) correspondant à la version Version, par exemple : "/var/euphorik/BD/backups/backup1"
141 fichier_backup(Version
) ->
142 mnesia:system_info(directory
) ++ "/backups/backup" ++ integer_to_list(Version
).