aboutsummaryrefslogtreecommitdiff
path: root/src/mod_private.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_private.erl')
-rw-r--r--src/mod_private.erl86
1 files changed, 63 insertions, 23 deletions
diff --git a/src/mod_private.erl b/src/mod_private.erl
index ba5c00a8e..5ca6204f3 100644
--- a/src/mod_private.erl
+++ b/src/mod_private.erl
@@ -46,10 +46,16 @@
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- mnesia:create_table(private_storage,
- [{disc_only_copies, [node()]},
- {attributes, record_info(fields, private_storage)}]),
- update_table(),
+ case gen_mod:db_type(Opts) of
+ mnesia ->
+ mnesia:create_table(private_storage,
+ [{disc_only_copies, [node()]},
+ {attributes,
+ record_info(fields, private_storage)}]),
+ update_table();
+ _ ->
+ ok
+ end,
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE,
@@ -73,12 +79,21 @@ process_sm_iq(#jid{luser = LUser, lserver = LServer},
sub_el = [IQ#iq.sub_el, ?ERR_NOT_ACCEPTABLE]
};
Data ->
- mnesia:transaction(fun() ->
- lists:foreach(fun
- (Datum) ->
- set_data(LUser, LServer, Datum)
- end, Data)
- end),
+ DBType = gen_mod:db_type(LServer, ?MODULE),
+ F = fun() ->
+ lists:foreach(
+ fun
+ (Datum) ->
+ set_data(LUser, LServer,
+ Datum, DBType)
+ end, Data)
+ end,
+ case DBType of
+ odbc ->
+ ejabberd_odbc:sql_transaction(LServer, F);
+ mnesia ->
+ mnesia:transaction(F)
+ end,
IQ#iq{type = result, sub_el = []}
end;
_ ->
@@ -132,30 +147,53 @@ filter_xmlels([_ | Xmlels], Data) ->
filter_xmlels(Xmlels, Data).
-set_data(LUser, LServer, {XmlNS, Xmlel}) ->
+set_data(LUser, LServer, {XmlNS, Xmlel}, mnesia) ->
mnesia:write(#private_storage{
- usns = {LUser, LServer, XmlNS},
- xml = Xmlel
- }).
-
+ usns = {LUser, LServer, XmlNS},
+ xml = Xmlel});
+set_data(LUser, LServer, {XMLNS, El}, odbc) ->
+ Username = ejabberd_odbc:escape(LUser),
+ LXMLNS = ejabberd_odbc:escape(XMLNS),
+ SData = ejabberd_odbc:escape(
+ xml:element_to_binary(El)),
+ odbc_queries:set_private_data(LServer, Username, LXMLNS, SData).
get_data(LUser, LServer, Data) ->
- get_data(LUser, LServer, Data, []).
+ get_data(LUser, LServer, gen_mod:db_type(LServer, ?MODULE), Data, []).
-get_data(_LUser, _LServer, [], Storage_Xmlels) ->
+get_data(_LUser, _LServer, _DBType, [], Storage_Xmlels) ->
lists:reverse(Storage_Xmlels);
-get_data(LUser, LServer, [{XmlNS, Xmlel} | Data], Storage_Xmlels) ->
+get_data(LUser, LServer, mnesia, [{XmlNS, Xmlel} | Data], Storage_Xmlels) ->
case mnesia:dirty_read(private_storage, {LUser, LServer, XmlNS}) of
[#private_storage{xml = Storage_Xmlel}] ->
- get_data(LUser, LServer, Data, [Storage_Xmlel | Storage_Xmlels]);
+ get_data(LUser, LServer, mnesia, Data,
+ [Storage_Xmlel | Storage_Xmlels]);
_ ->
- get_data(LUser, LServer, Data, [Xmlel | Storage_Xmlels])
+ get_data(LUser, LServer, mnesia, Data,
+ [Xmlel | Storage_Xmlels])
+ end;
+get_data(LUser, LServer, odbc, [{XMLNS, El} | Els], Res) ->
+ Username = ejabberd_odbc:escape(LUser),
+ LXMLNS = ejabberd_odbc:escape(XMLNS),
+ case catch odbc_queries:get_private_data(LServer, Username, LXMLNS) of
+ {selected, ["data"], [{SData}]} ->
+ case xml_stream:parse_element(SData) of
+ Data when element(1, Data) == xmlelement ->
+ get_data(LUser, LServer, odbc, Els, [Data | Res])
+ end;
+ %% MREMOND: I wonder when the query could return a vcard ?
+ {selected, ["vcard"], []} ->
+ get_data(LUser, LServer, odbc, Els, [El | Res]);
+ _ ->
+ get_data(LUser, LServer, odbc, Els, [El | Res])
end.
-
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
+ remove_user(LUser, LServer, gen_mod:db_type(Server, ?MODULE)).
+
+remove_user(LUser, LServer, mnesia) ->
F = fun() ->
Namespaces = mnesia:select(
private_storage,
@@ -169,8 +207,10 @@ remove_user(User, Server) ->
{LUser, LServer, Namespace}})
end, Namespaces)
end,
- mnesia:transaction(F).
-
+ mnesia:transaction(F);
+remove_user(LUser, LServer, odbc) ->
+ Username = ejabberd_odbc:escape(LUser),
+ odbc_queries:del_user_private_storage(LServer, Username).
update_table() ->
Fields = record_info(fields, private_storage),