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
).
29 -import(qlc
, [e
/2, q
/1, cursor
/2]).
30 -include("../include/euphorik_bd.hrl").
31 -include("../include/euphorik_defines.hrl").
32 -include_lib("stdlib/include/qlc.hrl").
35 % Renvoie la version courante de la BD.
37 euphorik_bd:resultat_transaction(mnesia:transaction(
39 mnesia:read({proprietes
, version
})
44 % Met à jour la bd, compare ?VERSION_BD avec la version dans la table 'proprietes'
45 % et exécute les patchs nécessaires.
47 case mnesia:dirty_read({proprietes
, version
}) of
48 [#proprietes
{valeur
= Version
}] ->
55 % Mise à jour de la BD.
56 % attention : il est nécessaire de se trouver dans une transaction.
57 update(?VERSION_BD
) -> fini
;
59 case mnesia:backup(fichier_backup(Version
)) of
61 case patch(Version
) of
63 mnesia:dirty_write(#proprietes
{nom
= version
, valeur
= Version
+ 1}),
68 {error
, Raison
} -> {error
, lists:flatten(io_lib:format("Erreur de création du backup de la version ~w : ~w", [Version
, Raison
]))}
72 % Applique une modification de la BD pour passer d'une version à la suivante.
73 % crée un backup avant l'application du patch
74 % dans BD/backups nommé "backup<num>" où <num> et le numéro de la version.
77 % traitement des users
78 mnesia:transform_table(
80 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
}) ->
81 {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
}
83 record_info(fields
, user
),
86 mnesia:transform_table(
88 fun({minichat
, Id
, Auteur_id
, Date
, Pseudo
, Contenu
, Troll_id
}) ->
89 {minichat
, Id
, Auteur_id
, Date
, Pseudo
, Contenu
, Troll_id
, Id
}
91 record_info(fields
, minichat
),
94 case mnesia:transaction(
96 % met à jour les enfants des racines
97 % 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..
98 Messages
= e(q([M
|| M
<- mnesia:table(minichat
), euphorik_bd:parents(M#minichat
.id
) =:= []]), [{tmpdir
, ?KEY_SORT_TEMP_DIR
}]),
99 lists:foreach(fun(M
) -> patch_1_traiter_message(M
, M#minichat
.id
) end, Messages
)
102 {aborted
, Raison
} -> {erreur
, Raison
};
109 patch_1_traiter_message(M
, Racine
) ->
110 % met à jour la racine de chaque message qui répond à M
113 mnesia:write(M2#minichat
{racine_id
= Racine
}),
114 patch_1_traiter_message(M2
, Racine
)
116 euphorik_bd:enfants(M#minichat
.id
)
120 % Reviens à une version précédente de la base de données
121 % (les données insérées durant les versions plus récentes sont perdues)
123 mnesia:restore(fichier_backup(N
), []).
126 % Renvoie le fichier (avec le chemin) correspondant à la version Version.
127 fichier_backup(Version
) ->
128 mnesia:system_info(directory
) ++ "/backups/backup" ++ integer_to_list(Version
).