summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Hood <0x6e6562@gmail.com>2008-08-29 00:04:17 +0100
committerBen Hood <0x6e6562@gmail.com>2008-08-29 00:04:17 +0100
commitb5f6bc33ffedffd1d99cd5b069e07af744e7474c (patch)
tree8a76e7f69eafadeebbe91563b7f5198c668d657e /src
parent20c3155be74d88f4762539150b64583ed3b8da98 (diff)
downloadrabbitmq-server-git-b5f6bc33ffedffd1d99cd5b069e07af744e7474c.tar.gz
Took route deletion out of the amqqueue module, put it in the exchange module
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_amqqueue.erl13
-rw-r--r--src/rabbit_exchange.erl20
2 files changed, 18 insertions, 15 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 126bf1680b..75e050951a 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -287,17 +287,6 @@ basic_cancel(#amqqueue{pid = QPid}, ChPid, ConsumerTag, OkMsg) ->
notify_sent(QPid, ChPid) ->
gen_server:cast(QPid, {notify_sent, ChPid}).
-% Should all of the route and binding management not be refactored to it's own module
-% Especially seeing as unbind will have to be implemented for 0.91 ?
-% This kind of forward/reverse tuple management could be re-used
-delete_routes(Q = #amqqueue{name = Name}) ->
- Route = #route{binding = #binding{queue_name = Name, exchange_name = '_', key = '_'}},
- ReverseRoute = #reverse_route{reverse_binding = #reverse_binding{queue_name = Name,
- exchange_name = '_',
- key = '_'}},
- ok = mnesia:delete_object(Route),
- ok = mnesia:delete_object(ReverseRoute).
-
internal_delete(QueueName) ->
rabbit_misc:execute_mnesia_transaction(
fun () ->
@@ -311,7 +300,7 @@ internal_delete(QueueName) ->
end).
delete_temp(Q = #amqqueue{name = QueueName}) ->
- ok = delete_routes(Q),
+ ok = rabbit_exchange:delete_bindings(Q),
ok = mnesia:delete({amqqueue, QueueName}),
ok.
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 2977254515..13fed093f4 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -34,6 +34,7 @@
route/2]).
-export([add_binding/1, delete_binding/1]).
-export([delete/2]).
+-export([delete_bindings/1]).
-export([check_type/1, assert_type/2, topic_matches/2]).
-import(mnesia).
@@ -65,6 +66,7 @@
-spec(add_binding/1 :: (binding()) -> 'ok' | not_found() |
{'error', 'durability_settings_incompatible'}).
-spec(delete_binding/1 :: (binding()) -> 'ok' | not_found()).
+-spec(delete_bindings/1 :: (amqqueue()) -> 'ok' | not_found()).
-spec(topic_matches/2 :: (binary(), binary()) -> bool()).
-spec(delete/2 :: (exchange_name(), bool()) ->
'ok' | not_found() | {'error', 'in_use'}).
@@ -216,6 +218,15 @@ route_internal(Exchange, RoutingKey, MatchFun) ->
% but it is probably very expensive to maintain
{unique, true}),
mnesia:activity(async_dirty, fun() -> qlc:e(Query) end).
+
+
+% Should all of the route and binding management not be refactored to it's own module
+% Especially seeing as unbind will have to be implemented for 0.91 ?
+delete_routes(Q = #amqqueue{name = Name}) ->
+ Binding = #binding{queue_name = Name, exchange_name = '_', key = '_'},
+ {Route, ReverseRoute} = route_with_reverse(Binding),
+ ok = mnesia:delete_object(Route),
+ ok = mnesia:delete_object(ReverseRoute).
delivery_key_for_type(fanout, Name, _RoutingKey) ->
{Name, fanout};
@@ -254,6 +265,9 @@ delete_binding(Binding) ->
maybe_auto_delete(X)
end).
+delete_bindings(Q = #amqqueue{}) ->
+ delete_routes(Q).
+
%% Must run within a transaction.
maybe_auto_delete(#exchange{auto_delete = false}) ->
ok;
@@ -268,18 +282,18 @@ reverse_binding(#binding{exchange_name = Exchange, key = Key, queue_name = Queue
%% Must run within a transaction.
internal_add_binding(Binding) ->
- [ok,ok] = [mnesia:write(R) || R <- route_with_reverse(Binding)],
+ [ok,ok] = [mnesia:write(R) || R <- tuple_to_list(route_with_reverse(Binding))],
ok.
%% Must run within a transaction.
internal_delete_binding(Binding) ->
- [ok,ok] = [mnesia:delete_object(R) || R <- route_with_reverse(Binding)],
+ [ok,ok] = [mnesia:delete_object(R) || R <- tuple_to_list(route_with_reverse(Binding))],
ok.
route_with_reverse(Binding) ->
Route = #route{ binding = Binding },
ReverseRoute = #reverse_route{ reverse_binding = reverse_binding(Binding) },
- [Route, ReverseRoute].
+ {Route, ReverseRoute}.
split_topic_key(Key) ->
{ok, KeySplit} = regexp:split(binary_to_list(Key), "\\."),