summaryrefslogtreecommitdiff
path: root/src/ejabberd_sm_sql.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2016-05-04 21:01:05 +0300
committerAlexey Shchepin <alexey@process-one.net>2016-05-05 15:51:58 +0300
commit0ea0ba3004282636c95bc86c3aac8755fcf7f8b1 (patch)
tree1330b6db70f7f6100c1997851faece5ad569391f /src/ejabberd_sm_sql.erl
parentMerge remote-tracking branch 'processone/pr/1088' (diff)
Update more SQL queries
Diffstat (limited to '')
-rw-r--r--src/ejabberd_sm_sql.erl80
1 files changed, 41 insertions, 39 deletions
diff --git a/src/ejabberd_sm_sql.erl b/src/ejabberd_sm_sql.erl
index 3d4e224d..8871bbca 100644
--- a/src/ejabberd_sm_sql.erl
+++ b/src/ejabberd_sm_sql.erl
@@ -8,6 +8,8 @@
%%%-------------------------------------------------------------------
-module(ejabberd_sm_sql).
+-compile([{parse_transform, ejabberd_sql_pt}]).
+
-behaviour(ejabberd_sm).
%% API
@@ -23,18 +25,19 @@
-include("ejabberd_sm.hrl").
-include("logger.hrl").
-include("jlib.hrl").
+-include("ejabberd_sql_pt.hrl").
%%%===================================================================
%%% API
%%%===================================================================
-spec init() -> ok | {error, any()}.
init() ->
- Node = ejabberd_sql:escape(jlib:atom_to_binary(node())),
+ Node = jlib:atom_to_binary(node()),
?INFO_MSG("Cleaning SQL SM table...", []),
lists:foldl(
fun(Host, ok) ->
case ejabberd_sql:sql_query(
- Host, [<<"delete from sm where node='">>, Node, <<"'">>]) of
+ Host, ?SQL("delete from sm where node=%(Node)s")) of
{updated, _} ->
ok;
Err ->
@@ -47,20 +50,19 @@ init() ->
set_session(#session{sid = {Now, Pid}, usr = {U, LServer, R},
priority = Priority, info = Info}) ->
- Username = ejabberd_sql:escape(U),
- Resource = ejabberd_sql:escape(R),
- InfoS = ejabberd_sql:encode_term(Info),
+ InfoS = jlib:term_to_expr(Info),
PrioS = enc_priority(Priority),
TS = now_to_timestamp(Now),
PidS = list_to_binary(erlang:pid_to_list(Pid)),
- Node = ejabberd_sql:escape(jlib:atom_to_binary(node(Pid))),
- case sql_queries:update(
- LServer,
- <<"sm">>,
- [<<"usec">>, <<"pid">>, <<"node">>, <<"username">>,
- <<"resource">>, <<"priority">>, <<"info">>],
- [TS, PidS, Node, Username, Resource, PrioS, InfoS],
- [<<"usec='">>, TS, <<"' and pid='">>, PidS, <<"'">>]) of
+ Node = jlib:atom_to_binary(node(Pid)),
+ case ?SQL_UPSERT(LServer, "sm",
+ ["!usec=%(TS)d",
+ "!pid=%(PidS)s",
+ "node=%(Node)s",
+ "username=%(U)s",
+ "resource=%(R)s",
+ "priority=%(PrioS)s",
+ "info=%(InfoS)s"]) of
ok ->
ok;
Err ->
@@ -72,14 +74,16 @@ delete_session(_LUser, LServer, _LResource, {Now, Pid}) ->
PidS = list_to_binary(erlang:pid_to_list(Pid)),
case ejabberd_sql:sql_query(
LServer,
- [<<"select usec, pid, username, resource, priority, info ">>,
- <<"from sm where usec='">>, TS, <<"' and pid='">>,PidS, <<"'">>]) of
- {selected, _, [Row]} ->
- ejabberd_sql:sql_query(
- LServer, [<<"delete from sm where usec='">>,
- TS, <<"' and pid='">>, PidS, <<"'">>]),
+ ?SQL("select @(usec)d, @(pid)s, @(username)s,"
+ " @(resource)s, @(priority)s, @(info)s "
+ "from sm where usec=%(TS)d and pid=%(PidS)s")) of
+ {selected, [Row]} ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("delete from sm"
+ " where usec=%(TS)d and pid=%(PidS)s")),
{ok, row_to_session(LServer, Row)};
- {selected, _, []} ->
+ {selected, []} ->
{error, notfound};
Err ->
?ERROR_MSG("failed to delete from 'sm' table: ~p", [Err]),
@@ -94,9 +98,10 @@ get_sessions() ->
get_sessions(LServer) ->
case ejabberd_sql:sql_query(
- LServer, [<<"select usec, pid, username, ">>,
- <<"resource, priority, info from sm">>]) of
- {selected, _, Rows} ->
+ LServer,
+ ?SQL("select @(usec)d, @(pid)s, @(username)s,"
+ " @(resource)s, @(priority)s, @(info)s from sm")) of
+ {selected, Rows} ->
[row_to_session(LServer, Row) || Row <- Rows];
Err ->
?ERROR_MSG("failed to select from 'sm' table: ~p", [Err]),
@@ -104,12 +109,12 @@ get_sessions(LServer) ->
end.
get_sessions(LUser, LServer) ->
- Username = ejabberd_sql:escape(LUser),
case ejabberd_sql:sql_query(
- LServer, [<<"select usec, pid, username, ">>,
- <<"resource, priority, info from sm where ">>,
- <<"username='">>, Username, <<"'">>]) of
- {selected, _, Rows} ->
+ LServer,
+ ?SQL("select @(usec)d, @(pid)s, @(username)s,"
+ " @(resource)s, @(priority)s, @(info)s from sm"
+ " where username=%(LUser)s")) of
+ {selected, Rows} ->
[row_to_session(LServer, Row) || Row <- Rows];
Err ->
?ERROR_MSG("failed to select from 'sm' table: ~p", [Err]),
@@ -117,14 +122,12 @@ get_sessions(LUser, LServer) ->
end.
get_sessions(LUser, LServer, LResource) ->
- Username = ejabberd_sql:escape(LUser),
- Resource = ejabberd_sql:escape(LResource),
case ejabberd_sql:sql_query(
- LServer, [<<"select usec, pid, username, ">>,
- <<"resource, priority, info from sm where ">>,
- <<"username='">>, Username, <<"' and resource='">>,
- Resource, <<"'">>]) of
- {selected, _, Rows} ->
+ LServer,
+ ?SQL("select @(usec)d, @(pid)s, @(username)s,"
+ " @(resource)s, @(priority)s, @(info)s from sm"
+ " where username=%(LUser)s and resource=%(LResource)s")) of
+ {selected, Rows} ->
[row_to_session(LServer, Row) || Row <- Rows];
Err ->
?ERROR_MSG("failed to select from 'sm' table: ~p", [Err]),
@@ -135,10 +138,9 @@ get_sessions(LUser, LServer, LResource) ->
%%% Internal functions
%%%===================================================================
now_to_timestamp({MSec, Sec, USec}) ->
- jlib:integer_to_binary((MSec * 1000000 + Sec) * 1000000 + USec).
+ (MSec * 1000000 + Sec) * 1000000 + USec.
-timestamp_to_now(TS) ->
- I = jlib:binary_to_integer(TS),
+timestamp_to_now(I) ->
Head = I div 1000000,
USec = I rem 1000000,
MSec = Head div 1000000,
@@ -158,7 +160,7 @@ enc_priority(undefined) ->
enc_priority(Int) when is_integer(Int) ->
jlib:integer_to_binary(Int).
-row_to_session(LServer, [USec, PidS, User, Resource, PrioS, InfoS]) ->
+row_to_session(LServer, {USec, PidS, User, Resource, PrioS, InfoS}) ->
Now = timestamp_to_now(USec),
Pid = erlang:list_to_pid(binary_to_list(PidS)),
Priority = dec_priority(PrioS),