summaryrefslogtreecommitdiff
path: root/src/rabbit_exchange.erl
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2010-10-07 20:46:21 +0100
committerMatthias Radestock <matthias@rabbitmq.com>2010-10-07 20:46:21 +0100
commit1d75b6173d1e5db5eb0e9027283ed60d819bfa95 (patch)
treeb1b309fc9c60e64d21efe96f41c2e16cc79d21d0 /src/rabbit_exchange.erl
parenteab942babba136033bbc41232b7d390aea8088c1 (diff)
downloadrabbitmq-server-1d75b6173d1e5db5eb0e9027283ed60d819bfa95.tar.gz
refactor
Diffstat (limited to 'src/rabbit_exchange.erl')
-rw-r--r--src/rabbit_exchange.erl49
1 files changed, 22 insertions, 27 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index db5a46bd..21b3e780 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -227,38 +227,20 @@ info_all(VHostPath) -> map(VHostPath, fun (X) -> info(X) end).
info_all(VHostPath, Items) -> map(VHostPath, fun (X) -> info(X, Items) end).
publish(X = #exchange{name = XName}, Delivery) ->
- QNames = find_qnames(Delivery, queue:from_list([X]),
- sets:from_list([XName]), []),
- rabbit_router:deliver(QNames, Delivery).
+ rabbit_router:deliver(
+ route(Delivery, {queue:from_list([X]), sets:from_list([XName]), []}),
+ Delivery).
-find_qnames(Delivery, WorkList, SeenXs, QNames) ->
+route(Delivery, {WorkList, SeenXs, QNames}) ->
case queue:out(WorkList) of
{empty, _WorkList} ->
lists:usort(QNames);
{{value, X = #exchange{type = Type}}, WorkList1} ->
- DstNames =
- process_alternate(
- X, ((type_to_module(Type)):publish(X, Delivery))),
- {WorkList2, SeenXs1, QNames1} =
- lists:foldl(
- fun (XName = #resource{kind = exchange},
- {WorkListN, SeenXsN, QNamesN} = Acc) ->
- case sets:is_element(XName, SeenXsN) of
- true -> Acc;
- false -> {case lookup(XName) of
- {ok, X1} ->
- queue:in(X1, WorkListN);
- {error, not_found} ->
- WorkListN
- end,
- sets:add_element(XName, SeenXsN),
- QNamesN}
- end;
- (QName = #resource{kind = queue},
- {WorkListN, SeenXsN, QNamesN})->
- {WorkListN, SeenXsN, [QName | QNamesN]}
- end, {WorkList1, SeenXs, QNames}, DstNames),
- find_qnames(Delivery, WorkList2, SeenXs1, QNames1)
+ DstNames = process_alternate(
+ X, ((type_to_module(Type)):publish(X, Delivery))),
+ route(Delivery,
+ lists:foldl(fun process_route/2, {WorkList1, SeenXs, QNames},
+ DstNames))
end.
process_alternate(#exchange{name = XName, arguments = Args}, []) ->
@@ -269,6 +251,19 @@ process_alternate(#exchange{name = XName, arguments = Args}, []) ->
process_alternate(_X, Results) ->
Results.
+process_route(#resource{kind = exchange} = XName,
+ {WorkList, SeenXs, QNames} = Acc) ->
+ case sets:is_element(XName, SeenXs) of
+ true -> Acc;
+ false -> {case lookup(XName) of
+ {ok, X} -> queue:in(X, WorkList);
+ {error, not_found} -> WorkList
+ end, sets:add_element(XName, SeenXs), QNames}
+ end;
+process_route(#resource{kind = queue} = QName,
+ {WorkList, SeenXs, QNames}) ->
+ {WorkList, SeenXs, [QName | QNames]}.
+
call_with_exchange(XName, Fun) ->
rabbit_misc:execute_mnesia_transaction(
fun () -> case mnesia:read({rabbit_exchange, XName}) of