The following examples illustrates how to construct a container data node.
The container nodes can be constructed different ways depending whether it is a top level container or not. If the container is not a top level container, the following code can be used:
... /* get the container obj template */ obj_template_t *cont_obj = obj_find_child(parentobj, modname, objname); if (!cont_obj) { return ERR_NCX_DEF_NOT_FOUND; } /* make a container value */ val_value_t *cont_value = val_new_value(); if (!cont_value) { return ERR_INTERNAL_MEM; } val_init_from_template(cont_value, cont_obj); ...
On the other hand, if the container is a top level container, and you are constructing it in order to use as a static or virtual data within running datastore. If the container represents operational data, the following example can be used:
... cfg_template_t *runningcfg = cfg_get_config_id(NCX_CFGID_RUNNING); if (!runningcfg || !runningcfg->root) { return ERR_NCX_DEF_NOT_FOUND; } /* get the top object node */ obj_template_t *topobj = obj_find_template_top(mod, module_name, object_name); if (!topobj) { return ERR_NCX_DEF_NOT_FOUND; } /* construct top level container */ val_value_t *cont_value = val_new_value(); if (!cont_value) { return ERR_INTERNAL_MEM; } val_init_from_template(cont_value, topobj); /* handing off the malloced memory here */ res = val_child_add(cont_value, runningcfg->root); if (res != NO_ERR) { val_free_value(cont_value); return res; } ...
As a result of these two examples, we will have an empty container with no any children. In order to add a child to the container, the following example that creates multiple leaf-list entries and adds them into parent container can be used:
... status_t res = NO_ERR; int32 value = 0; for (value = 10; value <= 15 && res==NO_ERR; value++) { val_value_t *leaflist_value = agt_make_int_leaf(parentobj, leaflistname, value, &res); if (!leaflist_value) { return res; } /* add a new leaf-list entry to parent container */ res = val_child_add(leaflist_value, cont_value); if (res != NO_ERR) { val_free_value(leaflist_value); return res; } } ...
In order to construct nested containers, the same steps should be applied twice, as illustrated below:
... cfg_template_t *runningcfg = cfg_get_config_id(NCX_CFGID_RUNNING); if (!runningcfg || !runningcfg->root) { return ERR_NCX_DEF_NOT_FOUND; } /* get the top object node */ obj_template_t *topobj = obj_find_template_top(mod, module_name, object_name); if (!topobj) { return ERR_NCX_DEF_NOT_FOUND; } /* construct top level container */ val_value_t *cont_value = val_new_value(); if (!cont_value) { return ERR_INTERNAL_MEM; } val_init_from_template(cont_value, topobj); /* handing off the malloced memory here */ status_t res = val_child_add(cont_value, runningcfg→root); if (res != NO_ERR) { val_free_value(cont_value); return res; } /* get the next container obj template */ obj_template_t *cont_obj = obj_find_child(topobj, modname, objname); if (!cont_obj) { val_free_value(cont_value); return ERR_NCX_DEF_NOT_FOUND; } /* make a next container value */ val_value_t *next_cont_value = val_new_value(); if (!next_cont_value) { val_free_value(cont_value); return ERR_INTERNAL_MEM; } val_init_from_template(next_cont_value, cont_obj); res = val_child_add(next_cont_value, cont_value); if (res != NO_ERR) { val_free_value(next_cont_value); val_free_value(cont_value); return res; } ...