-
-
-% 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) when is_integer(Version) ->
- dossier_backups() ++ "backup" ++ integer_to_list(Version).
-\r
-
-% 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}]).
-
-
-% 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) ->
- euphorik_bd:resultat_transaction(mnesia:transaction(
- fun() ->
- Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),
- case Users of
- [User] ->
- mnesia:write(User#user{ek_master = not User#user.ek_master});
- _ -> erreur
- end
- end
- )).
-
-
-% Affiche N user trié par leur date de dernière connexion.
-% Opt est une liste d'option d'affichage :
-% * ekmaster : n'affiche que les admins
-print_users(N, Opt) ->
- AfficheQueLesEkMaster = lists:any(fun(O) -> O =:= ekmaster end, Opt),
- euphorik_bd:resultat_transaction(mnesia:transaction(fun() ->
- C = cursor(
- qlc:keysort(
- #user.date_derniere_connexion,
- if AfficheQueLesEkMaster ->
- q([E || E <- mnesia:table(user), E#user.ek_master =:= true]);
- true ->
- q([E || E <- mnesia:table(user)])
- end,
- [{order, descending}]
- ),
- [{tmpdir, ?KEY_SORT_TEMP_DIR}]
- ),
- Users = qlc:next_answers(C, N),
- lists:foreach(
- fun(U) ->
- print_user(U)
- end,
- Users
- ),
- qlc:delete_cursor(C)
- end)).
-
-
-% Affiche tous les users.
-print_users(Opt) ->
- print_users(all_remaining, Opt).
-
-% Affiche tous les users.
-print_users() ->
- print_users(all_remaining, []).
-
-print_user(User) when is_record(User, user) ->
- #user{id = Id, profile = #profile{pseudo = Pseudo}, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,
- {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),
- io:format(
- % id pseudo (login) IP Jour Mois Année Heure Minute
- "~4w : ~10.10..s(~10.10..s) ~s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",
- [
- Id,
- if Ek_master -> "*"; true -> "" end ++ Pseudo,
- Login,
- euphorik_common:serialize_ip(IP),
- Jour, Mois, Annee, Heure, Min
- ]
- );
-% Affichage d'un user en fonction de son login
-print_user(Login) when is_list(Login) ->
- case euphorik_bd:user_by_login(Login) of
- {ok, User} ->
- print_user(User);
- _ ->
- {erreur, "Login pas trouvé : " ++ Login}
- end;
-% Affichage d'un user en fonction de son id
-print_user(Id) when is_integer(Id) ->
- case euphorik_bd:user_by_id(Id) of
- {ok, User} ->
- print_user(User);
- _ ->
- {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}
- end.
-
+\r
+\r
+% Renvoie le dossier dans lequel les backups sont effectué, ce dossier doit être en écriture.\r
+dossier_backups() ->\r
+ mnesia:system_info(directory) ++ "/backups/".\r
+\r
+\r
+% Renvoie le fichier (avec le chemin) correspondant à la version Version, par exemple : "/var/euphorik/BD/backups/backup1"\r
+fichier_backup(Version) when is_integer(Version) ->\r
+ dossier_backups() ++ "backup" ++ integer_to_list(Version).\r
+\r
+\r
+% crée un backup dont le nom est fournit dans le repertoire backups qui se trouve dans le repertoire de la BD.\r
+backup(Fichier) ->\r
+ mnesia:backup(dossier_backups() ++ Fichier).\r
+\r
+\r
+% Restaure un backup de la BD.\r
+restore(Fichier) when is_list(Fichier) ->\r
+ mnesia:restore(dossier_backups() ++ Fichier, []);\r
+% Reviens à une version précédente de la base de données.\r
+% (les données insérées durant les versions plus récentes sont perdues).\r
+restore(Version) when is_integer(Version) ->\r
+ mnesia:restore(fichier_backup(Version), []). % [{default_op, recreate_tables}]).\r
+\r
+\r
+% Change le nom du noeud d'un backup.\r
+% provient d'ici : http://www.erlang.org/doc/apps/mnesia/Mnesia_chap7.html#6.9\r
+% From : l'ancien nom\r
+% To : le nouveau nom\r
+% Source : le nom du fichier de backup\r
+% Target : le nom du fichier du nouveau backup\r
+change_node_name(From, To, Source, Target) ->\r
+ Switch =\r
+ fun(Node) when Node == From -> To;\r
+ (Node) when Node == To -> throw({error, already_exists});\r
+ (Node) -> Node\r
+ end,\r
+ Convert =\r
+ fun({schema, db_nodes, Nodes}, Acc) ->\r
+ {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};\r
+ ({schema, version, Version}, Acc) ->\r
+ {[{schema, version, Version}], Acc};\r
+ ({schema, cookie, Cookie}, Acc) ->\r
+ {[{schema, cookie, Cookie}], Acc};\r
+ ({schema, Tab, CreateList}, Acc) ->\r
+ Keys = [ram_copies, disc_copies, disc_only_copies],\r
+ OptSwitch =\r
+ fun({Key, Val}) ->\r
+ case lists:member(Key, Keys) of\r
+ true -> {Key, lists:map(Switch, Val)};\r
+ false-> {Key, Val}\r
+ end\r
+ end,\r
+ {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};\r
+ (Other, Acc) ->\r
+ {[Other], Acc}\r
+ end,\r
+ mnesia:traverse_backup(Source, Target, Convert, switched).\r
+\r
+\r
+% Obsolète\r
+%~ backup_text(File) ->\r
+ %~ mnesia:dump_to_textfile(File).\r
+%~ restore_text(File) ->\r
+ %~ mnesia:stop(),\r
+ %~ mnesia:delete_schema([node()]),\r
+ %~ mnesia:start(),\r
+ %~ create_tables(),\r
+ %~ case mnesia:load_textfile(File) of\r
+ %~ {atomic, ok} ->\r
+ %~ update(),\r
+ %~ creer_indexes();\r
+ %~ Erreur ->\r
+ %~ Erreur\r
+ %~ end.\r
+\r
+\r
+toggle_ek_master(User_id) ->\r
+ euphorik_bd:resultat_transaction(mnesia:transaction(\r
+ fun() ->\r
+ Users = e(q([E || E <- mnesia:table(user), E#user.id =:= User_id]), [{tmpdir, ?KEY_SORT_TEMP_DIR}]),\r
+ case Users of\r
+ [User] ->\r
+ mnesia:write(User#user{ek_master = not User#user.ek_master});\r
+ _ -> erreur\r
+ end\r
+ end\r
+ )).\r
+\r
+\r
+% Affiche N user trié par leur date de dernière connexion.\r
+% Opt est une liste d'option d'affichage :\r
+% * ekmaster : n'affiche que les admins\r
+print_users(N, Opt) ->\r
+ AfficheQueLesEkMaster = lists:any(fun(O) -> O =:= ekmaster end, Opt),\r
+ euphorik_bd:resultat_transaction(mnesia:transaction(fun() ->\r
+ C = cursor(\r
+ qlc:keysort(\r
+ #user.date_derniere_connexion,\r
+ if AfficheQueLesEkMaster ->\r
+ q([E || E <- mnesia:table(user), E#user.ek_master =:= true]);\r
+ true ->\r
+ q([E || E <- mnesia:table(user)])\r
+ end,\r
+ [{order, descending}]\r
+ ),\r
+ [{tmpdir, ?KEY_SORT_TEMP_DIR}]\r
+ ),\r
+ Users = qlc:next_answers(C, N),\r
+ lists:foreach(\r
+ fun(U) ->\r
+ print_user(U)\r
+ end,\r
+ Users\r
+ ),\r
+ qlc:delete_cursor(C)\r
+ end)).\r
+\r
+\r
+% Affiche tous les users.\r
+print_users(Opt) ->\r
+ print_users(all_remaining, Opt).\r
+\r
+% Affiche tous les users.\r
+print_users() ->\r
+ print_users(all_remaining, []).\r
+\r
+print_user(User) when is_record(User, user) ->\r
+ #user{id = Id, profile = #profile{pseudo = Pseudo}, login = Login, ek_master = Ek_master, date_derniere_connexion = Date, last_ip = IP} = User,\r
+ {{Annee, Mois, Jour}, {Heure, Min, _}} = calendar:now_to_local_time(Date),\r
+ io:format(\r
+ % id pseudo (login) IP Jour Mois Année Heure Minute\r
+ "~4w : ~10.10..s(~10.10..s) ~s ~2w.~2.2.0w.~w - ~2wh~2.2.0w~n",\r
+ [\r
+ Id,\r
+ if Ek_master -> "*"; true -> "" end ++ Pseudo,\r
+ Login,\r
+ euphorik_common:serialize_ip(IP),\r
+ Jour, Mois, Annee, Heure, Min\r
+ ]\r
+ );\r
+% Affichage d'un user en fonction de son login\r
+print_user(Login) when is_list(Login) ->\r
+ case euphorik_bd:user_by_login(Login) of\r
+ {ok, User} ->\r
+ print_user(User);\r
+ _ ->\r
+ {erreur, "Login pas trouvé : " ++ Login}\r
+ end;\r
+% Affichage d'un user en fonction de son id\r
+print_user(Id) when is_integer(Id) ->\r
+ case euphorik_bd:user_by_id(Id) of\r
+ {ok, User} ->\r
+ print_user(User);\r
+ _ ->\r
+ {erreur, "Id pas trouvé : " ++ integer_to_list(Id)}\r
+ end.\r
+\r