SMatchMessage = if MatchMessage -> "1"; true -> "0" end,
SMatchPresenceIn = if MatchPresenceIn -> "1"; true -> "0" end,
SMatchPresenceOut = if MatchPresenceOut -> "1"; true -> "0" end,
- ["'", SType, "', "
- "'", SValue, "', "
- "'", SAction, "', "
- "'", SOrder, "', "
- "'", SMatchAll, "', "
- "'", SMatchIQ, "', "
- "'", SMatchMessage, "', "
- "'", SMatchPresenceIn, "', "
- "'", SMatchPresenceOut, "'"].
-
+ [SType, SValue, SAction, SOrder, SMatchAll, SMatchIQ,
+ SMatchMessage, SMatchPresenceIn, SMatchPresenceOut].
sql_get_default_privacy_list(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
- ejabberd_odbc:sql_query(
- LServer,
- ["select name from privacy_default_list "
- "where username='", Username, "';"]).
+ odbc_queries:get_default_privacy_list(LServer, Username).
sql_get_default_privacy_list_t(LUser) ->
Username = ejabberd_odbc:escape(LUser),
- ejabberd_odbc:sql_query_t(
- ["select name from privacy_default_list "
- "where username='", Username, "';"]).
+ odbc_queries:get_default_privacy_list_t(Username).
sql_get_privacy_list_names(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
- ejabberd_odbc:sql_query(
- LServer,
- ["select name from privacy_list "
- "where username='", Username, "';"]).
+ odbc_queries:get_privacy_list_names(LServer, Username).
sql_get_privacy_list_names_t(LUser) ->
Username = ejabberd_odbc:escape(LUser),
- ejabberd_odbc:sql_query_t(
- ["select name from privacy_list "
- "where username='", Username, "';"]).
+ odbc_queries:get_privacy_list_names_t(Username).
sql_get_privacy_list_id(LUser, LServer, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query(
- LServer,
- ["select id from privacy_list "
- "where username='", Username, "' and name='", SName, "';"]).
+ odbc_queries:get_privacy_list_id(LServer, Username, SName).
sql_get_privacy_list_id_t(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query_t(
- ["select id from privacy_list "
- "where username='", Username, "' and name='", SName, "';"]).
+ odbc_queries:get_privacy_list_id_t(Username, SName).
sql_get_privacy_list_data(LUser, LServer, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query(
- LServer,
- ["select t, value, action, ord, match_all, match_iq, "
- "match_message, match_presence_in, match_presence_out "
- "from privacy_list_data "
- "where id = (select id from privacy_list where "
- " username='", Username, "' and name='", SName, "') "
- "order by ord;"]).
+ odbc_queries:get_privacy_list_data(LServer, Username, SName).
sql_get_privacy_list_data_by_id(ID, LServer) ->
- ejabberd_odbc:sql_query(
- LServer,
- ["select t, value, action, ord, match_all, match_iq, "
- "match_message, match_presence_in, match_presence_out "
- "from privacy_list_data "
- "where id='", ID, "' order by ord;"]).
+ odbc_queries:get_privacy_list_data_by_id(LServer, ID).
sql_set_default_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query_t(
- ["delete from privacy_default_list "
- " where username='", Username, "';"]),
- ejabberd_odbc:sql_query_t(
- ["insert into privacy_default_list(username, name) "
- "values ('", Username, "', '", SName, "');"]).
+ odbc_queries:set_default_privacy_list(Username, SName).
sql_unset_default_privacy_list(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
- ejabberd_odbc:sql_query(
- LServer,
- ["delete from privacy_default_list "
- " where username='", Username, "';"]).
+ odbc_queries:unset_default_privacy_list(LServer, Username).
sql_remove_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query_t(
- ["delete from privacy_list "
- "where username='", Username, "' and name='", SName, "';"]).
+ odbc_queries:remove_privacy_list(Username, SName).
sql_add_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
- ejabberd_odbc:sql_query_t(
- ["insert into privacy_list(username, name) "
- "values ('", Username, "', '", SName, "');"]).
+ odbc_queries:add_privacy_list(Username, SName).
sql_set_privacy_list(ID, RItems) ->
- ejabberd_odbc:sql_query_t(
- ["delete from privacy_list_data "
- "where id='", ID, "';"]),
- lists:foreach(fun(Items) ->
- ejabberd_odbc:sql_query_t(
- ["insert into privacy_list_data("
- "id, t, value, action, ord, match_all, match_iq, "
- "match_message, match_presence_in, "
- "match_presence_out "
- ") "
- "values ('", ID, "', ", Items, ");"])
- end, RItems).
+ odbc_queries:set_privacy_list(ID, RItems).
sql_del_privacy_lists(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
Server = ejabberd_odbc:escape(LServer),
- ejabberd_odbc:sql_query(
- LServer,
- ["delete from privacy_list where username='", Username, "';"]),
- ejabberd_odbc:sql_query(
- LServer,
- ["delete from privacy_list_data where value='", Username++"@"++Server, "';"]),
- ejabberd_odbc:sql_query(
- LServer,
- ["delete from privacy_default_list where username='", Username, "';"]).
+ odbc_queries:del_privacy_lists(LServer, Server, Username).
set_private_data_sql/3,
get_private_data/3,
del_user_private_storage/2,
+ get_default_privacy_list/2,
+ get_default_privacy_list_t/1,
+ get_privacy_list_names/2,
+ get_privacy_list_names_t/1,
+ get_privacy_list_id/3,
+ get_privacy_list_id_t/2,
+ get_privacy_list_data/3,
+ get_privacy_list_data_by_id/2,
+ set_default_privacy_list/2,
+ unset_default_privacy_list/2,
+ remove_privacy_list/2,
+ add_privacy_list/2,
+ set_privacy_list/2,
+ del_privacy_lists/3,
set_vcard/26,
get_vcard/2,
escape/1,
get_db_type() ->
generic.
+%% Safe atomic update.
+update_t(Table, Fields, Vals, Where) ->
+ UPairs = lists:zipwith(fun(A, B) -> A ++ "='" ++ B ++ "'" end,
+ Fields, Vals),
+ case ejabberd_odbc:sql_query_t(
+ ["update ", Table, " set ",
+ string:join(UPairs, ", "),
+ " where ", Where, ";"]) of
+ {updated, 1} ->
+ ok;
+ _ ->
+ %% The 'catch' herein is used because mysql returns
+ %% affected rows (not matched as in postgresql).
+ %% FIXME: need to find more suitable solution.
+ catch ejabberd_odbc:sql_query_t(
+ ["insert into ", Table, "(", string:join(Fields, ", "),
+ ") values ('", string:join(Vals, "', '"), "');"])
+ end.
+
%% F can be either a fun or a list of queries
-%% TODO: We should probably move the list of queries transaction wrapper from the ejabberd_odbc module
-%% to this one (odbc_queries)
+%% TODO: We should probably move the list of queries transaction
+%% wrapper from the ejabberd_odbc module to this one (odbc_queries)
sql_transaction(LServer, F) ->
ejabberd_odbc:sql_transaction(LServer, F).
%% MREMOND: I think this should be turn into a non transactional behaviour
ejabberd_odbc:sql_transaction(
LServer,
- [["delete from last where username='", Username, "';"],
- ["insert into last(username, seconds, state) "
- "values ('", Username, "', '", Seconds, "', '", State, "');"]]).
+ fun() ->
+ update_t("last", ["username", "seconds", "state"],
+ [Username, Seconds, State],
+ ["username='", Username, "'"])
+ end).
del_last(LServer, Username) ->
ejabberd_odbc:sql_query(
set_password_t(LServer, Username, Pass) ->
ejabberd_odbc:sql_transaction(
LServer,
- [["delete from users where username='", Username ,"';"],
- ["insert into users(username, password) "
- "values ('", Username, "', '", Pass, "');"]]).
+ fun() ->
+ update_t("users", ["username", "password"],
+ [Username, Pass],
+ ["username='", Username ,"'"])
+ end).
add_user(LServer, Username, Pass) ->
ejabberd_odbc:sql_query(
" and jid='", SJID, "';"]].
update_roster(_LServer, Username, SJID, ItemVals, ItemGroups) ->
- 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, ");"]),
+ update_t("rosterusers",
+ ["username", "jid", "nick", "subscription", "ask",
+ "askmessage", "server", "subscribe", "type"],
+ ItemVals,
+ ["username='", Username, "' and jid='", SJID, "'"]),
ejabberd_odbc:sql_query_t(
["delete from rostergroups "
" where username='", Username, "' "
ejabberd_odbc:sql_query_t(
["insert into rostergroups("
" username, jid, grp) "
- " values (", ItemGroup, ");"])
+ " values ('", string:join(ItemGroup, "', '"), "');"])
end,
ItemGroups).
" username, jid, nick, "
" subscription, ask, askmessage, "
" server, subscribe, type) "
- " values (", ItemVals, ");"],
+ " values ('", string:join(ItemVals, "', '"), "');"],
["delete from rostergroups "
" where username='", Username, "' "
" and jid='", SJID, "';"]] ++
[["insert into rostergroups("
" username, jid, grp) "
- " values (", ItemGroup, ");"] ||
+ " values ('", string:join(ItemGroup, "', '"), "');"] ||
ItemGroup <- ItemGroups].
roster_subscribe(_LServer, Username, SJID, ItemVals) ->
- 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, ");"]).
+ update_t("rosterusers",
+ ["username", "jid", "nick", "subscription", "ask",
+ "askmessage", "server", "subscribe", "type"],
+ ItemVals,
+ ["username='", Username, "' and jid='", SJID, "'"]).
get_subscription(LServer, Username, SJID) ->
ejabberd_odbc:sql_query(
"and jid='", SJID, "'"]).
set_private_data(_LServer, Username, LXMLNS, SData) ->
- lists:foreach(fun(Query) ->
- ejabberd_odbc:sql_query_t(Query)
- end,
- set_private_data_sql(Username, LXMLNS, SData)).
+ update_t("private_storage",
+ ["username", "namespace", "data"],
+ [Username, LXMLNS, SData],
+ ["username='", Username, "' and namespace='", LXMLNS, "'"]).
set_private_data_sql(Username, LXMLNS, SData) ->
[["delete from private_storage "
LServer,
["delete from private_storage where username='", Username, "';"]).
-
set_vcard(LServer, LUsername, SBDay, SCTRY, SEMail, SFN, SFamily, SGiven,
SLBDay, SLCTRY, SLEMail, SLFN, SLFamily, SLGiven, SLLocality,
SLMiddle, SLNickname, SLOrgName, SLOrgUnit, SLocality, SMiddle,
SNickname, SOrgName, SOrgUnit, SVCARD, Username) ->
ejabberd_odbc:sql_transaction(
LServer,
- [["delete from vcard where username='", LUsername, "';"],
- ["insert into vcard(username, vcard) "
- "values ('", LUsername, "', '", SVCARD, "');"],
- ["delete from vcard_search where lusername='", LUsername, "';"],
- ["insert into vcard_search("
- " username, lusername, fn, lfn, family, lfamily,"
- " given, lgiven, middle, lmiddle, nickname, lnickname,"
- " bday, lbday, ctry, lctry, locality, llocality,"
- " email, lemail, orgname, lorgname, orgunit, lorgunit)"
- "values (",
- " '", Username, "', '", LUsername, "',"
- " '", SFN, "', '", SLFN, "',"
- " '", SFamily, "', '", SLFamily, "',"
- " '", SGiven, "', '", SLGiven, "',"
- " '", SMiddle, "', '", SLMiddle, "',"
- " '", SNickname, "', '", SLNickname, "',"
- " '", SBDay, "', '", SLBDay, "',"
- " '", SCTRY, "', '", SLCTRY, "',"
- " '", SLocality, "', '", SLLocality, "',"
- " '", SEMail, "', '", SLEMail, "',"
- " '", SOrgName, "', '", SLOrgName, "',"
- " '", SOrgUnit, "', '", SLOrgUnit, "');"]]).
+ fun() ->
+ update_t("vcard", ["username", "vcard"],
+ [LUsername, SVCARD],
+ ["username='", LUsername, "'"]),
+ update_t("vcard_search",
+ ["username", "lusername", "fn", "lfn", "family",
+ "lfamily", "given", "lgiven", "middle", "lmiddle",
+ "nickname", "lnickname", "bday", "lbday", "ctry",
+ "lctry", "locality", "llocality", "email", "lemail",
+ "orgname", "lorgname", "orgunit", "lorgunit"],
+ [Username, LUsername, SFN, SLFN, SFamily, SLFamily,
+ SGiven, SLGiven, SMiddle, SLMiddle, SNickname,
+ SLNickname, SBDay, SLBDay, SCTRY, SLCTRY,
+ SLocality, SLLocality, SEMail, SLEMail, SOrgName,
+ SLOrgName, SOrgUnit, SLOrgUnit],
+ ["lusername='", LUsername, "'"])
+ end).
get_vcard(LServer, Username) ->
ejabberd_odbc:sql_query(
["select vcard from vcard "
"where username='", Username, "';"]).
+get_default_privacy_list(LServer, Username) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select name from privacy_default_list "
+ "where username='", Username, "';"]).
+
+get_default_privacy_list_t(Username) ->
+ ejabberd_odbc:sql_query_t(
+ ["select name from privacy_default_list "
+ "where username='", Username, "';"]).
+
+get_privacy_list_names(LServer, Username) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select name from privacy_list "
+ "where username='", Username, "';"]).
+
+get_privacy_list_names_t(Username) ->
+ ejabberd_odbc:sql_query_t(
+ ["select name from privacy_list "
+ "where username='", Username, "';"]).
+
+get_privacy_list_id(LServer, Username, SName) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select id from privacy_list "
+ "where username='", Username, "' and name='", SName, "';"]).
+
+get_privacy_list_id_t(Username, SName) ->
+ ejabberd_odbc:sql_query_t(
+ ["select id from privacy_list "
+ "where username='", Username, "' and name='", SName, "';"]).
+
+get_privacy_list_data(LServer, Username, SName) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select t, value, action, ord, match_all, match_iq, "
+ "match_message, match_presence_in, match_presence_out "
+ "from privacy_list_data "
+ "where id = (select id from privacy_list where "
+ " username='", Username, "' and name='", SName, "') "
+ "order by ord;"]).
+
+get_privacy_list_data_by_id(LServer, ID) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select t, value, action, ord, match_all, match_iq, "
+ "match_message, match_presence_in, match_presence_out "
+ "from privacy_list_data "
+ "where id='", ID, "' order by ord;"]).
+
+set_default_privacy_list(Username, SName) ->
+ update_t("privacy_default_list", ["username", "name"],
+ [Username, SName], ["username='", Username, "'"]).
+
+unset_default_privacy_list(LServer, Username) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["delete from privacy_default_list "
+ " where username='", Username, "';"]).
+
+remove_privacy_list(Username, SName) ->
+ ejabberd_odbc:sql_query_t(
+ ["delete from privacy_list "
+ "where username='", Username, "' and name='", SName, "';"]).
+
+add_privacy_list(Username, SName) ->
+ ejabberd_odbc:sql_query_t(
+ ["insert into privacy_list(username, name) "
+ "values ('", Username, "', '", SName, "');"]).
+
+set_privacy_list(ID, RItems) ->
+ ejabberd_odbc:sql_query_t(
+ ["delete from privacy_list_data "
+ "where id='", ID, "';"]),
+ lists:foreach(fun(Items) ->
+ ejabberd_odbc:sql_query_t(
+ ["insert into privacy_list_data("
+ "id, t, value, action, ord, match_all, match_iq, "
+ "match_message, match_presence_in, "
+ "match_presence_out "
+ ") "
+ "values ('", ID, "', '",
+ string:join(Items, "', '"), "');"])
+ end, RItems).
+
+del_privacy_lists(LServer, Server, Username) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["delete from privacy_list where username='", Username, "';"]),
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["delete from privacy_list_data where value='", Username++"@"++Server, "';"]),
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["delete from privacy_default_list where username='", Username, "';"]).
+
%% Characters to escape
escape($\0) -> "\\0";
escape($\n) -> "\\n";