@@ -381,32 +381,40 @@ call_with_exchange_and_queue(Exchange, Queue, Fun) ->
381381 end ).
382382
383383add_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
395394delete_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