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-subscr...@qpid.apache.org