summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-08 15:55:27 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-08 15:55:27 +0000
commitf77b8e784bcb850cb066f02f7c8951d94f0ff2bc (patch)
tree199ff72942d4f2fb2f6d22a9f3f9035bb6533754
parent82cc043bb83d7c0f1cff21aeb4a9d62ea0d136d2 (diff)
downloadqpid-python-f77b8e784bcb850cb066f02f7c8951d94f0ff2bc.tar.gz
QPID-4630: HA Fix starting from persistent store.
Reengineered code for converting a Variant to a FieldValue by reinstating code previously removed. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1454435 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/include/qpid/amqp_0_10/Codecs.h3
-rw-r--r--qpid/cpp/src/qpid/amqp_0_10/Codecs.cpp126
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.cpp4
3 files changed, 88 insertions, 45 deletions
diff --git a/qpid/cpp/include/qpid/amqp_0_10/Codecs.h b/qpid/cpp/include/qpid/amqp_0_10/Codecs.h
index 99a06e0a32..bcf3110923 100644
--- a/qpid/cpp/include/qpid/amqp_0_10/Codecs.h
+++ b/qpid/cpp/include/qpid/amqp_0_10/Codecs.h
@@ -76,7 +76,8 @@ QPID_COMMON_EXTERN void translate(const qpid::types::Variant::Map& from, const s
QPID_COMMON_EXTERN void translate(const qpid::framing::FieldTable& from,
qpid::types::Variant::Map& to);
-QPID_COMMON_EXTERN boost::shared_ptr<framing::FieldValue> fieldValue(const types::Variant&);
+QPID_COMMON_EXTERN void translate(const types::Variant& from,
+ boost::shared_ptr<qpid::framing::FieldValue> to);
}} // namespace qpid::amqp_0_10
diff --git a/qpid/cpp/src/qpid/amqp_0_10/Codecs.cpp b/qpid/cpp/src/qpid/amqp_0_10/Codecs.cpp
index e7637b16ad..a4db88f128 100644
--- a/qpid/cpp/src/qpid/amqp_0_10/Codecs.cpp
+++ b/qpid/cpp/src/qpid/amqp_0_10/Codecs.cpp
@@ -52,7 +52,6 @@ template <class T, class U, class F> void convert(const T& from, U& to, F f)
}
Variant::Map::value_type toVariantMapEntry(const FieldTable::value_type& in);
-Variant toVariant(boost::shared_ptr<FieldValue> in);
template <class T, class U, class F> void translate(boost::shared_ptr<FieldValue> in, U& u, F f)
{
@@ -61,13 +60,6 @@ template <class T, class U, class F> void translate(boost::shared_ptr<FieldValue
convert(t, u, f);
}
-template <class T, class U, class F> T* toFieldValueCollection(const U& u, F f)
-{
- typename T::ValueType t;
- convert(u, t, f);
- return new T(t);
-}
-
void setEncodingFor(Variant& out, uint8_t code)
{
switch(code){
@@ -173,34 +165,6 @@ Variant toVariant(boost::shared_ptr<FieldValue> in)
return out;
}
-boost::shared_ptr<FieldValue> convertString(const std::string& value, const std::string& encoding)
-{
- bool large = value.size() > std::numeric_limits<uint16_t>::max();
- if (encoding.empty() || encoding == amqp0_10_binary || encoding == binary) {
- if (large) {
- return boost::shared_ptr<FieldValue>(new Var32Value(value, 0xa0));
- } else {
- return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x90));
- }
- } else if (encoding == utf8) {
- if (!large)
- return boost::shared_ptr<FieldValue>(new Str16Value(value));
- throw Exception(QPID_MSG("Could not encode utf8 character string - too long (" << value.size() << " bytes)"));
- } else if (encoding == utf16) {
- if (!large)
- return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x96));
- throw Exception(QPID_MSG("Could not encode utf16 character string - too long (" << value.size() << " bytes)"));
- } else if (encoding == iso885915) {
- if (!large)
- return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x94));
- throw Exception(QPID_MSG("Could not encode iso-8859-15 character string - too long (" << value.size() << " bytes)"));
- } else {
- // the encoding was not recognised
- QPID_LOG(warning, "Unknown byte encoding: [" << encoding << "], encoding as vbin32.");
- return boost::shared_ptr<FieldValue>(new Var32Value(value, 0xa0));
- }
-}
-
Variant::Map::value_type toVariantMapEntry(const FieldTable::value_type& in)
{
return Variant::Map::value_type(in.first, toVariant(in.second));
@@ -527,13 +491,89 @@ void translate(const FieldTable& from, Variant::Map& to)
convert(from, to, &toVariantMapEntry);
}
-boost::shared_ptr<framing::FieldValue> fieldValue(const types::Variant& value) {
- // TODO aconway 2013-03-05: Nasty implementation
- Variant::Map m;
- m[std::string()] = value;
- framing::FieldTable f;
- translate(m, f);
- return f.get(std::string());
+namespace {
+boost::shared_ptr<FieldValue> convertString(const std::string& value, const std::string& encoding);
+FieldTableValue* toFieldTableValue(const Variant::Map& map);
+ListValue* toListValue(const Variant::List& list);
+
+boost::shared_ptr<FieldValue> toFieldValue(const Variant& in)
+{
+ boost::shared_ptr<FieldValue> out;
+ switch (in.getType()) {
+ case VAR_VOID: out = boost::shared_ptr<FieldValue>(new VoidValue()); break;
+ case VAR_BOOL: out = boost::shared_ptr<FieldValue>(new BoolValue(in.asBool())); break;
+ case VAR_UINT8: out = boost::shared_ptr<FieldValue>(new Unsigned8Value(in.asUint8())); break;
+ case VAR_UINT16: out = boost::shared_ptr<FieldValue>(new Unsigned16Value(in.asUint16())); break;
+ case VAR_UINT32: out = boost::shared_ptr<FieldValue>(new Unsigned32Value(in.asUint32())); break;
+ case VAR_UINT64: out = boost::shared_ptr<FieldValue>(new Unsigned64Value(in.asUint64())); break;
+ case VAR_INT8: out = boost::shared_ptr<FieldValue>(new Integer8Value(in.asInt8())); break;
+ case VAR_INT16: out = boost::shared_ptr<FieldValue>(new Integer16Value(in.asInt16())); break;
+ case VAR_INT32: out = boost::shared_ptr<FieldValue>(new Integer32Value(in.asInt32())); break;
+ case VAR_INT64: out = boost::shared_ptr<FieldValue>(new Integer64Value(in.asInt64())); break;
+ case VAR_FLOAT: out = boost::shared_ptr<FieldValue>(new FloatValue(in.asFloat())); break;
+ case VAR_DOUBLE: out = boost::shared_ptr<FieldValue>(new DoubleValue(in.asDouble())); break;
+ case VAR_STRING: out = convertString(in.asString(), in.getEncoding()); break;
+ case VAR_UUID: out = boost::shared_ptr<FieldValue>(new UuidValue(in.asUuid().data())); break;
+ case VAR_MAP:
+ out = boost::shared_ptr<FieldValue>(toFieldTableValue(in.asMap()));
+ break;
+ case VAR_LIST:
+ out = boost::shared_ptr<FieldValue>(toListValue(in.asList()));
+ }
+ return out;
+}
+
+boost::shared_ptr<FieldValue> convertString(const std::string& value, const std::string& encoding)
+{
+ bool large = value.size() > std::numeric_limits<uint16_t>::max();
+ if (encoding.empty() || encoding == amqp0_10_binary || encoding == binary) {
+ if (large) {
+ return boost::shared_ptr<FieldValue>(new Var32Value(value, 0xa0));
+ } else {
+ return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x90));
+ }
+ } else if (encoding == utf8) {
+ if (!large)
+ return boost::shared_ptr<FieldValue>(new Str16Value(value));
+ throw Exception(QPID_MSG("Could not encode utf8 character string - too long (" << value.size() << " bytes)"));
+ } else if (encoding == utf16) {
+ if (!large)
+ return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x96));
+ throw Exception(QPID_MSG("Could not encode utf16 character string - too long (" << value.size() << " bytes)"));
+ } else if (encoding == iso885915) {
+ if (!large)
+ return boost::shared_ptr<FieldValue>(new Var16Value(value, 0x94));
+ throw Exception(QPID_MSG("Could not encode iso-8859-15 character string - too long (" << value.size() << " bytes)"));
+ } else {
+ // the encoding was not recognised
+ QPID_LOG(warning, "Unknown byte encoding: [" << encoding << "], encoding as vbin32.");
+ return boost::shared_ptr<FieldValue>(new Var32Value(value, 0xa0));
+ }
+}
+
+FieldTable::value_type toFieldTableEntry(const Variant::Map::value_type& in)
+{
+ return FieldTable::value_type(in.first, toFieldValue(in.second));
+}
+
+FieldTableValue* toFieldTableValue(const Variant::Map& map)
+{
+ FieldTable ft;
+ convert(map, ft, &toFieldTableEntry);
+ return new FieldTableValue(ft);
+}
+
+ListValue* toListValue(const Variant::List& list)
+{
+ List l;
+ convert(list, l, &toFieldValue);
+ return new ListValue(l);
+}
+}
+
+void translate(const types::Variant& from, boost::shared_ptr<framing::FieldValue> to)
+{
+ to = toFieldValue(from);
}
const std::string ListCodec::contentType("amqp/list");
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp
index 91b497c57b..84fab543ec 100644
--- a/qpid/cpp/src/qpid/broker/Queue.cpp
+++ b/qpid/cpp/src/qpid/broker/Queue.cpp
@@ -1589,7 +1589,9 @@ void Queue::UsageBarrier::destroy()
void Queue::addArgument(const string& key, const types::Variant& value) {
settings.original[key] = value;
qpid::amqp_0_10::translate(settings.asMap(), encodableSettings);
- settings.storeSettings.set(key, qpid::amqp_0_10::fieldValue(value));
+ boost::shared_ptr<qpid::framing::FieldValue> v;
+ qpid::amqp_0_10::translate(value, v);
+ settings.storeSettings.set(key, v);
if (mgmtObject != 0) mgmtObject->set_arguments(settings.asMap());
}