summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Hood <0x6e6562@gmail.com>2008-10-08 14:07:36 +0100
committerBen Hood <0x6e6562@gmail.com>2008-10-08 14:07:36 +0100
commit9f4987da7816cad46476109d4ccc92a5cfe18a80 (patch)
treecfcd40f4394a7f5301f49ef9dcbc20ed8067b80f
parentf53a02b832ad72f767f72a6b6422cafbcc3d0362 (diff)
downloadrabbitmq-server-9f4987da7816cad46476109d4ccc92a5cfe18a80.tar.gz
Simplified has_bindings because it only needs to do simple select and count
-rw-r--r--src/rabbit_exchange.erl26
1 files changed, 10 insertions, 16 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 39505c5a..169edcc4 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -226,22 +226,21 @@ lookup_qpids(Queues) ->
delete_bindings(Binding = #binding{exchange_name = X,
queue_name = QueueName})
when QueueName /= '_' andalso X == '_' ->
+ Exchanges = exchanges_for_queue(QueueName),
+ indexed_delete(reverse_route(#route{binding = Binding}),
+ fun mnesia:delete_object/1, fun delete_forward_routes/1),
lists:foreach(
fun(ExchangeName) ->
call_with_exchange(ExchangeName,
fun(Exchange) ->
if Exchange#exchange.auto_delete ->
- case has_bindings(ExchangeName, QueueName) of
+ case has_bindings(ExchangeName) of
true -> ok;
- false ->
- unchecked_internal_delete(ExchangeName)
+ false -> unchecked_internal_delete(ExchangeName)
end;
- true -> ok
- end
- end)
- end, exchanges_for_queue(QueueName)),
- indexed_delete(reverse_route(#route{binding = Binding}),
- fun mnesia:delete_object/1, fun delete_forward_routes/1);
+ true -> ok
+ end
+ end) end, Exchanges);
%% This uses the forward routes as the primary index.
delete_bindings(Binding = #binding{exchange_name = ExchangeName,
@@ -276,17 +275,12 @@ exchanges_for_queue(QueueName) ->
mnesia:select(reverse_route, [{MatchHead, [], ['$1']}]))).
has_bindings(ExchangeName) ->
- has_bindings_helper(ExchangeName, []).
-
-has_bindings(ExchangeName, QueueName) ->
- has_bindings_helper(ExchangeName, [{'=/=', '$1', {QueueName}}]).
-
-has_bindings_helper(ExchangeName, Condition) ->
MatchHead = #route{binding = #binding{exchange_name = ExchangeName,
queue_name = '$1',
key = '_'}},
- case mnesia:select(route, [{MatchHead, Condition, ['$1']}], 1, read) of
+ case mnesia:select(route, [{MatchHead, [], ['$1']}], 2, read) of
'$end_of_table' -> false;
+ {[], _} -> false;
_ -> true
end.