aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2012-04-06 12:31:29 +1000
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2012-04-06 12:31:29 +1000
commitcea23b055b26ff851944c93c54c58057df9f0fed (patch)
tree2c93bbd185630d4dcba3535a2a973092d281aeb3 /src
parentODBC support for mod_shared_roster (diff)
Get rid of duplicated code
Diffstat (limited to 'src')
-rw-r--r--src/ejd2odbc.erl6
-rw-r--r--src/mod_announce_odbc.erl46
-rw-r--r--src/mod_irc/mod_irc_odbc.erl70
-rw-r--r--src/mod_muc/mod_muc_odbc.erl48
-rw-r--r--src/mod_shared_roster_odbc.erl70
-rw-r--r--src/mod_vcard_xupdate_odbc.erl28
-rw-r--r--src/odbc/ejabberd_odbc.erl10
-rw-r--r--src/odbc/odbc_queries.erl1
8 files changed, 75 insertions, 204 deletions
diff --git a/src/ejd2odbc.erl b/src/ejd2odbc.erl
index 206b403cd..a2331137e 100644
--- a/src/ejd2odbc.erl
+++ b/src/ejd2odbc.erl
@@ -305,7 +305,7 @@ export_muc_room(Server, Output) ->
true ->
SName = ejabberd_odbc:escape(Name),
SRoomHost = ejabberd_odbc:escape(RoomHost),
- SOpts = mod_muc_odbc:encode_opts(Opts),
+ SOpts = ejabberd_odbc:encode_term(Opts),
["delete from muc_room where name='", SName,
"' and host='", SRoomHost, "';",
"insert into muc_room(name, host, opts) values (",
@@ -345,7 +345,7 @@ export_irc_custom(Server, Output) ->
jlib:jid_to_string(
jlib:make_jid(U, S, ""))),
SIRCHost = ejabberd_odbc:escape(IRCHost),
- SData = mod_irc_odbc:encode_data(Data),
+ SData = ejabberd_odbc:encode_term(Data),
["delete from irc_custom where jid='", SJID,
"' and host='", SIRCHost, "';"
"insert into irc_custom(jid, host, data) values ("
@@ -407,7 +407,7 @@ export_sr_group(Server, Output) ->
fun(Host, #sr_group{group_host = {Group, LServer}, opts = Opts})
when LServer == Host ->
SGroup = ejabberd_odbc:escape(Group),
- SOpts = mod_shared_roster_odbc:encode_opts(Opts),
+ SOpts = ejabberd_odbc:encode_term(Opts),
["delete from sr_group where name='", Group, "';"
"insert into sr_group(name, opts) values ('",
SGroup, "', '", SOpts, "');"];
diff --git a/src/mod_announce_odbc.erl b/src/mod_announce_odbc.erl
index 7e1e9dca0..101f8aae2 100644
--- a/src/mod_announce_odbc.erl
+++ b/src/mod_announce_odbc.erl
@@ -742,10 +742,11 @@ announce_motd(Host, Packet) ->
lists:foreach(
fun({U, _S, _R}) ->
Username = ejabberd_odbc:escape(U),
- update_t("motd",
- ["username", "xml"],
- [Username, ""],
- ["username='", Username, "'"])
+ odbc_queries:update_t(
+ "motd",
+ ["username", "xml"],
+ [Username, ""],
+ ["username='", Username, "'"])
end, Sessions)
end,
LServer = jlib:nameprep(Host),
@@ -777,10 +778,11 @@ announce_motd_update(LServer, Packet) ->
announce_motd_delete(LServer),
XML = ejabberd_odbc:escape(xml:element_to_binary(Packet)),
F = fun() ->
- update_t("motd",
- ["username", "xml"],
- ["", XML],
- ["username=''"])
+ odbc_queries:update_t(
+ "motd",
+ ["username", "xml"],
+ ["", XML],
+ ["username=''"])
end,
ejabberd_odbc:sql_transaction(LServer, F).
@@ -829,8 +831,8 @@ send_motd(#jid{luser = LUser, lserver = LServer} = JID) when LUser /= "" ->
Local = jlib:make_jid("", LServer, ""),
ejabberd_router:route(Local, JID, Packet),
F = fun() ->
- update_t(
- ["motd"],
+ odbc_queries:update_t(
+ "motd",
["username", "xml"],
[Username, ""],
["username='", Username, "'"])
@@ -881,27 +883,3 @@ send_announcement_to_all(Host, SubjectS, BodyS) ->
Dest = jlib:make_jid(U, S, R),
ejabberd_router:route(Local, Dest, Packet)
end, Sessions).
-
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
-%% 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 ",
- join(UPairs, ", "),
- " where ", Where, ";"]) of
- {updated, 1} ->
- ok;
- _ ->
- ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
- end.
diff --git a/src/mod_irc/mod_irc_odbc.erl b/src/mod_irc/mod_irc_odbc.erl
index ade98caff..ab0fafe14 100644
--- a/src/mod_irc/mod_irc_odbc.erl
+++ b/src/mod_irc/mod_irc_odbc.erl
@@ -34,7 +34,6 @@
-export([start_link/2,
start/2,
stop/1,
- encode_data/1,
closed_connection/3,
get_connection_params/3]).
@@ -549,7 +548,7 @@ get_form(ServerHost, Host, From, [], Lang) ->
["select data from irc_custom where "
"jid='", SJID, "' and host='", SHost, "';"]) of
{selected, ["data"], [{SData}]} ->
- Data = decode_data(SData),
+ Data = ejabberd_odbc:decode_term(SData),
{xml:get_attr_s(username, Data),
xml:get_attr_s(connections_params, Data)};
{'EXIT', _} ->
@@ -647,7 +646,7 @@ set_form(ServerHost, Host, From, [], _Lang, XData) ->
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, ConnectionsParams} ->
- SData = encode_data(
+ SData = ejabberd_odbc:encode_term(
[{username,
Username},
{connections_params,
@@ -655,12 +654,13 @@ set_form(ServerHost, Host, From, [], _Lang, XData) ->
case ejabberd_odbc:sql_transaction(
LServer,
fun() ->
- update_t("irc_custom",
- ["jid", "host", "data"],
- [SJID, SHost, SData],
- ["jid='", SJID,
- "' and host='",
- SHost, "'"]),
+ odbc_queries:update_t(
+ "irc_custom",
+ ["jid", "host", "data"],
+ [SJID, SHost, SData],
+ ["jid='", SJID,
+ "' and host='",
+ SHost, "'"]),
ok
end) of
{atomic, _} ->
@@ -715,7 +715,7 @@ get_connection_params(Host, ServerHost, From, IRCServer) ->
{selected, ["data"], []} ->
{User, DefaultEncoding, ?DEFAULT_IRC_PORT, ""};
{selected, ["data"], [{SData}]} ->
- Data = decode_data(SData),
+ Data = ejabberd_odbc:decode_term(SData),
Username = xml:get_attr_s(username, Data),
{NewUsername, NewEncoding, NewPort, NewPassword} =
case lists:keysearch(
@@ -844,7 +844,7 @@ adhoc_register(ServerHost, From, To, #adhoc_request{lang = Lang,
Username = User,
ConnectionsParams = [];
{selected, ["data"], [{Data1}]} ->
- Data = decode_data(Data1),
+ Data = ejabberd_odbc:decode_term(Data1),
Username = xml:get_attr_s(username, Data),
ConnectionsParams = xml:get_attr_s(connections_params, Data)
end,
@@ -870,16 +870,18 @@ adhoc_register(ServerHost, From, To, #adhoc_request{lang = Lang,
if Error /= false ->
Error;
Action == "complete" ->
- SData = encode_data([{username, Username},
- {connections_params, ConnectionsParams}]),
+ SData = ejabberd_odbc:encode_term(
+ [{username, Username},
+ {connections_params, ConnectionsParams}]),
case catch ejabberd_odbc:sql_transaction(
LServer,
fun() ->
- update_t("irc_custom",
- ["jid", "host", "data"],
- [SJID, SHost, SData],
- ["jid='", SJID,
- "' and host='", SHost, "'"]),
+ odbc_queries:update_t(
+ "irc_custom",
+ ["jid", "host", "data"],
+ [SJID, SHost, SData],
+ ["jid='", SJID,
+ "' and host='", SHost, "'"]),
ok
end) of
{atomic, ok} ->
@@ -1029,35 +1031,3 @@ parse_connections_params([{ServerN, Server} | Servers], Encodings, Ports, Passwo
{NewPort, NewPorts} = retrieve_connections_params(Ports, ServerN),
{NewPassword, NewPasswords} = retrieve_connections_params(Passwords, ServerN),
[{Server, NewEncoding, NewPort, NewPassword} | parse_connections_params(Servers, NewEncodings, NewPorts, NewPasswords)].
-
-encode_data(Data) ->
- ejabberd_odbc:escape(erl_prettypr:format(erl_syntax:abstract(Data))).
-
-decode_data(Str) ->
- {ok, Tokens, _} = erl_scan:string(Str ++ "."),
- {ok, Data} = erl_parse:parse_term(Tokens),
- Data.
-
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
-%% 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 ",
- join(UPairs, ", "),
- " where ", Where, ";"]) of
- {updated, 1} ->
- ok;
- _ ->
- ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
- end.
diff --git a/src/mod_muc/mod_muc_odbc.erl b/src/mod_muc/mod_muc_odbc.erl
index 318b8a70b..47dc4c9ef 100644
--- a/src/mod_muc/mod_muc_odbc.erl
+++ b/src/mod_muc/mod_muc_odbc.erl
@@ -41,8 +41,6 @@
create_room/5,
process_iq_disco_items/4,
broadcast_service_message/2,
- encode_opts/1,
- decode_opts/1,
can_use_nick/4]).
%% gen_server callbacks
@@ -115,11 +113,12 @@ store_room(ServerHost, Host, Name, Opts) ->
SName = ejabberd_odbc:escape(Name),
SHost = ejabberd_odbc:escape(Host),
LServer = jlib:nameprep(ServerHost),
+ SOpts = ejabberd_odbc:encode_term(Opts),
F = fun() ->
- update_t(
+ odbc_queries:update_t(
"muc_room",
["name", "host", "opts"],
- [SName, SHost, encode_opts(Opts)],
+ [SName, SHost, SOpts],
["name='", SName, "' and host='", SHost, "'"])
end,
ejabberd_odbc:sql_transaction(LServer, F).
@@ -132,7 +131,7 @@ restore_room(ServerHost, Host, Name) ->
LServer, ["select opts from muc_room where name='",
SName, "' and host='", SHost, "';"]) of
{selected, ["opts"], [{Opts}]} ->
- decode_opts(Opts);
+ ejabberd_odbc:decode_term(Opts);
_ ->
error
end.
@@ -549,7 +548,7 @@ load_permanent_rooms(Host, ServerHost, Access, HistorySize, RoomShaper) ->
Room,
HistorySize,
RoomShaper,
- decode_opts(Opts),
+ ejabberd_odbc:decode_term(Opts),
?MODULE),
register_room(Host, Room, Pid);
_ ->
@@ -577,7 +576,8 @@ start_new_room(Host, ServerHost, Access, Room,
?DEBUG("MUC: restore room '~s'~n", [Room]),
mod_muc_room:start(Host, ServerHost, Access,
Room, HistorySize,
- RoomShaper, decode_opts(Opts), ?MODULE)
+ RoomShaper, ejabberd_odbc:decode_term(Opts),
+ ?MODULE)
end.
register_room(Host, Room, Pid) ->
@@ -766,7 +766,7 @@ iq_set_register_info(ServerHost, Host, From, Nick, Lang) ->
true
end,
if Allow ->
- update_t(
+ odbc_queries:update_t(
"muc_registered",
["jid", "host", "nick"],
[SJID, SHost, SNick],
@@ -873,35 +873,3 @@ clean_table_from_bad_node(Node, Host) ->
end, Es)
end,
mnesia:async_dirty(F).
-
-encode_opts(Opts) ->
- ejabberd_odbc:escape(erl_prettypr:format(erl_syntax:abstract(Opts))).
-
-decode_opts(Str) ->
- {ok, Tokens, _} = erl_scan:string(Str ++ "."),
- {ok, Opts} = erl_parse:parse_term(Tokens),
- Opts.
-
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
-%% 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 ",
- join(UPairs, ", "),
- " where ", Where, ";"]) of
- {updated, 1} ->
- ok;
- _ ->
- ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
- end.
diff --git a/src/mod_shared_roster_odbc.erl b/src/mod_shared_roster_odbc.erl
index 8bccc980c..570e50947 100644
--- a/src/mod_shared_roster_odbc.erl
+++ b/src/mod_shared_roster_odbc.erl
@@ -52,7 +52,6 @@
get_group_explicit_users/2,
is_user_in_group/3,
add_user_to_group/3,
- encode_opts/1,
remove_user_from_group/3]).
-include("ejabberd.hrl").
@@ -403,7 +402,7 @@ groups_with_opts(Host) ->
case ejabberd_odbc:sql_query(
Host, ["select name, opts from sr_group;"]) of
{selected, ["name", "opts"], Rs} ->
- [{G, decode_opts(Opts)} || {G, Opts} <- Rs];
+ [{G, ejabberd_odbc:decode_term(Opts)} || {G, Opts} <- Rs];
_ ->
[]
end.
@@ -413,12 +412,12 @@ create_group(Host, Group) ->
create_group(Host, Group, Opts) ->
SGroup = ejabberd_odbc:escape(Group),
- SOpts = encode_opts(Opts),
+ SOpts = ejabberd_odbc:encode_term(Opts),
F = fun() ->
- update_t("sr_group",
- ["name", "opts"],
- [SGroup, SOpts],
- ["name='", SGroup, "'"])
+ odbc_queries:update_t("sr_group",
+ ["name", "opts"],
+ [SGroup, SOpts],
+ ["name='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F).
@@ -438,19 +437,19 @@ get_group_opts(Host, Group) ->
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
- decode_opts(SOpts);
+ ejabberd_odbc:decode_term(SOpts);
_ ->
error
end.
set_group_opts(Host, Group, Opts) ->
SGroup = ejabberd_odbc:escape(Group),
- SOpts = encode_opts(Opts),
+ SOpts = ejabberd_odbc:encode_term(Opts),
F = fun() ->
- update_t("sr_group",
- ["name", "opts"],
- [SGroup, SOpts],
- ["name='", SGroup, "'"])
+ odbc_queries:update_t("sr_group",
+ ["name", "opts"],
+ [SGroup, SOpts],
+ ["name='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F).
@@ -473,7 +472,7 @@ is_group_enabled(Host1, Group1) ->
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
- Opts = decode_opts(SOpts),
+ Opts = ejabberd_odbc:decode_term(SOpts),
not lists:member(disabled, Opts);
_ ->
false
@@ -486,7 +485,7 @@ get_group_opt(Host, Group, Opt, Default) ->
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
- Opts = decode_opts(SOpts),
+ Opts = ejabberd_odbc:decode_term(SOpts),
case lists:keysearch(Opt, 1, Opts) of
{value, {_, Val}} ->
Val;
@@ -659,10 +658,11 @@ add_user_to_group(Host, US, Group) ->
SJID = make_jid_s(US),
SGroup = ejabberd_odbc:escape(Group),
F = fun() ->
- update_t("sr_user",
- ["jid", "grp"],
- [SJID, SGroup],
- ["jid='", SJID, "' and grp='", SGroup, "'"])
+ odbc_queries:update_t(
+ "sr_user",
+ ["jid", "grp"],
+ [SJID, SGroup],
+ ["jid='", SJID, "' and grp='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F)
end.
@@ -1163,35 +1163,3 @@ make_jid_s(U, S) ->
make_jid_s({U, S}) ->
make_jid_s(U, S).
-
-encode_opts(Opts) ->
- ejabberd_odbc:escape(erl_prettypr:format(erl_syntax:abstract(Opts))).
-
-decode_opts(Str) ->
- {ok, Tokens, _} = erl_scan:string(Str ++ "."),
- {ok, Opts} = erl_parse:parse_term(Tokens),
- Opts.
-
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
-%% 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 ",
- join(UPairs, ", "),
- " where ", Where, ";"]) of
- {updated, 1} ->
- ok;
- _ ->
- ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
- end.
diff --git a/src/mod_vcard_xupdate_odbc.erl b/src/mod_vcard_xupdate_odbc.erl
index c3d87a70b..b93563dd8 100644
--- a/src/mod_vcard_xupdate_odbc.erl
+++ b/src/mod_vcard_xupdate_odbc.erl
@@ -75,8 +75,8 @@ add_xupdate(LUser, LServer, Hash) ->
Username = ejabberd_odbc:escape(LUser),
SHash = ejabberd_odbc:escape(Hash),
F = fun() ->
- update_t(
- ["vcard_xupdate"],
+ odbc_queries:update_t(
+ "vcard_xupdate",
["username", "hash"],
[Username, SHash],
["username='", Username, "'"])
@@ -131,27 +131,3 @@ build_xphotoel(User, Host) ->
end,
PhotoEl = [{xmlelement, "photo", [], PhotoSubEls}],
{xmlelement, "x", [{"xmlns", ?NS_VCARD_UPDATE}], PhotoEl}.
-
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
-%% 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 ",
- join(UPairs, ", "),
- " where ", Where, ";"]) of
- {updated, 1} ->
- ok;
- _ ->
- ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
- end.
diff --git a/src/odbc/ejabberd_odbc.erl b/src/odbc/ejabberd_odbc.erl
index 8227dfcb6..6ac5414ba 100644
--- a/src/odbc/ejabberd_odbc.erl
+++ b/src/odbc/ejabberd_odbc.erl
@@ -40,6 +40,8 @@
escape/1,
escape_like/1,
to_bool/1,
+ encode_term/1,
+ decode_term/1,
keep_alive/1]).
%% gen_fsm callbacks
@@ -169,6 +171,14 @@ to_bool(true) -> true;
to_bool(1) -> true;
to_bool(_) -> false.
+encode_term(Term) ->
+ escape(erl_prettypr:format(erl_syntax:abstract(Term))).
+
+decode_term(Str) ->
+ {ok, Tokens, _} = erl_scan:string(Str ++ "."),
+ {ok, Term} = erl_parse:parse_term(Tokens),
+ Term.
+
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
%%%----------------------------------------------------------------------
diff --git a/src/odbc/odbc_queries.erl b/src/odbc/odbc_queries.erl
index e831d166c..2af5f2ba6 100644
--- a/src/odbc/odbc_queries.erl
+++ b/src/odbc/odbc_queries.erl
@@ -28,6 +28,7 @@
-author("mremond@process-one.net").
-export([get_db_type/0,
+ update_t/4,
sql_transaction/2,
get_last/2,
set_last_t/4,