aboutsummaryrefslogtreecommitdiff
path: root/src/node_pep_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_pep_sql.erl')
-rw-r--r--src/node_pep_sql.erl145
1 files changed, 73 insertions, 72 deletions
diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl
index ec7795475..6c1e642b2 100644
--- a/src/node_pep_sql.erl
+++ b/src/node_pep_sql.erl
@@ -5,7 +5,7 @@
%%% Created : 1 Dec 2007 by Christophe Romain <christophe.romain@process-one.net>
%%%
%%%
-%%% ejabberd, Copyright (C) 2002-2016 ProcessOne
+%%% ejabberd, Copyright (C) 2002-2019 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -30,9 +30,9 @@
-behaviour(gen_pubsub_node).
-author('christophe.romain@process-one.net').
+
-include("pubsub.hrl").
--include("jlib.hrl").
--include("logger.hrl").
+-include("ejabberd_sql_pt.hrl").
-export([init/3, terminate/2, options/0, features/0,
create_node_permission/6, create_node/2, delete_node/1,
@@ -46,7 +46,8 @@
set_state/1, get_items/7, get_items/3, get_item/7,
get_item/2, set_item/1, get_item_name/3, node_to_path/1,
path_to_node/1, depends/3,
- get_entity_subscriptions_for_send_last/2, get_last_items/3]).
+ get_entity_subscriptions_for_send_last/2, get_last_items/3,
+ get_only_item/2]).
depends(_Host, _ServerHost, _Opts) ->
[{mod_caps, hard}].
@@ -73,8 +74,7 @@ create_node(Nidx, Owner) ->
{result, {default, broadcast}}.
delete_node(Nodes) ->
- {result, {_, _, Result}} = node_flat_sql:delete_node(Nodes),
- {result, {[], Result}}.
+ node_flat_sql:delete_node(Nodes).
subscribe_node(Nidx, Sender, Subscriber, AccessModel,
SendLast, PresenceSubscription, RosterGroup, Options) ->
@@ -117,78 +117,76 @@ set_affiliation(Nidx, Owner, Affiliation) ->
get_entity_subscriptions(_Host, Owner) ->
SubKey = jid:tolower(Owner),
GenKey = jid:remove_resource(SubKey),
- HostLike = node_flat_sql:encode_host_like(element(2, SubKey)),
- SJ = ejabberd_sql:escape(node_flat_sql:encode_jid(SubKey)),
- GJ = ejabberd_sql:escape(node_flat_sql:encode_jid(GenKey)),
- GJLike = ejabberd_sql:escape(node_flat_sql:encode_jid_like(GenKey)),
+ HLike = <<"%@", (node_flat_sql:encode_host_like(element(2, SubKey)))/binary>>,
+ GJ = node_flat_sql:encode_jid(GenKey),
Query = case SubKey of
- GenKey ->
- [<<"select host, node, type, i.nodeid, jid, "
- "subscriptions from pubsub_state i, pubsub_node n "
- "where i.nodeid = n.nodeid and jid "
- "like '">>, GJLike, <<"%' escape '^' and host like '%@">>, HostLike, <<"' escape '^';">>];
- _ ->
- [<<"select host, node, type, i.nodeid, jid, "
- "subscriptions from pubsub_state i, pubsub_node n "
- "where i.nodeid = n.nodeid and jid "
- "in ('">>, SJ, <<"', '">>, GJ, <<"') and host like '%@">>, HostLike, <<"' escape '^';">>]
- end,
- Reply = case catch ejabberd_sql:sql_query_t(Query) of
- {selected,
- [<<"host">>, <<"node">>, <<"type">>, <<"nodeid">>, <<"jid">>, <<"subscriptions">>],
- RItems} ->
- lists:map(fun ([H, N, T, I, J, S]) ->
- O = node_flat_sql:decode_jid(H),
- Node = nodetree_tree_sql:raw_to_node(O, [N, <<"">>, T, I]),
- {Node,
- node_flat_sql:decode_subscriptions(S),
- node_flat_sql:decode_jid(J)}
- end,
- RItems);
- _ ->
- []
- end,
- {result, Reply}.
+ GenKey ->
+ GJLike = <<(node_flat_sql:encode_jid_like(GenKey))/binary, "/%">>,
+ ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s "
+ "from pubsub_state i, pubsub_node n "
+ "where i.nodeid = n.nodeid and "
+ "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host like %(HLike)s escape '^'");
+ _ ->
+ SJ = node_flat_sql:encode_jid(SubKey),
+ ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s "
+ "from pubsub_state i, pubsub_node n "
+ "where i.nodeid = n.nodeid and "
+ "jid in (%(SJ)s,%(GJ)s) and host like %(HLike)s escape '^'")
+ end,
+ {result,
+ case ejabberd_sql:sql_query_t(Query) of
+ {selected, RItems} ->
+ lists:foldl(
+ fun({H, N, T, I, J, S}, Acc) ->
+ O = node_flat_sql:decode_jid(H),
+ Node = nodetree_tree_sql:raw_to_node(O, {N, <<"">>, T, I}),
+ Jid = node_flat_sql:decode_jid(J),
+ lists:foldl(
+ fun({Sub, SubId}, Acc2) ->
+ [{Node, Sub, SubId, Jid} | Acc2]
+ end, Acc, node_flat_sql:decode_subscriptions(S))
+ end, [], RItems);
+ _ ->
+ []
+ end}.
get_entity_subscriptions_for_send_last(_Host, Owner) ->
SubKey = jid:tolower(Owner),
GenKey = jid:remove_resource(SubKey),
- HostLike = node_flat_sql:encode_host_like(element(2, SubKey)),
- SJ = ejabberd_sql:escape(node_flat_sql:encode_jid(SubKey)),
- GJ = ejabberd_sql:escape(node_flat_sql:encode_jid(GenKey)),
- GJLike = ejabberd_sql:escape(node_flat_sql:encode_jid_like(GenKey)),
+ HLike = <<"%@", (node_flat_sql:encode_host_like(element(2, SubKey)))/binary>>,
+ GJ = node_flat_sql:encode_jid(GenKey),
Query = case SubKey of
- GenKey ->
- [<<"select host, node, type, i.nodeid, jid, "
- "subscriptions from pubsub_state i, pubsub_node n, "
- "pubsub_node_option o where i.nodeid = n.nodeid "
- "and n.nodeid = o.nodeid and name='send_last_published_item' and "
- "val='on_sub_and_presence' and jid like '">>,
- GJLike, <<"%' escape '^' and host like '%@">>, HostLike, <<"' escape '^';">>];
- _ ->
- [<<"select host, node, type, i.nodeid, jid, "
- "subscriptions from pubsub_state i, pubsub_node n, "
- "pubsub_node_option o where i.nodeid = n.nodeid "
- "and n.nodeid = o.nodeid and name='send_last_published_item' and "
- "val='on_sub_and_presence' and jid in ",
- "('">>, SJ, <<"', '">>, GJ, <<"') and host like '%@">>, HostLike, <<"' escape '^';">>]
- end,
- Reply = case catch ejabberd_sql:sql_query_t(Query) of
- {selected,
- [<<"host">>, <<"node">>, <<"type">>, <<"nodeid">>, <<"jid">>, <<"subscriptions">>],
- RItems} ->
- lists:map(fun ([H, N, T, I, J, S]) ->
- O = node_flat_sql:decode_jid(H),
- Node = nodetree_tree_sql:raw_to_node(O, [N, <<"">>, T, I]),
- {Node,
- node_flat_sql:decode_subscriptions(S),
- node_flat_sql:decode_jid(J)}
- end,
- RItems);
- _ ->
- []
- end,
- {result, Reply}.
+ GenKey ->
+ GJLike = <<(node_flat_sql:encode_jid_like(GenKey))/binary, "/%">>,
+ ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s "
+ "from pubsub_state i, pubsub_node n, pubsub_node_option o "
+ "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and "
+ "name='send_last_published_item' and val='on_sub_and_presence' and "
+ "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host like %(HLike)s escape '^'");
+ _ ->
+ SJ = node_flat_sql:encode_jid(SubKey),
+ ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s "
+ "from pubsub_state i, pubsub_node n, pubsub_node_option o "
+ "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and "
+ "name='send_last_published_item' and val='on_sub_and_presence' and "
+ "jid in (%(SJ)s,%(GJ)s) and host like %(HLike)s escape '^'")
+ end,
+ {result,
+ case ejabberd_sql:sql_query_t(Query) of
+ {selected, RItems} ->
+ lists:foldl(
+ fun ({H, N, T, I, J, S}, Acc) ->
+ O = node_flat_sql:decode_jid(H),
+ Node = nodetree_tree_sql:raw_to_node(O, {N, <<"">>, T, I}),
+ Jid = node_flat_sql:decode_jid(J),
+ lists:foldl(
+ fun ({Sub, SubId}, Acc2) ->
+ [{Node, Sub, SubId, Jid}| Acc2]
+ end, Acc, node_flat_sql:decode_subscriptions(S))
+ end, [], RItems);
+ _ ->
+ []
+ end}.
get_node_subscriptions(Nidx) ->
node_flat_sql:get_node_subscriptions(Nidx).
@@ -221,6 +219,9 @@ get_items(Nidx, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, RSM)
get_last_items(Nidx, JID, Count) ->
node_flat_sql:get_last_items(Nidx, JID, Count).
+get_only_item(Nidx, JID) ->
+ node_flat_sql:get_only_item(Nidx, JID).
+
get_item(Nidx, ItemId) ->
node_flat_sql:get_item(Nidx, ItemId).