diff options
Diffstat (limited to 'src/mod_roster_odbc.erl')
-rw-r--r-- | src/mod_roster_odbc.erl | 191 |
1 files changed, 39 insertions, 152 deletions
diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl index 1f84f6953..cc94d10c6 100644 --- a/src/mod_roster_odbc.erl +++ b/src/mod_roster_odbc.erl @@ -122,20 +122,13 @@ process_iq_get(From, To, #iq{sub_el = SubEl} = IQ) -> get_user_roster(Acc, {LUser, LServer}) -> Username = ejabberd_odbc:escape(LUser), - case catch ejabberd_odbc:sql_query( - LServer, - ["select username, jid, nick, subscription, ask, " - "askmessage, server, subscribe, type from rosterusers " - "where username='", Username, "'"]) of + case catch odbc_queries:get_roster(LServer, Username) of {selected, ["username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"], Items} when is_list(Items) -> - JIDGroups = case catch ejabberd_odbc:sql_query( - LServer, - ["select jid, grp from rostergroups " - "where username='", Username, "'"]) of - {selected, ["jid","grp"], - JGrps} when is_list(JGrps) -> + JIDGroups = case catch odbc_queries:get_roster_jid_groups(LServer, Username) of + {selected, ["jid","grp"], JGrps} + when is_list(JGrps) -> JGrps; _ -> [] @@ -148,10 +141,11 @@ get_user_roster(Acc, {LUser, LServer}) -> R -> SJID = jlib:jid_to_string(R#roster.jid), Groups = lists:flatmap( - fun({S, G}) when S == SJID -> - [G]; - (_) -> - [] + fun({S, G}) -> + case jlib:jid_tolower(S) of + SJID -> [G]; + _ -> [] + end end, JIDGroups), [R#roster{groups = Groups}] end @@ -216,13 +210,7 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) -> {selected, ["username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"], - Res} = - ejabberd_odbc:sql_query_t( - ["select username, jid, nick, subscription, " - "ask, askmessage, server, subscribe, type " - "from rosterusers " - "where username='", Username, "' " - "and jid='", SJID, "'"]), + Res} = odbc_queries:get_roster_by_jid(LServer, Username, SJID), Item = case Res of [] -> #roster{usj = {LUser, LServer, LJID}, @@ -239,39 +227,11 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) -> Item2 = process_item_els(Item1, Els), case Item2#roster.subscription of remove -> - ejabberd_odbc:sql_query_t( - ["delete from rosterusers " - " where username='", Username, "' " - " and jid='", SJID, "';"]), - ejabberd_odbc:sql_query_t( - ["delete from rostergroups " - " where username='", Username, "' " - " and jid='", SJID, "';"]); + odbc_queries:del_roster(LServer, Username, SJID); _ -> ItemVals = record_to_string(Item2), ItemGroups = groups_to_string(Item2), - ejabberd_odbc:sql_query_t( - ["delete from rosterusers " - " where username='", Username, "' " - " and jid='", SJID, "';"]), - ejabberd_odbc:sql_query_t( - ["insert into rosterusers(" - " username, jid, nick, " - " subscription, ask, " - " askmessage, server, " - " subscribe, type) " - " values ", ItemVals, ";"]), - ejabberd_odbc:sql_query_t( - ["delete from rostergroups " - " where username='", Username, "' " - " and jid='", SJID, "';"]), - lists:foreach(fun(ItemGroup) -> - ejabberd_odbc:sql_query_t( - ["insert into rostergroups(" - " username, jid, grp) " - " values ", ItemGroup, ";"]) - end, - ItemGroups) + odbc_queries:update_roster(LServer, Username, SJID, ItemVals, ItemGroups) end, %% If the item exist in shared roster, take the %% subscription information from there: @@ -279,7 +239,7 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) -> LServer, Item2, [LServer]), {Item, Item3} end, - case ejabberd_odbc:sql_transaction(LServer, F) of + case odbc_queries:sql_transaction(LServer, F) of {atomic, {OldItem, Item}} -> push_item(User, LServer, To, Item), case Item#roster.subscription of @@ -411,11 +371,7 @@ get_subscription_lists(_, User, Server) -> LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), Username = ejabberd_odbc:escape(LUser), - case catch ejabberd_odbc:sql_query( - LServer, - ["select username, jid, nick, subscription, ask, " - "askmessage, server, subscribe, type from rosterusers " - "where username='", Username, "'"]) of + case catch odbc_queries:get_roster(LServer, Username) of {selected, ["username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"], Items} when is_list(Items) -> @@ -460,22 +416,14 @@ process_subscription(Direction, User, Server, JID1, Type, Reason) -> SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)), F = fun() -> Item = - case ejabberd_odbc:sql_query_t( - ["select username, jid, nick, subscription, ask, " - "askmessage, server, subscribe, type " - "from rosterusers " - "where username='", Username, "' " - "and jid='", SJID, "';"]) of + case odbc_queries:get_roster_by_jid(LServer, Username, SJID) of {selected, ["username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"], [I]} -> R = raw_to_record(LServer, I), Groups = - case ejabberd_odbc:sql_query_t( - ["select grp from rostergroups " - "where username='", Username, "' " - "and jid='", SJID, "';"]) of + case odbc_queries:get_roster_groups(LServer, Username, SJID) of {selected, ["grp"], JGrps} when is_list(JGrps) -> [JGrp || {JGrp} <- JGrps]; _ -> @@ -521,21 +469,11 @@ process_subscription(Direction, User, Server, JID1, Type, Reason) -> ask = Pending, askmessage = AskMessage}, ItemVals = record_to_string(NewItem), - ejabberd_odbc:sql_query_t( - ["delete from rosterusers " - " where username='", Username, "' " - " and jid='", SJID, "';"]), - ejabberd_odbc:sql_query_t( - ["insert into rosterusers(" - " username, jid, nick, " - " subscription, ask, " - " askmessage, server, subscribe, " - " type) " - " values ", ItemVals, ";"]), + odbc_queries:roster_subscribe(LServer, Username, SJID, ItemVals), {{push, NewItem}, AutoReply} end end, - case ejabberd_odbc:sql_transaction(LServer, F) of + case odbc_queries:sql_transaction(LServer, F) of {atomic, {Push, AutoReply}} -> case AutoReply of none -> @@ -662,16 +600,7 @@ remove_user(User, Server) -> LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), Username = ejabberd_odbc:escape(LUser), - ejabberd_odbc:sql_transaction( - LServer, - fun() -> - ejabberd_odbc:sql_query_t( - ["delete from rosterusers " - " where username='", Username, "';"]), - ejabberd_odbc:sql_query_t( - ["delete from rostergroups " - " where username='", Username, "';"]) - end), + odbc_queries:del_user_roster_t(LServer, Username), ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -680,7 +609,7 @@ set_items(User, Server, SubEl) -> {xmlelement, _Name, _Attrs, Els} = SubEl, LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), - catch ejabberd_odbc:transaction( + catch odbc_queries:transaction( LServer, lists:map(fun(El) -> process_item_set_t(LUser, LServer, El) @@ -703,31 +632,11 @@ process_item_set_t(LUser, LServer, {xmlelement, _Name, Attrs, Els}) -> Item2 = process_item_els(Item1, Els), case Item2#roster.subscription of remove -> - [["delete from rosterusers " - " where username='", Username, "' " - " and jid='", SJID, "';"], - ["delete from rostergroups " - " where username='", Username, "' " - " and jid='", SJID, "';"]]; + odbc_queries:del_roster_sql(Username, SJID); _ -> ItemVals = record_to_string(Item1), ItemGroups = groups_to_string(Item2), - [["delete from rosterusers " - " where username='", Username, "' " - " and jid='", SJID, "';"], - ["insert into rosterusers(" - " username, jid, nick, " - " subscription, ask, " - " askmessage, server, subscribe, " - " type) " - " values ", ItemVals, ";"], - ["delete from rostergroups " - " where username='", Username, "' " - " and jid='", SJID, "';"], - [["insert into rostergroups(" - " username, jid, grp) " - " values ", ItemGroup, ";"] || - ItemGroup <- ItemGroups]] + odbc_queries:update_roster_sql(Username, SJID, ItemVals, ItemGroups) end end; process_item_set_t(_LUser, _LServer, _) -> @@ -773,34 +682,24 @@ process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) -> process_item_attrs_ws(Item, []) -> Item. - get_in_pending_subscriptions(Ls, User, Server) -> JID = jlib:make_jid(User, Server, ""), LUser = JID#jid.luser, LServer = JID#jid.lserver, Username = ejabberd_odbc:escape(LUser), - case catch ejabberd_odbc:sql_query( - LServer, - ["select username, jid, nick, subscription, ask, " - "askmessage, server, subscribe, type from rosterusers " - "where username='", Username, "'"]) of + case catch odbc_queries:get_roster(LServer, Username) of {selected, ["username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"], Items} when is_list(Items) -> Ls ++ lists:map( fun(R) -> Message = R#roster.askmessage, - Status = if is_binary(Message) -> - binary_to_list(Message); - true -> - "" - end, {xmlelement, "presence", [{"from", jlib:jid_to_string(R#roster.jid)}, {"to", jlib:jid_to_string(JID)}, {"type", "subscribe"}], [{xmlelement, "status", [], - [{xmlcdata, Status}]}]} + [{xmlcdata, Message}]}]} end, lists:flatmap( fun(I) -> @@ -825,11 +724,7 @@ get_jid_info(_, User, Server, JID) -> LJID = jlib:jid_tolower(JID), Username = ejabberd_odbc:escape(LUser), SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)), - case catch ejabberd_odbc:sql_query( - LServer, - ["select subscription from rosterusers " - "where username='", Username, "' " - "and jid='", SJID, "'"]) of + case catch odbc_queries:get_subscription(LServer, Username, SJID) of {selected, ["subscription"], [{SSubscription}]} -> Subscription = case SSubscription of "B" -> both; @@ -837,11 +732,7 @@ get_jid_info(_, User, Server, JID) -> "F" -> from; _ -> none end, - Groups = case catch ejabberd_odbc:sql_query( - LServer, - ["select grp from rostergroups " - "where username='", Username, "' " - "and jid='", SJID, "'"]) of + Groups = case catch odbc_queries:get_roster_group_by_jid(LServer, Username, SJID) of {selected, ["grp"], JGrps} when is_list(JGrps) -> [JGrp || {JGrp} <- JGrps]; _ -> @@ -855,11 +746,7 @@ get_jid_info(_, User, Server, JID) -> {none, []}; true -> SRJID = ejabberd_odbc:escape(jlib:jid_to_string(LRJID)), - case catch ejabberd_odbc:sql_query( - LServer, - ["select subscription from rosterusers " - "where username='", Username, "' " - "and jid='", SRJID, "'"]) of + case catch odbc_queries:get_subscription(LServer, Username, SRJID) of {selected, ["subscription"], [{SSubscription}]} -> Subscription = case SSubscription of "B" -> both; @@ -867,11 +754,7 @@ get_jid_info(_, User, Server, JID) -> "F" -> from; _ -> none end, - Groups = case catch ejabberd_odbc:sql_query( - LServer, - ["select grp from rostergroups " - "where username='", Username, "' " - "and jid='", SRJID, "'"]) of + Groups = case catch odbc_queries:get_rostergroup_by_jid(LServer, Username, SRJID) of {selected, ["grp"], JGrps} when is_list(JGrps) -> [JGrp || {JGrp} <- JGrps]; _ -> @@ -939,22 +822,26 @@ record_to_string(#roster{us = {User, _Server}, in -> "I"; none -> "N" end, - ["(" - "'", Username, "'," + ["'", Username, "'," "'", SJID, "'," "'", Nick, "'," "'", SSubscription, "'," "'", SAsk, "'," "'", AskMessage, "'," - "'N', '', 'item')"]. + "'N', '', 'item'"]. groups_to_string(#roster{us = {User, _Server}, jid = JID, groups = Groups}) -> Username = ejabberd_odbc:escape(User), SJID = ejabberd_odbc:escape(jlib:jid_to_string(jlib:jid_tolower(JID))), - [["(" - "'", Username, "'," - "'", SJID, "'," - "'", ejabberd_odbc:escape(Group), "')"] || Group <- Groups]. + + %% Empty groups do not need to be converted to string to be inserted in + %% the database + lists:foldl(fun([], Acc) -> Acc; + (Group, Acc) -> + String = ["'", Username, "'," + "'", SJID, "'," + "'", ejabberd_odbc:escape(Group), "'"], + [String|Acc] end, [], Groups). |