diff options
author | Alexey Shchepin <alexey@process-one.net> | 2016-05-04 21:01:05 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2016-05-05 15:51:58 +0300 |
commit | 0ea0ba3004282636c95bc86c3aac8755fcf7f8b1 (patch) | |
tree | 1330b6db70f7f6100c1997851faece5ad569391f /src/ejabberd_sm_sql.erl | |
parent | Merge remote-tracking branch 'processone/pr/1088' (diff) |
Update more SQL queries
Diffstat (limited to '')
-rw-r--r-- | src/ejabberd_sm_sql.erl | 80 |
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), |