aboutsummaryrefslogtreecommitdiff
path: root/src/mod_vcard_xupdate.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_vcard_xupdate.erl')
-rw-r--r--src/mod_vcard_xupdate.erl145
1 files changed, 23 insertions, 122 deletions
diff --git a/src/mod_vcard_xupdate.erl b/src/mod_vcard_xupdate.erl
index 18fb09a58..198312c36 100644
--- a/src/mod_vcard_xupdate.erl
+++ b/src/mod_vcard_xupdate.erl
@@ -17,26 +17,22 @@
-include("ejabberd.hrl").
-include("logger.hrl").
-
+-include("mod_vcard_xupdate.hrl").
-include("jlib.hrl").
--record(vcard_xupdate, {us = {<<>>, <<>>} :: {binary(), binary()},
- hash = <<>> :: binary()}).
+-callback init(binary(), gen_mod:opts()) -> any().
+-callback import(binary(), #vcard_xupdate{}) -> ok | pass.
+-callback add_xupdate(binary(), binary(), binary()) -> {atomic, any()}.
+-callback get_xupdate(binary(), binary()) -> binary() | undefined.
+-callback remove_xupdate(binary(), binary()) -> {atomic, any()}.
%%====================================================================
%% gen_mod callbacks
%%====================================================================
start(Host, Opts) ->
- case gen_mod:db_type(Host, Opts) of
- mnesia ->
- mnesia:create_table(vcard_xupdate,
- [{disc_copies, [node()]},
- {attributes,
- record_info(fields, vcard_xupdate)}]),
- update_table();
- _ -> ok
- end,
+ Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
+ Mod:init(Host, Opts),
ejabberd_hooks:add(c2s_update_presence, Host, ?MODULE,
update_presence, 100),
ejabberd_hooks:add(vcard_set, Host, ?MODULE, vcard_set,
@@ -79,75 +75,16 @@ vcard_set(LUser, LServer, VCARD) ->
%%====================================================================
add_xupdate(LUser, LServer, Hash) ->
- add_xupdate(LUser, LServer, Hash,
- gen_mod:db_type(LServer, ?MODULE)).
-
-add_xupdate(LUser, LServer, Hash, mnesia) ->
- F = fun () ->
- mnesia:write(#vcard_xupdate{us = {LUser, LServer},
- hash = Hash})
- end,
- mnesia:transaction(F);
-add_xupdate(LUser, LServer, Hash, riak) ->
- {atomic, ejabberd_riak:put(#vcard_xupdate{us = {LUser, LServer},
- hash = Hash},
- vcard_xupdate_schema())};
-add_xupdate(LUser, LServer, Hash, odbc) ->
- Username = ejabberd_odbc:escape(LUser),
- SHash = ejabberd_odbc:escape(Hash),
- F = fun () ->
- odbc_queries:update_t(<<"vcard_xupdate">>,
- [<<"username">>, <<"hash">>],
- [Username, SHash],
- [<<"username='">>, Username, <<"'">>])
- end,
- ejabberd_odbc:sql_transaction(LServer, F).
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:add_xupdate(LUser, LServer, Hash).
get_xupdate(LUser, LServer) ->
- get_xupdate(LUser, LServer,
- gen_mod:db_type(LServer, ?MODULE)).
-
-get_xupdate(LUser, LServer, mnesia) ->
- case mnesia:dirty_read(vcard_xupdate, {LUser, LServer})
- of
- [#vcard_xupdate{hash = Hash}] -> Hash;
- _ -> undefined
- end;
-get_xupdate(LUser, LServer, riak) ->
- case ejabberd_riak:get(vcard_xupdate, vcard_xupdate_schema(),
- {LUser, LServer}) of
- {ok, #vcard_xupdate{hash = Hash}} -> Hash;
- _ -> undefined
- end;
-get_xupdate(LUser, LServer, odbc) ->
- Username = ejabberd_odbc:escape(LUser),
- case ejabberd_odbc:sql_query(LServer,
- [<<"select hash from vcard_xupdate where "
- "username='">>,
- Username, <<"';">>])
- of
- {selected, [<<"hash">>], [[Hash]]} -> Hash;
- _ -> undefined
- end.
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:get_xupdate(LUser, LServer).
remove_xupdate(LUser, LServer) ->
- remove_xupdate(LUser, LServer,
- gen_mod:db_type(LServer, ?MODULE)).
-
-remove_xupdate(LUser, LServer, mnesia) ->
- F = fun () ->
- mnesia:delete({vcard_xupdate, {LUser, LServer}})
- end,
- mnesia:transaction(F);
-remove_xupdate(LUser, LServer, riak) ->
- {atomic, ejabberd_riak:delete(vcard_xupdate, {LUser, LServer})};
-remove_xupdate(LUser, LServer, odbc) ->
- Username = ejabberd_odbc:escape(LUser),
- F = fun () ->
- ejabberd_odbc:sql_query_t([<<"delete from vcard_xupdate where username='">>,
- Username, <<"';">>])
- end,
- ejabberd_odbc:sql_transaction(LServer, F).
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:remove_xupdate(LUser, LServer).
%%%----------------------------------------------------------------------
%%% Presence stanza rebuilding
@@ -184,53 +121,17 @@ build_xphotoel(User, Host) ->
attrs = [{<<"xmlns">>, ?NS_VCARD_UPDATE}],
children = PhotoEl}.
-vcard_xupdate_schema() ->
- {record_info(fields, vcard_xupdate), #vcard_xupdate{}}.
-
-update_table() ->
- Fields = record_info(fields, vcard_xupdate),
- case mnesia:table_info(vcard_xupdate, attributes) of
- Fields ->
- ejabberd_config:convert_table_to_binary(
- vcard_xupdate, Fields, set,
- fun(#vcard_xupdate{us = {U, _}}) -> U end,
- fun(#vcard_xupdate{us = {U, S}, hash = Hash} = R) ->
- R#vcard_xupdate{us = {iolist_to_binary(U),
- iolist_to_binary(S)},
- hash = iolist_to_binary(Hash)}
- end);
- _ ->
- ?INFO_MSG("Recreating vcard_xupdate table", []),
- mnesia:transform_table(vcard_xupdate, ignore, Fields)
- end.
-
-export(_Server) ->
- [{vcard_xupdate,
- fun(Host, #vcard_xupdate{us = {LUser, LServer}, hash = Hash})
- when LServer == Host ->
- Username = ejabberd_odbc:escape(LUser),
- SHash = ejabberd_odbc:escape(Hash),
- [[<<"delete from vcard_xupdate where username='">>,
- Username, <<"';">>],
- [<<"insert into vcard_xupdate(username, "
- "hash) values ('">>,
- Username, <<"', '">>, SHash, <<"');">>]];
- (_Host, _R) ->
- []
- end}].
+export(LServer) ->
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:export(LServer).
import(LServer) ->
- [{<<"select username, hash from vcard_xupdate;">>,
- fun([LUser, Hash]) ->
- #vcard_xupdate{us = {LUser, LServer}, hash = Hash}
- end}].
-
-import(_LServer, mnesia, #vcard_xupdate{} = R) ->
- mnesia:dirty_write(R);
-import(_LServer, riak, #vcard_xupdate{} = R) ->
- ejabberd_riak:put(R, vcard_xupdate_schema());
-import(_, _, _) ->
- pass.
+ Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:import(LServer).
+
+import(LServer, DBType, LA) ->
+ Mod = gen_mod:db_mod(DBType, ?MODULE),
+ Mod:import(LServer, LA).
mod_opt_type(db_type) -> fun gen_mod:v_db/1;
mod_opt_type(_) -> [db_type].