Re: [pyasn1-users] "Duplicate positive key" while decoding
Brought to you by:
elie
From: David J. <dav...@fr...> - 2016-09-20 10:43:49
|
Ilya, great thanks. I've managed to get it working. Kudos for making such a great lib! As a side note (maybe a bug hides in this), should the call to method setComponentByName below a reference to q or a reference to a newly created instance of Query.Constraint? q = Query() c = q.setComponentByName("constraint") assert(q is c) # currently this line raises no error On 20. 09. 2016 12:13, Ilya Etingof wrote: > > That is quite fair: Constraint is a pure SEQUENCE while > Query["constraint"] is a tagged subtype of Constraint. Formally, these > are different types so they are not interchangeable. > > One solution would be to subtype the Constraint and/or Expression: > > Constraint ::= [0] SEQUENCE { > field ENUMERATED { source, target, date }, > operator ENUMERATED { eq, neq, gt, gte, lt, lte }, > value Value > } > > Query ::= CHOICE { constraint Constraint, expression Expression } > > Or, in Python code, instantiate from Query["constraint"]: > > q = Query() > # this call will instantiate new Query.Constraint object > c = q.setComponentByName("constraint") > c["field"] = "source" > c["operator"] = "eq" > c["value"] = Value() > c["value"]["entity"] = "David" > > To nitpick: AUTOMATIC TAGS might not be used as you are tagging things > manually. > > On 09/20/2016 11:03 AM, David Jelenc wrote: >> Many thanks for your response, Greg. >> >> I've updated my schema to reflect your suggestions, but now I have >> troubles constructing messages. The updated schema is the following: >> >> MySchema DEFINITIONS AUTOMATIC TAGS ::= BEGIN >> >> Query ::= CHOICE { constraint [0] Constraint, expression [1] Expression } >> >> Constraint ::= SEQUENCE { >> field ENUMERATED { source, target, date }, >> operator ENUMERATED { eq, neq, gt, gte, lt, lte }, >> value Value >> } >> >> Value ::= CHOICE { entity [0] PrintableString, date [1] INTEGER } >> >> Expression ::= SEQUENCE { >> operator ENUMERATED { and, or, not }, >> operands SEQUENCE OF Query >> } >> >> END >> >> I've generated Python classes with asn1ate and I omit them here for >> brevity's sake. Now, If I try to construct a message ... >> >> c = Constraint() >> c["field"] = "source" >> c["operator"] = "eq" >> c["value"] = Value() >> c["value"]["entity"] = "David" >> >> q = Query() >> q["constraint"] = c # >> >> .. I get an error in the the last line. The error is the following: >> >> Component value is tag-incompatible: >> Constraint(componentType=NamedTypes(NamedType('field', Enumerated(, >> NamedValues(('source', 0), ('target', 1), ('date', 2)))), >> NamedType('operator', Enumerated(, NamedValues(('eq', 0), ('neq', 1), >> ('gt', 2), ('gte', 3), ('lt', 4), ('lte', 5)))), NamedType('value', >> Value(componentType=NamedTypes(NamedType('entity', >> PrintableString(tagSet=TagSet((), Tag(tagClass=128, tagFormat=0, >> tagId=0)))), NamedType('date', Integer(tagSet=TagSet((), >> Tag(tagClass=128, tagFormat=0, >> tagId=1))))))))).setComponents(Enumerated('source', >> NamedValues(('source', 0), ('target', 1), ('date', 2))), >> Enumerated('eq', NamedValues(('eq', 0), ('neq', 1), ('gt', 2), ('gte', >> 3), ('lt', 4), ('lte', 5))), >> Value(componentType=NamedTypes(NamedType('entity', >> PrintableString(tagSet=TagSet((), Tag(tagClass=128, tagFormat=0, >> tagId=0)))), NamedType('date', Integer(tagSet=TagSet((), >> Tag(tagClass=128, tagFormat=0, >> tagId=1)))))).setComponents(PrintableString('David', tagSet=TagSet((), >> Tag(tagClass=128, tagFormat=0, tagId=0))))) vs >> Constraint(componentType=NamedTypes(NamedType('field', Enumerated(, >> NamedValues(('source', 0), ('target', 1), ('date', 2)))), >> NamedType('operator', Enumerated(, NamedValues(('eq', 0), ('neq', 1), >> ('gt', 2), ('gte', 3), ('lt', 4), ('lte', 5)))), NamedType('value', >> Value(componentType=NamedTypes(NamedType('entity', >> PrintableString(tagSet=TagSet((), Tag(tagClass=128, tagFormat=0, >> tagId=0)))), NamedType('date', Integer(tagSet=TagSet((), >> Tag(tagClass=128, tagFormat=0, tagId=1)))))))), tagSet=TagSet((), >> Tag(tagClass=128, tagFormat=32, tagId=0))) >> >> To my lay understanding, the error suggest that the constraint is an >> invalid type to be set in the constraint field of a Query message. I'm >> not sure how to proceed with this. >> >> As always, I thank anyone willing to share their thoughts. >> >> Best, >> David >> >> >> On 19. 09. 2016 17:29, Greg Hudson wrote: >>> On 09/19/2016 11:07 AM, David Jelenc wrote: >>>> Query ::= CHOICE { constraint Constraint, expression Expression } >>>> Constraint ::= SEQUENCE { [...] >>>> Expression ::= SEQUENCE { [...] >>> >>> An ASN.1 CHOICE must have different tags for each option (X.680 section >>> 28.7). Both of the options for this type have the same tag (for >>> SEQUENCE), so the decoder can't tell which option was chosen. If you >>> have control over the schema, try: >>> >>> Query ::= CHOICE { constraint [0] Constraint, expression [1] >>> Expression } >>> >>> This will add a context tag to each option, ensuring that they use >>> different tags. (If encoded size is a serious consideration, you can >>> get away with adding a context tag to only one of the options.) >>> >> >> ------------------------------------------------------------------------------ >> _______________________________________________ >> pyasn1-users mailing list >> pya...@li... >> https://lists.sourceforge.net/lists/listinfo/pyasn1-users >> |