25
1
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:
Christophe Romain 2010-01-14 12:51:22 +00:00
parent 6ad93eb609
commit 7aff5defac

View File

@ -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()