summaryrefslogtreecommitdiff
path: root/src/mod_irc_mnesia.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-14 12:18:04 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-14 12:18:04 +0300
commit79d64e0d71ffa8124186f6027d5695b93b8333b7 (patch)
tree00110612d6f184680f6c72d5a53ee648af503872 /src/mod_irc_mnesia.erl
parentClean mod_shared_roster.erl from DB specific code (diff)
Clean mod_irc.erl from DB specific code
Diffstat (limited to 'src/mod_irc_mnesia.erl')
-rw-r--r--src/mod_irc_mnesia.erl69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/mod_irc_mnesia.erl b/src/mod_irc_mnesia.erl
new file mode 100644
index 00000000..9f8117ad
--- /dev/null
+++ b/src/mod_irc_mnesia.erl
@@ -0,0 +1,69 @@
+%%%-------------------------------------------------------------------
+%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%% @copyright (C) 2016, Evgeny Khramtsov
+%%% @doc
+%%%
+%%% @end
+%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%%-------------------------------------------------------------------
+-module(mod_irc_mnesia).
+
+-behaviour(mod_irc).
+
+%% API
+-export([init/2, get_data/3, set_data/4, import/2]).
+
+-include("jlib.hrl").
+-include("mod_irc.hrl").
+-include("logger.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+init(_Host, _Opts) ->
+ mnesia:create_table(irc_custom,
+ [{disc_copies, [node()]},
+ {attributes, record_info(fields, irc_custom)}]),
+ update_table().
+
+get_data(_LServer, Host, From) ->
+ {U, S, _} = jid:tolower(From),
+ case catch mnesia:dirty_read({irc_custom, {{U, S}, Host}}) of
+ {'EXIT', _Reason} -> error;
+ [] -> empty;
+ [#irc_custom{data = Data}] -> Data
+ end.
+
+set_data(_LServer, Host, From, Data) ->
+ {U, S, _} = jid:tolower(From),
+ F = fun () ->
+ mnesia:write(#irc_custom{us_host = {{U, S}, Host},
+ data = Data})
+ end,
+ mnesia:transaction(F).
+
+import(_LServer, #irc_custom{} = R) ->
+ mnesia:dirty_write(R).
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+update_table() ->
+ Fields = record_info(fields, irc_custom),
+ case mnesia:table_info(irc_custom, attributes) of
+ Fields ->
+ ejabberd_config:convert_table_to_binary(
+ irc_custom, Fields, set,
+ fun(#irc_custom{us_host = {_, H}}) -> H end,
+ fun(#irc_custom{us_host = {{U, S}, H},
+ data = Data} = R) ->
+ JID = jid:make(U, S, <<"">>),
+ R#irc_custom{us_host = {{iolist_to_binary(U),
+ iolist_to_binary(S)},
+ iolist_to_binary(H)},
+ data = mod_irc:data_to_binary(JID, Data)}
+ end);
+ _ ->
+ ?INFO_MSG("Recreating irc_custom table", []),
+ mnesia:transform_table(irc_custom, ignore, Fields)
+ end.