Skip to content

Commit

Permalink
Merge pull request #2928 from esl/mu-prepared-queries-for-mod_private
Browse files Browse the repository at this point in the history
Prepared queries for mod_private
  • Loading branch information
chrzaszcz committed Nov 3, 2020
2 parents 3550cad + a9179bd commit cad5723
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 146 deletions.
4 changes: 2 additions & 2 deletions big_tests/test.config
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@
{mod_privacy, "[modules.mod_privacy]
backend = \"rdbms\""},
{mod_private, "[modules.mod_private]
backend = \"mysql\""},
backend = \"rdbms\""},
{mod_offline, "[modules.mod_offline]
backend = \"rdbms\""},
{mod_vcard, "[modules.mod_vcard]
Expand Down Expand Up @@ -447,7 +447,7 @@
]}."},
{mod_last, "{mod_last, [{backend, rdbms}]},"},
{mod_privacy, "{mod_privacy, [{backend, rdbms}]},"},
{mod_private, "{mod_private, [{backend, mysql}]},"},
{mod_private, "{mod_private, [{backend, rdbms}]},"},
{mod_offline, "{mod_offline, [{backend, rdbms}]},"},
{mod_vcard, "{mod_vcard, [{backend, rdbms}, {host, \"vjud.@HOST@\"}]},"},
{mod_roster, "{mod_roster, [{backend, rdbms}]},"}]},
Expand Down
3 changes: 1 addition & 2 deletions doc/modules/mod_private.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@ Strategy to handle incoming stanzas. For details, please refer to
[IQ processing policies](../../advanced-configuration/Modules/#iq-processing-policies).

#### `modules.mod_private.backend`
* **Syntax:** string, one of `"mnesia"`, `"rdbms"`, `"riak"`, `"mysql"`.
* **Syntax:** string, one of `"mnesia"`, `"rdbms"`, `"riak"`.
* **Default:** "mnesia"
* **Example:** `backend = "mnesia"`

Database backend to use.
`mysql` uses MySQL-specific queries so in some cases it is more efficient than generic `rdbms`.

**CAUTION:** Riak KV backend doesn't support transactions (rollbacks), so please avoid inserting
more than one value in a single set request, otherwise you may end up with partially saved data.
Expand Down
62 changes: 0 additions & 62 deletions src/mod_private_mysql.erl

This file was deleted.

50 changes: 33 additions & 17 deletions src/mod_private_rdbms.erl
Original file line number Diff line number Diff line change
Expand Up @@ -40,47 +40,63 @@
-include("mongoose.hrl").
-include("jlib.hrl").

init(_Host, _Opts) ->
init(Host, _Opts) ->
mongoose_rdbms:prepare(private_select_data, private_storage,
[username, namespace],
<<"SELECT data FROM private_storage WHERE username=? AND namespace=?">>),
mongoose_rdbms:prepare(private_select_namespaces, private_storage,
[username],
<<"SELECT namespace FROM private_storage WHERE username=?">>),
mongoose_rdbms:prepare(private_remove_user, private_storage,
[username],
<<"DELETE FROM private_storage WHERE username=?">>),
rdbms_queries:prepare_upsert(Host, private_upsert, private_storage,
[<<"username">>, <<"namespace">>, <<"data">>],
[<<"data">>],
[<<"username">>, <<"namespace">>]),
ok.

multi_set_data(LUser, LServer, NS2XML) ->
F = fun() -> multi_set_data_t(LUser, LServer, NS2XML) end,
NS2BinXML = make_xml_binary(NS2XML),
F = fun() -> multi_set_data_t(LUser, LServer, NS2BinXML) end,
case rdbms_queries:sql_transaction(LServer, F) of
{atomic, ok} -> ok;
{aborted, Reason} -> {aborted, Reason};
{error, Reason} -> {error, Reason}
end.


multi_set_data_t(LUser, LServer, NS2XML) ->
SLUser = mongoose_rdbms:escape_string(LUser),
[set_data_t(SLUser, LServer, NS, XML) || {NS, XML} <- NS2XML],
[upsert_data_t(LUser, LServer, NS, XML) || {NS, XML} <- NS2XML],
ok.

set_data_t(SLUser, LServer, NS, XML) ->
SNS = mongoose_rdbms:escape_string(NS),
SData = mongoose_rdbms:escape_string(exml:to_binary(XML)),
rdbms_queries:set_private_data(LServer, SLUser, SNS, SData).
upsert_data_t(LUser, Host, NS, XML) ->
InsertParams = [LUser, NS, XML],
UpdateParams = [XML],
UniqueKeyValues = [LUser, NS],
rdbms_queries:execute_upsert(Host, private_upsert, InsertParams, UpdateParams, UniqueKeyValues).


make_xml_binary(NS2XML) ->
[{NS, exml:to_binary(XML)} || {NS, XML} <- NS2XML].

multi_get_data(LUser, LServer, NS2Def) ->
[get_data(LUser, LServer, NS, Default) || {NS, Default} <- NS2Def].

%% @doc Return stored value or default.
get_data(LUser, LServer, NS, Default) ->
SLUser = mongoose_rdbms:escape_string(LUser),
SNS = mongoose_rdbms:escape_string(NS),
case catch rdbms_queries:get_private_data(LServer, SLUser, SNS) of
{selected, [{SData}]} ->
{ok, Elem} = exml:parse(SData),
Res = mongoose_rdbms:execute(LServer, private_select_data, [LUser, NS]),
case Res of
{selected, [{BinData}]} ->
{ok, Elem} = exml:parse(BinData),
Elem;
_ ->
Default
end.

get_all_nss(LUser, LServer) ->
EscLUser = mongoose_rdbms:escape_string(LUser),
{selected, Res} = rdbms_queries:get_all_private_namespaces(LServer, EscLUser),
{selected, Res} = mongoose_rdbms:execute(LServer, private_select_namespaces, [LUser]),
lists:map(fun({R}) -> R end, Res).

remove_user(LUser, LServer) ->
SLUser = mongoose_rdbms:escape_string(LUser),
rdbms_queries:del_user_private_storage(LServer, SLUser).
mongoose_rdbms:execute(LServer, private_remove_user, [LUser]).
2 changes: 1 addition & 1 deletion src/rdbms/mongoose_rdbms_pgsql.erl
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ prepare(Connection, Name, _Table, _Fields, Statement) ->
BinName = [atom_to_binary(Name, latin1)],
ReplacedStatement = replace_question_marks(Statement),
case epgsql:parse(Connection, BinName, ReplacedStatement, []) of
{ok, _} -> {ok, BinName};
{ok, _} -> epgsql:describe(Connection, statement, BinName);
Error -> Error
end.

Expand Down
62 changes: 0 additions & 62 deletions src/rdbms/rdbms_queries.erl
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,6 @@
roster_subscribe/4,
get_subscription/3,
get_subscription_t/3,
set_private_data/4,
set_private_data_sql/3,
get_all_private_namespaces/2,
get_private_data/3,
multi_get_private_data/3,
multi_set_private_data/3,
del_user_private_storage/2,
get_default_privacy_list/2,
get_default_privacy_list_t/1,
count_privacy_lists/1,
Expand Down Expand Up @@ -626,61 +619,6 @@ get_subscription(LServer, Username, SJID) ->
get_subscription_t(_LServer, Username, SJID) ->
mongoose_rdbms:sql_query_t(q_get_subscription(Username, SJID)).

set_private_data(_LServer, Username, LXMLNS, SData) ->
update_t(<<"private_storage">>,
[<<"username">>, <<"namespace">>, <<"data">>],
[Username, LXMLNS, SData],
[<<"username=">>, mongoose_rdbms:use_escaped_string(Username),
<<" and namespace=">>, mongoose_rdbms:use_escaped_string(LXMLNS)]).

set_private_data_sql(Username, LXMLNS, SData) ->
[[<<"delete from private_storage "
"where username=">>, mongoose_rdbms:use_escaped_string(Username), <<" and "
"namespace=">>, mongoose_rdbms:use_escaped_string(LXMLNS), ";"],
[<<"insert into private_storage(username, namespace, data) "
"values (">>, mongoose_rdbms:use_escaped_string(Username), ", ",
mongoose_rdbms:use_escaped_string(LXMLNS), ", ",
mongoose_rdbms:use_escaped_string(SData), ");"]].

get_all_private_namespaces(LServer, Username) ->
mongoose_rdbms:sql_query(
LServer,
[<<"select namespace from private_storage where username=">>,
mongoose_rdbms:use_escaped_string(Username), " ;"]).

get_private_data(LServer, Username, LXMLNS) ->
mongoose_rdbms:sql_query(
LServer,
[<<"select data from private_storage "
"where username=">>, mongoose_rdbms:use_escaped_string(Username), <<" and "
"namespace=">>, mongoose_rdbms:use_escaped_string(LXMLNS)]).

multi_get_private_data(LServer, Username, LXMLNSs) when length(LXMLNSs) > 0 ->
mongoose_rdbms:sql_query(
LServer,
[<<"select namespace, data from private_storage "
"where username=">>, mongoose_rdbms:use_escaped_string(Username), <<" and "
"namespace IN (">>, join_escaped(LXMLNSs), ");"]).

%% set_private_data for multiple queries using MySQL's specific syntax.
multi_set_private_data(LServer, Username, SNS2XML) when length(SNS2XML) > 0 ->
Rows = [private_data_row(Username, NS, Data) || {NS, Data} <- SNS2XML],
mongoose_rdbms:sql_query(
LServer,
[<<"replace into private_storage (username, namespace, data) "
"values ">>, join(Rows, ", ")]).

private_data_row(Username, NS, Data) ->
[<<"(">>, mongoose_rdbms:use_escaped_string(Username),
<<", ">>, mongoose_rdbms:use_escaped_string(NS),
<<", ">>, mongoose_rdbms:use_escaped_string(Data), <<")">>].

del_user_private_storage(LServer, Username) ->
mongoose_rdbms:sql_query(
LServer,
[<<"delete from private_storage where username=">>,
mongoose_rdbms:use_escaped_string(Username)]).

set_vcard(LServer,
SLServer, SLUsername,
SBDay, SCTRY, SEMail, SFN, SFamily, SGiven,
Expand Down

0 comments on commit cad5723

Please sign in to comment.