Skip to content

Commit cfd34b0

Browse files
author
Matthias Radestock
committed
make delete_binding return an error when the binding does not exist
This required some refactoring in order to avoid duplication of the code that constructs #binding records.
1 parent 3120cdc commit cfd34b0

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/rabbit_exchange.erl

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -381,32 +381,40 @@ call_with_exchange_and_queue(Exchange, Queue, Fun) ->
381381
end).
382382

383383
add_binding(ExchangeName, QueueName, RoutingKey, Arguments) ->
384-
call_with_exchange_and_queue(
385-
ExchangeName, QueueName,
386-
fun (X, Q) ->
384+
binding_action(
385+
ExchangeName, QueueName, RoutingKey, Arguments,
386+
fun (X, Q, B) ->
387387
if Q#amqqueue.durable and not(X#exchange.durable) ->
388388
{error, durability_settings_incompatible};
389-
true -> ok = sync_binding(
390-
ExchangeName, QueueName, RoutingKey, Arguments,
391-
Q#amqqueue.durable, fun mnesia:write/3)
389+
true -> ok = sync_binding(B, Q#amqqueue.durable,
390+
fun mnesia:write/3)
392391
end
393392
end).
394393

395394
delete_binding(ExchangeName, QueueName, RoutingKey, Arguments) ->
395+
binding_action(
396+
ExchangeName, QueueName, RoutingKey, Arguments,
397+
fun (X, Q, B) ->
398+
case mnesia:match_object(rabbit_route, #route{binding = B},
399+
write) of
400+
[] -> {error, binding_not_found};
401+
_ -> ok = sync_binding(B, Q#amqqueue.durable,
402+
fun mnesia:delete_object/3),
403+
maybe_auto_delete(X)
404+
end
405+
end).
406+
407+
binding_action(ExchangeName, QueueName, RoutingKey, Arguments, Fun) ->
396408
call_with_exchange_and_queue(
397409
ExchangeName, QueueName,
398410
fun (X, Q) ->
399-
ok = sync_binding(
400-
ExchangeName, QueueName, RoutingKey, Arguments,
401-
Q#amqqueue.durable, fun mnesia:delete_object/3),
402-
maybe_auto_delete(X)
411+
Fun(X, Q, #binding{exchange_name = ExchangeName,
412+
queue_name = QueueName,
413+
key = RoutingKey,
414+
args = sort_arguments(Arguments)})
403415
end).
404416

405-
sync_binding(ExchangeName, QueueName, RoutingKey, Arguments, Durable, Fun) ->
406-
Binding = #binding{exchange_name = ExchangeName,
407-
queue_name = QueueName,
408-
key = RoutingKey,
409-
args = sort_arguments(Arguments)},
417+
sync_binding(Binding, Durable, Fun) ->
410418
ok = case Durable of
411419
true -> Fun(rabbit_durable_route,
412420
#route{binding = Binding}, write);
@@ -472,7 +480,7 @@ parse_x_match(Other) ->
472480

473481
%% Horrendous matching algorithm. Depends for its merge-like
474482
%% (linear-time) behaviour on the lists:keysort (sort_arguments) that
475-
%% route/3 and sync_binding/6 do.
483+
%% route/3 and {add,delete}_binding/4 do.
476484
%%
477485
%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
478486
%% In other words: REQUIRES BOTH PATTERN AND DATA TO BE SORTED ASCENDING BY KEY.

0 commit comments

Comments
 (0)