summaryrefslogtreecommitdiff
path: root/qpid/cpp/bindings/qmf/python/qmf.py
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/bindings/qmf/python/qmf.py')
-rw-r--r--qpid/cpp/bindings/qmf/python/qmf.py234
1 files changed, 117 insertions, 117 deletions
diff --git a/qpid/cpp/bindings/qmf/python/qmf.py b/qpid/cpp/bindings/qmf/python/qmf.py
index 233f1c83d8..c00c777878 100644
--- a/qpid/cpp/bindings/qmf/python/qmf.py
+++ b/qpid/cpp/bindings/qmf/python/qmf.py
@@ -35,6 +35,118 @@ from qmfengine import (TYPE_ABSTIME, TYPE_ARRAY, TYPE_BOOL, TYPE_DELTATIME,
from qmfengine import (O_EQ, O_NE, O_LT, O_LE, O_GT, O_GE, O_RE_MATCH, O_RE_NOMATCH,
E_NOT, E_AND, E_OR, E_XOR)
+
+def qmf_to_native(val):
+ typecode = val.getType()
+ if typecode == TYPE_UINT8: return val.asUint()
+ elif typecode == TYPE_UINT16: return val.asUint()
+ elif typecode == TYPE_UINT32: return val.asUint()
+ elif typecode == TYPE_UINT64: return val.asUint64()
+ elif typecode == TYPE_SSTR: return val.asString()
+ elif typecode == TYPE_LSTR: return val.asString()
+ elif typecode == TYPE_ABSTIME: return val.asInt64()
+ elif typecode == TYPE_DELTATIME: return val.asUint64()
+ elif typecode == TYPE_REF: return ObjectId(val.asObjectId())
+ elif typecode == TYPE_BOOL: return val.asBool()
+ elif typecode == TYPE_FLOAT: return val.asFloat()
+ elif typecode == TYPE_DOUBLE: return val.asDouble()
+ elif typecode == TYPE_UUID: return val.asUuid()
+ elif typecode == TYPE_INT8: return val.asInt()
+ elif typecode == TYPE_INT16: return val.asInt()
+ elif typecode == TYPE_INT32: return val.asInt()
+ elif typecode == TYPE_INT64: return val.asInt64()
+ elif typecode == TYPE_MAP: return value_to_dict(val)
+ else:
+ # when TYPE_OBJECT
+ # when TYPE_LIST
+ # when TYPE_ARRAY
+ logging.error( "Unsupported type for get_attr? '%s'" % str(val.getType()) )
+ return None
+
+
+def native_to_qmf(target, value):
+ val = None
+ typecode = None
+ if target.__class__ == qmfengine.Value:
+ val = target
+ typecode = val.getType()
+ else:
+ typecode = target
+ val = qmfengine.Value(typecode)
+
+ if typecode == TYPE_UINT8: val.setUint(value)
+ elif typecode == TYPE_UINT16: val.setUint(value)
+ elif typecode == TYPE_UINT32: val.setUint(value)
+ elif typecode == TYPE_UINT64: val.setUint64(value)
+ elif typecode == TYPE_SSTR:
+ if value: val.setString(value)
+ else: val.setString('')
+ elif typecode == TYPE_LSTR:
+ if value: val.setString(value)
+ else: val.setString('')
+ elif typecode == TYPE_ABSTIME: val.setInt64(value)
+ elif typecode == TYPE_DELTATIME: val.setUint64(value)
+ elif typecode == TYPE_REF: val.setObjectId(value.impl)
+ elif typecode == TYPE_BOOL: val.setBool(value)
+ elif typecode == TYPE_FLOAT: val.setFloat(value)
+ elif typecode == TYPE_DOUBLE: val.setDouble(value)
+ elif typecode == TYPE_UUID: val.setUuid(value)
+ elif typecode == TYPE_INT8: val.setInt(value)
+ elif typecode == TYPE_INT16: val.setInt(value)
+ elif typecode == TYPE_INT32: val.setInt(value)
+ elif typecode == TYPE_INT64: val.setInt64(value)
+ elif typecode == TYPE_MAP: dict_to_value(val, value)
+ else:
+ # when TYPE_MAP
+ # when TYPE_OBJECT
+ # when TYPE_LIST
+ # when TYPE_ARRAY
+ logging.error("Unsupported type for get_attr? '%s'" % str(val.getType()))
+ return None
+ return val
+
+
+def pick_qmf_type(value):
+ if value.__class__ == int:
+ if value >= 0:
+ if value < 0x100000000: return TYPE_UINT32
+ return TYPE_UINT64
+ else:
+ if value > -0xffffffff: return TYPE_INT32
+ return TYPE_INT64
+
+ if value.__class__ == long:
+ if value >= 0: return TYPE_UINT64
+ return TYPE_INT64
+
+ if value.__class__ == str:
+ if len(value) < 256: return TYPE_SSTR
+ return TYPE_LSTR
+
+ if value.__class__ == float: return TYPE_DOUBLE
+ if value.__class__ == bool: return TYPE_BOOL
+ if value == None: return TYPE_BOOL
+ if value.__class__ == dict: return TYPE_MAP
+
+ raise "QMF type not known for native type %s" % value.__class__
+
+
+def value_to_dict(val):
+ if not val.isMap(): raise "value_to_dict must be given a map value"
+ mymap = {}
+ for i in range(val.keyCount()):
+ key = val.key(i)
+ mymap[key] = qmf_to_native(val.byKey(key))
+ return mymap
+
+
+def dict_to_value(val, mymap):
+ for key, value in mymap.items():
+ if key.__class__ != str: raise "QMF map key must be a string"
+ typecode = pick_qmf_type(value)
+ val.insert(key, native_to_qmf(typecode, value))
+
+
##==============================================================================
## CONNECTION
##==============================================================================
@@ -293,64 +405,12 @@ class QmfObject(object):
def get_attr(self, name):
val = self._value(name)
- vType = val.getType()
- if vType == TYPE_UINT8: return val.asUint()
- elif vType == TYPE_UINT16: return val.asUint()
- elif vType == TYPE_UINT32: return val.asUint()
- elif vType == TYPE_UINT64: return val.asUint64()
- elif vType == TYPE_SSTR: return val.asString()
- elif vType == TYPE_LSTR: return val.asString()
- elif vType == TYPE_ABSTIME: return val.asInt64()
- elif vType == TYPE_DELTATIME: return val.asUint64()
- elif vType == TYPE_REF: return ObjectId(val.asObjectId())
- elif vType == TYPE_BOOL: return val.asBool()
- elif vType == TYPE_FLOAT: return val.asFloat()
- elif vType == TYPE_DOUBLE: return val.asDouble()
- elif vType == TYPE_UUID: return val.asUuid()
- elif vType == TYPE_INT8: return val.asInt()
- elif vType == TYPE_INT16: return val.asInt()
- elif vType == TYPE_INT32: return val.asInt()
- elif vType == TYPE_INT64: return val.asInt64()
- else:
- # when TYPE_MAP
- # when TYPE_OBJECT
- # when TYPE_LIST
- # when TYPE_ARRAY
- logging.error( "Unsupported type for get_attr? '%s'" % str(val.getType()) )
- return None
+ return qmf_to_native(val)
def set_attr(self, name, v):
val = self._value(name)
- vType = val.getType()
- if vType == TYPE_UINT8: return val.setUint(v)
- elif vType == TYPE_UINT16: return val.setUint(v)
- elif vType == TYPE_UINT32: return val.setUint(v)
- elif vType == TYPE_UINT64: return val.setUint64(v)
- elif vType == TYPE_SSTR:
- if v: return val.setString(v)
- else: return val.setString('')
- elif vType == TYPE_LSTR:
- if v: return val.setString(v)
- else: return val.setString('')
- elif vType == TYPE_ABSTIME: return val.setInt64(v)
- elif vType == TYPE_DELTATIME: return val.setUint64(v)
- elif vType == TYPE_REF: return val.setObjectId(v.impl)
- elif vType == TYPE_BOOL: return val.setBool(v)
- elif vType == TYPE_FLOAT: return val.setFloat(v)
- elif vType == TYPE_DOUBLE: return val.setDouble(v)
- elif vType == TYPE_UUID: return val.setUuid(v)
- elif vType == TYPE_INT8: return val.setInt(v)
- elif vType == TYPE_INT16: return val.setInt(v)
- elif vType == TYPE_INT32: return val.setInt(v)
- elif vType == TYPE_INT64: return val.setInt64(v)
- else:
- # when TYPE_MAP
- # when TYPE_OBJECT
- # when TYPE_LIST
- # when TYPE_ARRAY
- logging.error("Unsupported type for get_attr? '%s'" % str(val.getType()))
- return None
+ native_to_qmf(val, v)
def __getitem__(self, name):
@@ -577,7 +637,8 @@ class Arguments(object):
key_count = self.map.keyCount()
a = 0
while a < key_count:
- self._by_hash[self.map.key(a)] = self.by_key(self.map.key(a))
+ key = self.map.key(a)
+ self._by_hash[key] = qmf_to_native(self.map.byKey(key))
a += 1
@@ -615,70 +676,9 @@ class Arguments(object):
return super.__setattr__(self, name, value)
- def by_key(self, key):
- val = self.map.byKey(key)
- vType = val.getType()
- if vType == TYPE_UINT8: return val.asUint()
- elif vType == TYPE_UINT16: return val.asUint()
- elif vType == TYPE_UINT32: return val.asUint()
- elif vType == TYPE_UINT64: return val.asUint64()
- elif vType == TYPE_SSTR: return val.asString()
- elif vType == TYPE_LSTR: return val.asString()
- elif vType == TYPE_ABSTIME: return val.asInt64()
- elif vType == TYPE_DELTATIME: return val.asUint64()
- elif vType == TYPE_REF: return ObjectId(val.asObjectId())
- elif vType == TYPE_BOOL: return val.asBool()
- elif vType == TYPE_FLOAT: return val.asFloat()
- elif vType == TYPE_DOUBLE: return val.asDouble()
- elif vType == TYPE_UUID: return val.asUuid()
- elif vType == TYPE_INT8: return val.asInt()
- elif vType == TYPE_INT16: return val.asInt()
- elif vType == TYPE_INT32: return val.asInt()
- elif vType == TYPE_INT64: return val.asInt64()
- else:
- # when TYPE_MAP
- # when TYPE_OBJECT
- # when TYPE_LIST
- # when TYPE_ARRAY
- logging.error( "Unsupported Type for Get? '%s'" % str(val.getType()))
- return None
-
-
def set(self, key, value):
val = self.map.byKey(key)
- vType = val.getType()
- if vType == TYPE_UINT8: return val.setUint(value)
- elif vType == TYPE_UINT16: return val.setUint(value)
- elif vType == TYPE_UINT32: return val.setUint(value)
- elif vType == TYPE_UINT64: return val.setUint64(value)
- elif vType == TYPE_SSTR:
- if value:
- return val.setString(value)
- else:
- return val.setString('')
- elif vType == TYPE_LSTR:
- if value:
- return val.setString(value)
- else:
- return val.setString('')
- elif vType == TYPE_ABSTIME: return val.setInt64(value)
- elif vType == TYPE_DELTATIME: return val.setUint64(value)
- elif vType == TYPE_REF: return val.setObjectId(value.impl)
- elif vType == TYPE_BOOL: return val.setBool(value)
- elif vType == TYPE_FLOAT: return val.setFloat(value)
- elif vType == TYPE_DOUBLE: return val.setDouble(value)
- elif vType == TYPE_UUID: return val.setUuid(value)
- elif vType == TYPE_INT8: return val.setInt(value)
- elif vType == TYPE_INT16: return val.setInt(value)
- elif vType == TYPE_INT32: return val.setInt(value)
- elif vType == TYPE_INT64: return val.setInt64(value)
- else:
- # when TYPE_MAP
- # when TYPE_OBJECT
- # when TYPE_LIST
- # when TYPE_ARRAY
- logging.error("Unsupported Type for Set? '%s'" % str(val.getType()))
- return None
+ native_to_qmf(val, value)