From ebbdf159fec086d8888a76c360ad3d29cb93bb28 Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Fri, 14 Oct 2011 18:29:00 +0000 Subject: QPID-3549 - Improved handling of boolean configuration options in Queue.cpp git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1183455 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/Queue.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'qpid/cpp/src') diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp index 3d878d02a8..4627b1409a 100644 --- a/qpid/cpp/src/qpid/broker/Queue.cpp +++ b/qpid/cpp/src/qpid/broker/Queue.cpp @@ -952,6 +952,31 @@ int getIntegerSetting(const qpid::framing::FieldTable& settings, const std::stri } } +bool getBoolSetting(const qpid::framing::FieldTable& settings, const std::string& key) +{ + qpid::framing::FieldTable::ValuePtr v = settings.get(key); + if (!v) { + return false; + } else if (v->convertsTo()) { + return v->get() != 0; + } else if (v->convertsTo()){ + std::string s = v->get(); + if (s == "True") return true; + if (s == "true") return true; + if (s == "False") return false; + if (s == "false") return false; + try { + return boost::lexical_cast(s); + } catch(const boost::bad_lexical_cast&) { + QPID_LOG(warning, "Ignoring invalid boolean value for " << key << ": " << s); + return false; + } + } else { + QPID_LOG(warning, "Ignoring invalid boolean value for " << key << ": " << *v); + return false; + } +} + void Queue::configure(const FieldTable& _settings) { settings = _settings; @@ -983,7 +1008,7 @@ void Queue::configureImpl(const FieldTable& _settings) } //set this regardless of owner to allow use of no-local with exclusive consumers also - noLocal = _settings.get(qpidNoLocal); + noLocal = getBoolSetting(_settings, qpidNoLocal); QPID_LOG(debug, "Configured queue " << getName() << " with no-local=" << noLocal); std::string lvqKey = _settings.getAsString(qpidLastValueQueueKey); @@ -991,11 +1016,11 @@ void Queue::configureImpl(const FieldTable& _settings) QPID_LOG(debug, "Configured queue " << getName() << " as Last Value Queue with key " << lvqKey); messages = std::auto_ptr(new MessageMap(lvqKey)); allocator = boost::shared_ptr(new FifoDistributor( *messages )); - } else if (_settings.get(qpidLastValueQueueNoBrowse)) { + } else if (getBoolSetting(_settings, qpidLastValueQueueNoBrowse)) { QPID_LOG(debug, "Configured queue " << getName() << " as Legacy Last Value Queue with 'no-browse' on"); messages = LegacyLVQ::updateOrReplace(messages, qpidVQMatchProperty, true, broker); allocator = boost::shared_ptr(new FifoDistributor( *messages )); - } else if (_settings.get(qpidLastValueQueue)) { + } else if (getBoolSetting(_settings, qpidLastValueQueue)) { QPID_LOG(debug, "Configured queue " << getName() << " as Legacy Last Value Queue"); messages = LegacyLVQ::updateOrReplace(messages, qpidVQMatchProperty, false, broker); allocator = boost::shared_ptr(new FifoDistributor( *messages )); @@ -1015,7 +1040,7 @@ void Queue::configureImpl(const FieldTable& _settings) } } - persistLastNode= _settings.get(qpidPersistLastNode); + persistLastNode = getBoolSetting(_settings, qpidPersistLastNode); if (persistLastNode) QPID_LOG(debug, "Configured queue to Persist data if cluster fails to one node for: " << getName()); traceId = _settings.getAsString(qpidTraceIdentity); -- cgit v1.2.1