From 13220d44f44bd76c06298fdb2b610d06122dfd52 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Thu, 14 Jan 2010 12:56:40 +0000 Subject: [PATCH] improve delete_subscriptions code SVN Revision: 2903 --- src/mod_pubsub/node_hometree.erl | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/mod_pubsub/node_hometree.erl b/src/mod_pubsub/node_hometree.erl index 9a8ce7cc6..19e2f5dc9 100644 --- a/src/mod_pubsub/node_hometree.erl +++ b/src/mod_pubsub/node_hometree.erl @@ -390,35 +390,34 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) -> end, SubState#pubsub_state.subscriptions), case Sub of {value, S} -> - delete_subscription(SubKey, NodeId, S, SubState), + delete_subscriptions(SubKey, NodeId, [S], SubState), {result, default}; false -> - {error, ?ERR_EXTENDED('unexpected-request', - "not-subscribed")} + {error, ?ERR_EXTENDED('unexpected-request', "not-subscribed")} end; %% Asking to remove all subscriptions to the given node SubId == all -> - [delete_subscription(SubKey, NodeId, S, SubState) || S <- Subscriptions], + delete_subscriptions(SubKey, NodeId, Subscriptions, SubState), {result, default}; %% No subid supplied, but there's only one matching %% subscription, so use that. length(Subscriptions) == 1 -> - delete_subscription(SubKey, NodeId, hd(Subscriptions), SubState), + delete_subscriptions(SubKey, NodeId, Subscriptions, SubState), {result, default}; true -> {error, ?ERR_EXTENDED('bad-request', "subid-required")} end. -delete_subscription(SubKey, NodeID, {Subscription, SubId}, SubState) -> - Affiliation = SubState#pubsub_state.affiliation, - AllSubs = SubState#pubsub_state.subscriptions, - NewSubs = AllSubs -- [{Subscription, SubId}], - pubsub_subscription:unsubscribe_node(SubKey, NodeID, SubId), - case {Affiliation, NewSubs} of +delete_subscriptions(SubKey, NodeId, Subscriptions, SubState) -> + NewSubs = lists:foldl(fun({Subscription, SubId}, Acc) -> + pubsub_subscription:delete_subscription(SubKey, NodeId, SubId), + Acc -- [{Subscription, SubId}] + end, SubState#pubsub_state.subscriptions, Subscriptions), + case {SubState#pubsub_state.affiliation, NewSubs} of {none, []} -> % Just a regular subscriber, and this is final item, so % delete the state. - del_state(NodeID, SubKey); + del_state(NodeId, SubKey); _ -> set_state(SubState#pubsub_state{subscriptions = NewSubs}) end.