mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-22 16:20:52 +01:00
improve delete_subscriptions code
SVN Revision: 2902
This commit is contained in:
parent
6ad93eb609
commit
7aff5defac
@ -389,41 +389,38 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
|
|||||||
end, SubState#pubsub_state.subscriptions),
|
end, SubState#pubsub_state.subscriptions),
|
||||||
case Sub of
|
case Sub of
|
||||||
{value, S} ->
|
{value, S} ->
|
||||||
delete_subscription(SubKey, NodeId, S, SubState),
|
delete_subscriptions(SubKey, NodeId, [S], SubState),
|
||||||
{result, default};
|
{result, default};
|
||||||
false ->
|
false ->
|
||||||
{error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST,
|
{error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST, "not-subscribed")}
|
||||||
"not-subscribed")}
|
|
||||||
end;
|
end;
|
||||||
%% Asking to remove all subscriptions to the given node
|
%% Asking to remove all subscriptions to the given node
|
||||||
SubId == all ->
|
SubId == all ->
|
||||||
[delete_subscription(SubKey, NodeId, S, SubState) || S <- Subscriptions],
|
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState),
|
||||||
{result, default};
|
{result, default};
|
||||||
%% No subid supplied, but there's only one matching
|
%% No subid supplied, but there's only one matching subscription
|
||||||
%% subscription, so use that.
|
|
||||||
length(Subscriptions) == 1 ->
|
length(Subscriptions) == 1 ->
|
||||||
delete_subscription(SubKey, NodeId, hd(Subscriptions), SubState),
|
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState),
|
||||||
{result, default};
|
{result, default};
|
||||||
%% No subid and more than one possible subscription match.
|
%% No subid and more than one possible subscription match.
|
||||||
true ->
|
true ->
|
||||||
{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}
|
{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
delete_subscription(SubKey, NodeID, {Subscription, SubId}, SubState) ->
|
delete_subscriptions(SubKey, NodeId, Subscriptions, SubState) ->
|
||||||
Affiliation = SubState#pubsub_state.affiliation,
|
NewSubs = lists:foldl(fun({Subscription, SubId}, Acc) ->
|
||||||
AllSubs = SubState#pubsub_state.subscriptions,
|
pubsub_subscription:delete_subscription(SubKey, NodeId, SubId),
|
||||||
NewSubs = AllSubs -- [{Subscription, SubId}],
|
Acc -- [{Subscription, SubId}]
|
||||||
pubsub_subscription:delete_subscription(SubKey, NodeID, SubId),
|
end, SubState#pubsub_state.subscriptions, Subscriptions),
|
||||||
case {Affiliation, NewSubs} of
|
case {SubState#pubsub_state.affiliation, NewSubs} of
|
||||||
{none, []} ->
|
{none, []} ->
|
||||||
% Just a regular subscriber, and this is final item, so
|
% Just a regular subscriber, and this is final item, so
|
||||||
% delete the state.
|
% delete the state.
|
||||||
del_state(NodeID, SubKey);
|
del_state(NodeId, SubKey);
|
||||||
_ ->
|
_ ->
|
||||||
set_state(SubState#pubsub_state{subscriptions = NewSubs})
|
set_state(SubState#pubsub_state{subscriptions = NewSubs})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
%% @spec (NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
|
%% @spec (NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
|
||||||
%% {true, PubsubItem} | {result, Reply}
|
%% {true, PubsubItem} | {result, Reply}
|
||||||
%% NodeId = mod_pubsub:pubsubNodeId()
|
%% NodeId = mod_pubsub:pubsubNodeId()
|
||||||
|
Loading…
Reference in New Issue
Block a user