You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jo...@apache.org on 2010/11/26 18:42:53 UTC
svn commit: r1039478 - in /qpid/trunk/qpid/cpp/src: qpid/xml/XmlExchange.cpp
tests/XmlClientSessionTest.cpp
Author: jonathan
Date: Fri Nov 26 17:42:53 2010
New Revision: 1039478
URL: http://svn.apache.org/viewvc?rev=1039478&view=rev
Log:
Binds integer, floating point, or string-typed headers using appropriate datatypes.
Modified:
qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp
qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp
Modified: qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp?rev=1039478&r1=1039477&r2=1039478&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp Fri Nov 26 17:42:53 2010
@@ -234,12 +234,23 @@ bool XmlExchange::matches(Query& query,
if (args) {
FieldTable::ValueMap::const_iterator v = args->begin();
for(; v != args->end(); ++v) {
- // ### TODO: Do types properly
- if (v->second->convertsTo<std::string>()) {
- QPID_LOG(trace, "XmlExchange, external variable: " << v->first << " = " << v->second->getData().getString().c_str());
- Item::Ptr value = context->getItemFactory()->createString(X(v->second->getData().getString().c_str()), context.get());
+
+ if (v->second->convertsTo<double>()) {
+ QPID_LOG(trace, "XmlExchange, external variable (double): " << v->first << " = " << v->second->get<double>());
+ Item::Ptr value = context->getItemFactory()->createDouble(v->second->get<double>(), context.get());
+ context->setExternalVariable(X(v->first.c_str()), value);
+ }
+ else if (v->second->convertsTo<int>()) {
+ QPID_LOG(trace, "XmlExchange, external variable (int):" << v->first << " = " << v->second->getData().getInt());
+ Item::Ptr value = context->getItemFactory()->createInteger(v->second->get<int>(), context.get());
context->setExternalVariable(X(v->first.c_str()), value);
}
+ else if (v->second->convertsTo<std::string>()) {
+ QPID_LOG(trace, "XmlExchange, external variable (string):" << v->first << " = " << v->second->getData().getString().c_str());
+ Item::Ptr value = context->getItemFactory()->createString(X(v->second->get<std::string>().c_str()), context.get());
+ context->setExternalVariable(X(v->first.c_str()), value);
+ }
+
}
}
Modified: qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp?rev=1039478&r1=1039477&r2=1039478&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp Fri Nov 26 17:42:53 2010
@@ -104,8 +104,6 @@ struct ClientSessionFixture : public Pro
// ########### START HERE ####################################
-
-
QPID_AUTO_TEST_CASE(testXmlBinding) {
ClientSessionFixture f;
@@ -216,6 +214,78 @@ olour", arg::arguments=blue);
}
+//### Test: double, string, and integer field values can all be bound to queries
+
+QPID_AUTO_TEST_CASE(testXmlBindingUntyped) {
+ ClientSessionFixture f;
+
+ SubscriptionManager subscriptions(f.session);
+ SubscribedLocalQueue localQueue(subscriptions);
+
+ f.session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
+ f.session.queueDeclare(qpid::client::arg::queue="odd_blue");
+ subscriptions.subscribe(localQueue, "odd_blue");
+
+ FieldTable binding;
+ binding.setString("xquery",
+ "declare variable $s external;"
+ "declare variable $i external;"
+ "declare variable $d external;"
+ "$s = 'string' and $i = 1 and $d < 1");
+ f.session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
+
+ Message message;
+ message.getDeliveryProperties().setRoutingKey("query_name");
+
+ message.getHeaders().setString("s", "string");
+ message.getHeaders().setInt("i", 1);
+ message.getHeaders().setDouble("d", 0.5);
+ string m = "<message>Hi, Mom!</message>";
+ message.setData(m);
+
+ f.session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
+
+ Message m2 = localQueue.get(1*qpid::sys::TIME_SEC);
+ BOOST_CHECK_EQUAL(m, m2.getData());
+}
+
+
+//### Test: double, string, and integer field values can all be bound to queries
+
+QPID_AUTO_TEST_CASE(testXmlBindingTyped) {
+ ClientSessionFixture f;
+
+ SubscriptionManager subscriptions(f.session);
+ SubscribedLocalQueue localQueue(subscriptions);
+
+ f.session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
+ f.session.queueDeclare(qpid::client::arg::queue="odd_blue");
+ subscriptions.subscribe(localQueue, "odd_blue");
+
+ FieldTable binding;
+ binding.setString("xquery",
+ "declare variable $s as xs:string external;"
+ "declare variable $i as xs:integer external;"
+ "declare variable $d external;" // XQilla bug when declaring xs:float, xs:double types? Fine if untyped, acts as float.
+ "$s = 'string' and $i = 1 and $d < 1");
+ f.session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
+
+ Message message;
+ message.getDeliveryProperties().setRoutingKey("query_name");
+
+ message.getHeaders().setString("s", "string");
+ message.getHeaders().setInt("i", 1);
+ message.getHeaders().setDouble("d", 0.5);
+ string m = "<message>Hi, Mom!</message>";
+ message.setData(m);
+
+ f.session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
+
+ Message m2 = localQueue.get(1*qpid::sys::TIME_SEC);
+ BOOST_CHECK_EQUAL(m, m2.getData());
+}
+
+
//### Test: Each session can provide its own definition for a query name
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org