diff options
Diffstat (limited to 'src/node_pep_sql.erl')
-rw-r--r-- | src/node_pep_sql.erl | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index b84c945bd..07ff24b51 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -30,8 +30,10 @@ -behaviour(gen_pubsub_node). -author('christophe.romain@process-one.net'). +-compile([{parse_transform, ejabberd_sql_pt}]). + -include("pubsub.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, @@ -116,78 +118,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, @(type)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, @(type)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, @(type)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, @(type)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). |