aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-17 12:34:09 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-17 12:34:09 +0300
commit38b2e099d5be9ceb8ed51e4506e067877342ae8a (patch)
tree99bd478e57b5d530b865041523ce67d050cedad8 /src
parentAllow more flexible timeout values in the configuration (diff)
Fix pending nodes retrieval for SQL backend
Thanks to Christophe Romain
Diffstat (limited to 'src')
-rw-r--r--src/node_flat_sql.erl49
1 files changed, 17 insertions, 32 deletions
diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl
index cc94b8b0a..3283d5e16 100644
--- a/src/node_flat_sql.erl
+++ b/src/node_flat_sql.erl
@@ -546,41 +546,26 @@ unsub_with_subid(Nidx, SubId, SubState) ->
end.
get_pending_nodes(Host, Owner) ->
- GenKey = jid:remove_resource(jid:tolower(Owner)),
- States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'},
- affiliation = owner, _ = '_'}),
- Nidxxs = [Nidx || #pubsub_state{stateid = {_, Nidx}} <- States],
+ GenKey = encode_jid(jid:remove_resource(jid:tolower(Owner))),
+ PendingIdxs = case ejabberd_sql:sql_query_t(
+ ?SQL("select @(nodeid)d from pubsub_state "
+ "where subscriptions like '%p%' and affiliation='o'"
+ "and jid=%(GenKey)s")) of
+ {selected, RItems} ->
+ [Nidx || {Nidx} <- RItems];
+ _ ->
+ []
+ end,
NodeTree = mod_pubsub:tree(Host),
- Reply = mnesia:foldl(fun (#pubsub_state{stateid = {_, Nidx}} = S, Acc) ->
- case lists:member(Nidx, Nidxxs) of
- true ->
- case get_nodes_helper(NodeTree, S) of
- {value, Node} -> [Node | Acc];
- false -> Acc
- end;
- false ->
- Acc
- end
- end,
- [], pubsub_state),
+ Reply = lists:foldl(fun(Nidx, Acc) ->
+ case NodeTree:get_node(Nidx) of
+ #pubsub_node{nodeid = {_, Node}} -> [Node | Acc];
+ _ -> Acc
+ end
+ end,
+ [], PendingIdxs),
{result, Reply}.
-get_nodes_helper(NodeTree, #pubsub_state{stateid = {_, N}, subscriptions = Subs}) ->
- HasPending = fun
- ({pending, _}) -> true;
- (pending) -> true;
- (_) -> false
- end,
- case lists:any(HasPending, Subs) of
- true ->
- case NodeTree:get_node(N) of
- #pubsub_node{nodeid = {_, Node}} -> {value, Node};
- _ -> false
- end;
- false ->
- false
- end.
-
get_states(Nidx) ->
case ejabberd_sql:sql_query_t(
?SQL("select @(jid)s, @(affiliation)s, @(subscriptions)s "