X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_bd_admin.erl;h=dca6c2d22c27746cca28837dc1e79d53502a2f86;hp=d9e9cc77ac2a7e4dd6448dbbb0294f91044804d5;hb=3c3e08ee08628398811d850f23d8494340ae8b2c;hpb=e1bca2f5335f66a1a869bbc57e3346514e628558 diff --git a/modules/erl/euphorik_bd_admin.erl b/modules/erl/euphorik_bd_admin.erl index d9e9cc7..dca6c2d 100644 --- a/modules/erl/euphorik_bd_admin.erl +++ b/modules/erl/euphorik_bd_admin.erl @@ -34,8 +34,9 @@ reset/0, update/0, - backup_text/1, - restore_text/1, + backup/1, + restore/1, + change_node_name/4, toggle_ek_master/1, print_users/0, @@ -109,12 +110,22 @@ create_tables() -> % mis à part car lors de la reprise de données avec load_textfile les indexes ne sont pas recréés creer_indexes() -> + % commence par supprimer les anciens indexes + lists:foreach(fun(T) -> + lists:foreach(fun(P) -> + mnesia:del_table_index(T, P) + end, + mnesia:table_info(T, index) + ) + end, + ?TABLES + ), mnesia:add_table_index(minichat, auteur_id), - mnesia:add_table_index(minichat, troll_id), mnesia:add_table_index(reponse_minichat, cible), mnesia:add_table_index(user, cookie), mnesia:add_table_index(user, login), - mnesia:add_table_index(troll, date_post). + mnesia:add_table_index(troll, date_post), + mnesia:add_table_index(troll, id_minichat). % Connexion à la base de données de yaws sur overnux @@ -208,11 +219,9 @@ update(Version) -> patch(1) -> % Prend un chemin vers la feuille de style de type "css/1/euphorik.css" % et renvoie "styles/1/euphorik.css" - Transforme_css = fun(F) -> - case F of - "css" ++ Reste -> "styles" ++ Reste; - _ -> F - end + Transforme_css = fun("css" ++ Reste) -> + "styles" ++ Reste; + (F) -> F end, Traiter_message = fun(M, Racine) -> F = fun(F, M2) -> % seul moyen à ma connaissance pour faire de la récursion dans une lambda fonction, voir : http://www.nabble.com/Auto-generated-functions-td15279499.html @@ -238,16 +247,14 @@ patch(1) -> 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, Login, Password, {profile, Pseudo, Email, Transforme_css(Css), Nick_format, View_times, View_tooltips, light, reverse, lists:map(fun({R, _}) -> {R, false} end, Conversations)}, Date_creation, Date_derniere_connexion, Indice_flood, Ek_master, Last_ip} end, - record_info(fields, user), - user + record_info(fields, 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 + record_info(fields, minichat) ), case mnesia:transaction( fun() -> @@ -262,51 +269,118 @@ patch(1) -> end; % 2 -> 3 patch(2) -> - % traitement de la table troll mnesia:transform_table( troll, fun({troll, Id_troll, Id_user, Date_create, Date_post, Content}) -> % recherche le message associé s'il existe - Id_minichat = case mnesia:index_read(minichat, Id_troll, 7) of - [#minichat{id = Id}] -> Id; + Id_minichat = case e(q([M || M <- mnesia:table(minichat), element(7, M) =:= Id_troll]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]) of + [M] -> element(2, M); _ -> undefined end, {troll, Id_troll, Id_user, Id_minichat, Date_create, Date_post, Content} end, - record_info(fields, troll), - user - ) - TODO... - + record_info(fields, troll) + ), + %mnesia:del_table_index(minichat, troll_id), + mnesia:transform_table( + minichat, + fun({minichat, Id, Auteur_id, Date, Pseudo, Contenu, _Troll_id, Racine_id}) -> + {minichat, Id, Auteur_id, Date, Pseudo, Contenu, Racine_id, normal} + end, + record_info(fields, minichat) + ), + mnesia:transaction(fun() -> + % comble les trous entre les id non-contigues + lists:foreach(fun(Id) -> + case mnesia:read({minichat, Id}) of + [] -> + {ok, #user{profile = Profile}} = euphorik_bd:user_by_id(0), + mnesia:write(#minichat{id = Id, auteur_id = 0, date = undefined, pseudo = Profile#profile.pseudo, contenu = "Comblement...", racine_id = Id, status = deleted}); + _ -> rien + end + end, + lists:seq(1, mnesia:table_info(minichat, size)) + ), + % la table troll utilise maintenant son index et pas celui de la table minichat (correction d'un vieux bug) + mnesia:write(#counter{key = troll, value = mnesia:table_info(minichat, size)}) + end), + creer_indexes(). % uniquement pour l'indice sur id_minichat de la table troll -% crée un backup dont le nom est fournit dans le repertoire backups qui se trouve dans le repertoire de la BD. -%backup(Nom) -> -% mnesia:backup(mnesia:system_info(directory) ++ "/backups/" ++ Nom). - -% 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(fichier_backup(N), [{default_op, recreate_tables}]). +% Renvoie le dossier dans lequel les backups sont effectué, ce dossier doit être en écriture. +dossier_backups() -> + mnesia:system_info(directory) ++ "/backups/". % Renvoie le fichier (avec le chemin) correspondant à la version Version, par exemple : "/var/euphorik/BD/backups/backup1" -fichier_backup(Version) -> - mnesia:system_info(directory) ++ "/backups/" ++ if is_integer(Version) -> "backup" ++ integer_to_list(Version); true -> Version end. +fichier_backup(Version) when is_integer(Version) -> + dossier_backups() ++ "backup" ++ integer_to_list(Version). + +% crée un backup dont le nom est fournit dans le repertoire backups qui se trouve dans le repertoire de la BD. +backup(Fichier) -> + mnesia:backup(dossier_backups() ++ Fichier). + + +% Restaure un backup de la BD. +restore(Fichier) when is_list(Fichier) -> + mnesia:restore(dossier_backups() ++ Fichier, []); +% 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(Version) when is_integer(Version) -> + mnesia:restore(fichier_backup(Version), []). % [{default_op, recreate_tables}]). + -backup_text(_) -> todo. -restore_text(File) -> - mnesia:stop(), - mnesia:delete_schema([node()]), - mnesia:start(), - case mnesia:load_textfile(File) of - {atomic, ok} -> - update(), - creer_indexes(); - Erreur -> - Erreur - end. +% Change le nom du noeud d'un backup. +% provient d'ici : http://www.erlang.org/doc/apps/mnesia/Mnesia_chap7.html#6.9 +% From : l'ancien nom +% To : le nouveau nom +% Source : le nom du fichier de backup +% Target : le nom du fichier du nouveau backup +change_node_name(From, To, Source, Target) -> + Switch = + fun(Node) when Node == From -> To; + (Node) when Node == To -> throw({error, already_exists}); + (Node) -> Node + end, + Convert = + fun({schema, db_nodes, Nodes}, Acc) -> + {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc}; + ({schema, version, Version}, Acc) -> + {[{schema, version, Version}], Acc}; + ({schema, cookie, Cookie}, Acc) -> + {[{schema, cookie, Cookie}], Acc}; + ({schema, Tab, CreateList}, Acc) -> + Keys = [ram_copies, disc_copies, disc_only_copies], + OptSwitch = + fun({Key, Val}) -> + case lists:member(Key, Keys) of + true -> {Key, lists:map(Switch, Val)}; + false-> {Key, Val} + end + end, + {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc}; + (Other, Acc) -> + {[Other], Acc} + end, + mnesia:traverse_backup(Source, Target, Convert, switched). + + +% Obsolète +%~ backup_text(File) -> + %~ mnesia:dump_to_textfile(File). +%~ restore_text(File) -> + %~ mnesia:stop(), + %~ mnesia:delete_schema([node()]), + %~ mnesia:start(), + %~ create_tables(), + %~ case mnesia:load_textfile(File) of + %~ {atomic, ok} -> + %~ update(), + %~ creer_indexes(); + %~ Erreur -> + %~ Erreur + %~ end. toggle_ek_master(User_id) ->