• D
    qdict: implement a qdict_crumple method for un-flattening a dict · 603476c2
    Daniel P. Berrange 提交于
    The qdict_flatten() method will take a dict whose elements are
    further nested dicts/lists and flatten them by concatenating
    keys.
    
    The qdict_crumple() method aims to do the reverse, taking a flat
    qdict, and turning it into a set of nested dicts/lists. It will
    apply nesting based on the key name, with a '.' indicating a
    new level in the hierarchy. If the keys in the nested structure
    are all numeric, it will create a list, otherwise it will create
    a dict.
    
    If the keys are a mixture of numeric and non-numeric, or the
    numeric keys are not in strictly ascending order, an error will
    be reported.
    
    As an example, a flat dict containing
    
     {
       'foo.0.bar': 'one',
       'foo.0.wizz': '1',
       'foo.1.bar': 'two',
       'foo.1.wizz': '2'
     }
    
    will get turned into a dict with one element 'foo' whose
    value is a list. The list elements will each in turn be
    dicts.
    
     {
       'foo': [
         { 'bar': 'one', 'wizz': '1' },
         { 'bar': 'two', 'wizz': '2' }
       ],
     }
    
    If the key is intended to contain a literal '.', then it must
    be escaped as '..'. ie a flat dict
    
      {
         'foo..bar': 'wizz',
         'bar.foo..bar': 'eek',
         'bar.hello': 'world'
      }
    
    Will end up as
    
      {
         'foo.bar': 'wizz',
         'bar': {
            'foo.bar': 'eek',
            'hello': 'world'
         }
      }
    
    The intent of this function is that it allows a set of QemuOpts
    to be turned into a nested data structure that mirrors the nesting
    used when the same object is defined over QMP.
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Reviewed-by: NKevin Wolf <kwolf@redhat.com>
    Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
    Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
    Message-Id: <1475246744-29302-3-git-send-email-berrange@redhat.com>
    Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
    [Parameter recursive dropped along with its tests; whitespace style
    touched up]
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    603476c2
check-qdict.c 22.3 KB