blob: 9eb72021316df848ac9ab922229f67e59e9e9581 [file] [log] [blame]
Michal Vasko2d162e12015-09-24 14:33:29 +02001/**
Radek Krejciaa429e42015-10-09 15:52:37 +02002 * @file tree_data.h
Michal Vasko2d162e12015-09-24 14:33:29 +02003 * @author Radek Krejci <rkrejci@cesnet.cz>
Radek Krejciaa429e42015-10-09 15:52:37 +02004 * @brief libyang representation of data trees.
Michal Vasko2d162e12015-09-24 14:33:29 +02005 *
6 * Copyright (c) 2015 CESNET, z.s.p.o.
7 *
Radek Krejci54f6fb32016-02-24 12:56:39 +01008 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
Michal Vasko8de098c2016-02-26 10:00:25 +010011 *
Radek Krejci54f6fb32016-02-24 12:56:39 +010012 * https://opensource.org/licenses/BSD-3-Clause
Michal Vasko2d162e12015-09-24 14:33:29 +020013 */
14
15#ifndef LY_TREE_DATA_H_
16#define LY_TREE_DATA_H_
17
18#include <stddef.h>
19#include <stdint.h>
20
Mislav Novakovice251a652015-09-29 08:40:12 +020021#include "tree_schema.h"
Radek Krejcidef50022016-02-01 16:38:32 +010022#include "xml.h"
Mislav Novakovice251a652015-09-29 08:40:12 +020023
Michal Vasko2d162e12015-09-24 14:33:29 +020024#ifdef __cplusplus
25extern "C" {
26#endif
27
28/**
Radek Krejcidef50022016-02-01 16:38:32 +010029 * @defgroup datatree Data Tree
Michal Vasko2d162e12015-09-24 14:33:29 +020030 * @{
Radek Krejcidef50022016-02-01 16:38:32 +010031 *
32 * Data structures and functions to manipulate and access instance data tree.
Michal Vasko2d162e12015-09-24 14:33:29 +020033 */
34
35/**
Radek Krejcidef50022016-02-01 16:38:32 +010036 * @brief Data input/output formats supported by libyang [parser](@ref howtodataparsers) and
37 * [printer](@ref howtodataprinters) functions.
Michal Vasko2d162e12015-09-24 14:33:29 +020038 */
39typedef enum {
40 LYD_UNKNOWN, /**< unknown format, used as return value in case of error */
41 LYD_XML, /**< XML format of the instance data */
42 LYD_JSON, /**< JSON format of the instance data */
43} LYD_FORMAT;
44
45/**
Michal Vasko2d162e12015-09-24 14:33:29 +020046 * @brief Attribute structure.
47 *
Radek Krejci5f9e8c92015-10-30 10:01:06 +010048 * The structure provides information about attributes of a data element. Such attributes partially
49 * maps to annotations from draft-ietf-netmod-yang-metadata. In XML, they are represented as standard
50 * XML attrbutes. In JSON, they are represented as JSON elements starting with the '@' character
51 * (for more information, see the yang metadata draft.
52 *
Michal Vasko2d162e12015-09-24 14:33:29 +020053 */
54struct lyd_attr {
Radek Krejci5f9e8c92015-10-30 10:01:06 +010055 struct lyd_attr *next; /**< pointer to the next attribute of the same element */
56 struct lys_module *module; /**< pointer to the attribute's module.
57 TODO when annotations will be supported, point to the annotation definition
58 and validate that the attribute is really defined there. Currently, we just
59 believe that it is defined in the module it says */
Michal Vasko2d162e12015-09-24 14:33:29 +020060 const char *name; /**< attribute name */
61 const char *value; /**< attribute value */
62};
63
64/**
65 * @brief node's value representation
66 */
67typedef union lyd_value_u {
68 const char *binary; /**< base64 encoded, NULL terminated string */
Michal Vasko8ea2b7f2015-09-29 14:30:53 +020069 struct lys_type_bit **bit; /**< bitmap of pointers to the schema definition of the bit value that are set,
70 its size is always the number of defined bits in the schema */
Radek Krejci489773c2015-12-17 13:20:03 +010071 int8_t bln; /**< 0 as false, 1 as true */
Michal Vasko2d162e12015-09-24 14:33:29 +020072 int64_t dec64; /**< decimal64: value = dec64 / 10^fraction-digits */
73 struct lys_type_enum *enm; /**< pointer to the schema definition of the enumeration value */
Michal Vasko8ea2b7f2015-09-29 14:30:53 +020074 struct lys_ident *ident; /**< pointer to the schema definition of the identityref value */
Radek Krejci40f17b92016-02-03 14:30:43 +010075 struct lyd_node *instance; /**< pointer to the instance-identifier target, note that if the tree was modified,
76 the target (address) can be invalid - the pointer is correctly checked and updated
77 by lyd_validate() */
Michal Vasko2d162e12015-09-24 14:33:29 +020078 int8_t int8; /**< 8-bit signed integer */
79 int16_t int16; /**< 16-bit signed integer */
80 int32_t int32; /**< 32-bit signed integer */
81 int64_t int64; /**< 64-bit signed integer */
82 struct lyd_node *leafref; /**< pointer to the referenced leaf/leaflist instance in data tree */
83 const char *string; /**< string */
84 uint8_t uint8; /**< 8-bit unsigned integer */
85 uint16_t uint16; /**< 16-bit signed integer */
86 uint32_t uint32; /**< 32-bit signed integer */
87 uint64_t uint64; /**< 64-bit signed integer */
88} lyd_val;
89
90/**
Radek Krejcica7efb72016-01-18 13:06:01 +010091 * @defgroup validityflags Validity flags
92 * @ingroup datatree
93 *
94 * Validity flags for data nodes.
95 *
96 * @{
97 */
98#define LYD_VAL_OK 0x00 /**< node is successfully validated including whole subtree */
99#define LYD_VAL_UNIQUE 0x01 /**< Unique value(s) changed, applicable only to ::lys_node_list data nodes */
Radek Krejci991a3962016-05-05 15:00:14 +0200100#define LYD_VAL_NOT 0x07 /**< node was not validated yet */
101#define LYD_VAL_INUSE 0x08 /**< Internal flag for note about various processing on data, should be used only
102 internally and removed before the libyang returns to the caller */
Radek Krejcica7efb72016-01-18 13:06:01 +0100103/**
104 * @}
105 */
106
107/**
Michal Vasko2d162e12015-09-24 14:33:29 +0200108 * @brief Generic structure for a data node, directly applicable to the data nodes defined as #LYS_CONTAINER, #LYS_LIST
109 * and #LYS_CHOICE.
110 *
111 * Completely fits to containers and choices and is compatible (can be used interchangeably except the #child member)
112 * with all other lyd_node_* structures. All data nodes are provides as ::lyd_node structure by default.
113 * According to the schema's ::lys_node#nodetype member, the specific object is supposed to be cast to
Radek Krejcica7efb72016-01-18 13:06:01 +0100114 * ::lyd_node_leaf_list or ::lyd_node_anyxml structures. This structure fits only to #LYS_CONTAINER, #LYS_LIST and
115 * #LYS_CHOICE values.
Michal Vasko2d162e12015-09-24 14:33:29 +0200116 *
117 * To traverse through all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro.
118 */
119struct lyd_node {
120 struct lys_node *schema; /**< pointer to the schema definition of this node */
Radek Krejci1eefeb32016-04-15 16:01:46 +0200121 uint8_t validity:4; /**< [validity flags](@ref validityflags) */
122 uint8_t dflt:1; /**< flag for default node (applicable only on leafs) to be marked with default attribute */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100123 uint8_t when_status:3; /**< bit for checking if the when-stmt condition is resolved - internal use only,
Radek Krejci03b71f72016-03-16 11:10:09 +0100124 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200125
126 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
127 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
128 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
129 never NULL. If there is no sibling node, pointer points to the node
130 itself. In case of the first node, this pointer points to the last
131 node in the list. */
132 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
133 struct lyd_node *child; /**< pointer to the first child node \note Since other lyd_node_*
Radek Krejciee360892015-10-06 11:23:14 +0200134 structures represent end nodes, this member
Michal Vasko2d162e12015-09-24 14:33:29 +0200135 is replaced in those structures. Therefore, be careful with accessing
136 this member without having information about the node type from the schema's
137 ::lys_node#nodetype member. */
138};
139
140/**
Michal Vasko4c183312015-09-25 10:41:47 +0200141 * @brief Structure for data nodes defined as #LYS_LEAF or #LYS_LEAFLIST.
Michal Vasko2d162e12015-09-24 14:33:29 +0200142 *
Michal Vasko4c183312015-09-25 10:41:47 +0200143 * Extension for ::lyd_node structure. It replaces the ::lyd_node#child member by
144 * three new members (#value, #value_str and #value_type) to provide
145 * information about the value. The first five members (#schema, #attr, #next,
Michal Vasko2d162e12015-09-24 14:33:29 +0200146 * #prev and #parent) are compatible with the ::lyd_node's members.
147 *
148 * To traverse through all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro.
149 */
Michal Vasko4c183312015-09-25 10:41:47 +0200150struct lyd_node_leaf_list {
Michal Vasko2d162e12015-09-24 14:33:29 +0200151 struct lys_node *schema; /**< pointer to the schema definition of this node which is ::lys_node_leaflist
152 structure */
Radek Krejci1eefeb32016-04-15 16:01:46 +0200153 uint8_t validity:4; /**< [validity flags](@ref validityflags) */
154 uint8_t dflt:1; /**< flag for default node (applicable only on leafs) to be marked with default attribute */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100155 uint8_t when_status:3; /**< bit for checking if the when-stmt condition is resolved - internal use only,
Radek Krejci03b71f72016-03-16 11:10:09 +0100156 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200157
158 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
159 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
160 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
161 never NULL. If there is no sibling node, pointer points to the node
162 itself. In case of the first node, this pointer points to the last
163 node in the list. */
164 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
165
166 /* struct lyd_node *child; should be here, but is not */
167
168 /* leaflist's specific members */
Michal Vasko2d162e12015-09-24 14:33:29 +0200169 const char *value_str; /**< string representation of value (for comparison, printing,...) */
Radek Krejci23238922015-10-27 17:13:34 +0100170 lyd_val value; /**< node's value representation */
Michal Vasko2d162e12015-09-24 14:33:29 +0200171 LY_DATA_TYPE value_type; /**< type of the value in the node, mainly for union to avoid repeating of type detection */
172};
173
Michal Vaskof748dbc2016-04-05 11:27:47 +0200174union lyd_node_anyxml_value {
175 const char *str;
176 struct lyxml_elem *xml;
177};
178
Michal Vasko2d162e12015-09-24 14:33:29 +0200179/**
180 * @brief Structure for data nodes defined as #LYS_ANYXML.
181 *
182 * Extension for ::lyd_node structure - replaces the ::lyd_node#child member by new #value member. The first five
183 * members (#schema, #attr, #next, #prev and #parent) are compatible with the ::lyd_node's members.
184 *
185 * To traverse through all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro.
186 */
187struct lyd_node_anyxml {
188 struct lys_node *schema; /**< pointer to the schema definition of this node which is ::lys_node_anyxml
189 structure */
Radek Krejci1eefeb32016-04-15 16:01:46 +0200190 uint8_t validity:4; /**< [validity flags](@ref validityflags) */
191 uint8_t dflt:1; /**< flag for default node (applicable only on leafs) to be marked with default attribute */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100192 uint8_t when_status:3; /**< bit for checking if the when-stmt condition is resolved - internal use only,
Radek Krejci03b71f72016-03-16 11:10:09 +0100193 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200194
195 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
196 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
197 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
198 never NULL. If there is no sibling node, pointer points to the node
199 itself. In case of the first node, this pointer points to the last
200 node in the list. */
201 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
202
203 /* struct lyd_node *child; should be here, but is not */
204
205 /* anyxml's specific members */
Michal Vaskof748dbc2016-04-05 11:27:47 +0200206 uint8_t xml_struct; /**< 1 for value.xml, 0 for value.str */
207 union lyd_node_anyxml_value value; /**< anyxml value, everything is in the dictionary, there can be more XML siblings */
Michal Vasko2d162e12015-09-24 14:33:29 +0200208};
209
210/**
Radek Krejci991a3962016-05-05 15:00:14 +0200211 * @brief list of possible types of differencies in #lyd_difflist
212 */
213typedef enum {
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200214 LYD_DIFF_END = 0, /**< end of the differences list */
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200215 LYD_DIFF_DELETED, /**< deleted node
216 - Node is present in the first tree, but not in the second tree.
217 - To make both trees the same the node in lyd_difflist::first can be deleted from the
218 first tree. The pointer at the same index in the lyd_difflist::second array is
219 NULL */
220 LYD_DIFF_CHANGED, /**< value of a leaf or anyxml is changed, the lyd_difflist::first and lyd_difflist::second
221 points to the leaf/anyxml instances in the first and the second tree respectively. */
Radek Krejci22d2ca92016-05-17 16:23:51 +0200222 LYD_DIFF_MOVEDAFTER1, /**< user-ordered (leaf-)list item was moved.
223 - To make both trees the same, all #LYD_DIFF_MOVEDAFTER1 transactions must be applied
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200224 to the first tree in the strict order they appear in the difflist. The
225 lyd_difflist::first points to the first tree node being moved and the
226 lyd_difflist::second points to the first tree node after which the first node is
227 supposed to be moved. If the second pointer is NULL, the node is being moved into
228 the beginning as the first node of the (leaf-)list instances. */
Radek Krejci22d2ca92016-05-17 16:23:51 +0200229 LYD_DIFF_CREATED, /**< newly created node
230 - Node is present in the second tree, but not in the first tree.
231 - To make both trees the same the node in lyd_difflist::second is supposed to be
232 inserted (copied via lyd_dup()) into the node (as a child) at the same index in the
233 lyd_difflist::first array (where is its parent). If the lyd_difflist::first at the
234 index is NULL, the missing node is top-level. */
235 LYD_DIFF_MOVEDAFTER2 /**< similar to LYD_DIFF_MOVEDAFTER1, but this time the moved item is in the second tree.
236 This type is always used in combination with (as a successor of) #LYD_DIFF_CREATED
237 as an instruction to move the newly created node to a specific position. Note, that
238 due to applicability to the second tree, the meaning of lyd_difflist:first and
239 lyd_difflist:second is inverse in comparison to #LYD_DIFF_MOVEDAFTER1. The
240 lyd_difflist::second points to the (previously) created node in the second tree and
241 the lyd_difflist::first points to the predecessor node in the second tree. If the
242 predecessor is NULL, the node is supposed to bes the first sibling. */
Radek Krejci991a3962016-05-05 15:00:14 +0200243} LYD_DIFFTYPE;
244
245/**
246 * @brief Structure for the result of lyd_diff(), describing differences between two data trees.
247 */
248struct lyd_difflist {
249 LYD_DIFFTYPE *type; /**< array of the differences types, terminated by #LYD_DIFF_END value. */
250 struct lyd_node **first; /**< array of nodes in the first tree for the specific type of difference, see the
251 description of #LYD_DIFFTYPE values for more information. */
252 struct lyd_node **second;/**< array of nodes in the second tree for the specific type of difference, see the
253 description of #LYD_DIFFTYPE values for more information. */
254};
255
256/**
257 * @brief Free the result of lyd_diff(). It frees the structure of the lyd_diff() result, not the referenced nodes.
258 *
259 * @param[in] diff The lyd_diff() result to free.
260 */
261void lyd_free_diff(struct lyd_difflist *diff);
262
263/**
264 * @brief Compare two data trees and provide list of differences.
265 *
266 * Note, that the \p first and the \p second must have the same schema parent (or they must be top-level elements).
267 * In case of using #LYD_OPT_NOSIBLINGS, they both must be instances of the same schema node.
268 *
Radek Krejci913100d2016-05-09 17:23:51 +0200269 * Order of the resulting set follows these rules:
Radek Krejci22d2ca92016-05-17 16:23:51 +0200270 * - To change the first tree into the second tree, the resulting transactions are supposed to be applied in the order
271 * they appear in the result. First, the changed (#LYD_DIFF_CHANGED) nodes are described followed by the deleted
272 * (#LYD_DIFF_DELETED) nodes. Then, the moving of the user-ordered nodes present in both trees (#LYD_DIFF_MOVEDAFTER1)
273 * follows and the last transactions in the results are the newly created (#LYD_DIFF_CREATED) nodes. These nodes are
274 * supposed to be added as the last siblings, but in some case they can need additional move. In such a case, the
275 * #LYD_DIFF_MOVEDAFTER2 transactions can appear.
276 * - The order of the changed (#LYD_DIFF_CHANGED) and created (#LYD_DIFF_CREATED) follows the nodes order in the
277 * second tree - the current siblings are processed first and then the children are processed. Note, that this is
278 * actually not the BFS:
Radek Krejci913100d2016-05-09 17:23:51 +0200279 * 1 2
280 * / \ / \
281 * 3 4 7 8
282 * / \
283 * 5 6
Radek Krejci22d2ca92016-05-17 16:23:51 +0200284 * - The order of the deleted (#LYD_DIFF_DELETED) nodes is the DFS:
285 * 1 6
286 * / \ / \
287 * 2 5 7 8
288 * / \
289 * 3 4
Radek Krejci913100d2016-05-09 17:23:51 +0200290 *
291 * To change the first tree into the second one, it is necessary to follow the order of transactions described in
292 * the result. Note, that it is not possible just to use the transactions in the reverse order to transform the
293 * second tree into the first one. The transactions can be generalized (to be used on a different instance of the
294 * first tree) using lyd_path() to get identifiers for the nodes used in the transactions.
295 *
Radek Krejci9a6a5dd2016-05-05 15:56:24 +0200296 * @param[in] first The first (sub)tree to compare. Without #LYD_OPT_NOSIBLINGS option, all siblings are
Radek Krejci991a3962016-05-05 15:00:14 +0200297 * taken into comparison.
Radek Krejci9a6a5dd2016-05-05 15:56:24 +0200298 * @param[in] second The second (sub)tree to compare. Without #LYD_OPT_NOSIBLINGS option, all siblings are
Radek Krejci991a3962016-05-05 15:00:14 +0200299 * taken into comparison.
300 * @param[in] options The following @ref parseroptions with the described meanings are accepted:
301 * - #LYD_OPT_NOSIBLINGS - the \p first and the \p second have to instantiate the same schema node and
302 * only their content (subtree) is compared.
Radek Krejci991a3962016-05-05 15:00:14 +0200303 * @return NULL on error, the list of differences on success. In case the trees are the same, the first item in the
Radek Krejci9a6a5dd2016-05-05 15:56:24 +0200304 * lyd_difflist::type array is #LYD_DIFF_END. The returned structure is supposed to be freed by lyd_free_diff().
Radek Krejci991a3962016-05-05 15:00:14 +0200305 */
306struct lyd_difflist *lyd_diff(struct lyd_node *first, struct lyd_node *second, int options);
307
308/**
Radek Krejci6d538282016-05-05 14:24:12 +0200309 * @brief Build path (usable as XPath) of the data node.
310 * @param[in] node Data node to be processed. Note that the node should be from a complete data tree, having a subtree
311 * (after using lyd_unlink()) can cause generating invalid paths.
312 * @return NULL on error, on success the buffer for the resulting path is allocated and caller is supposed to free it
313 * with free().
314 */
315char *lyd_path(struct lyd_node *node);
316
317/**
Radek Krejcidef50022016-02-01 16:38:32 +0100318 * @defgroup parseroptions Data parser options
319 * @ingroup datatree
320 *
321 * Various options to change the data tree parsers behavior.
322 *
323 * Default behavior:
324 * - in case of XML, parser reads all data from its input (file, memory, XML tree) including the case of not well-formed
325 * XML document (multiple top-level elements) and if there is an unknown element, it is skipped including its subtree
326 * (see the next point). This can be changed by the #LYD_OPT_NOSIBLINGS option which make parser to read only a single
327 * tree (with a single root element) from its input.
328 * - parser silently ignores the data without a matching node in schema trees. If the caller want to stop
329 * parsing in case of presence of unknown data, the #LYD_OPT_STRICT can be used. The strict mode is useful for
330 * NETCONF servers, since NETCONF clients should always send data according to the capabilities announced by the server.
331 * On the other hand, the default non-strict mode is useful for clients receiving data from NETCONF server since
332 * clients are not required to understand everything the server does. Of course, the optimal strategy for clients is
333 * to use filtering to get only the required data. Having an unknown element of the known namespace is always an error.
334 * The behavior can be changed by #LYD_OPT_STRICT option.
335 * - using obsolete statements (status set to obsolete) just generates a warning, but the processing continues. The
336 * behavior can be changed by #LYD_OPT_OBSOLETE option.
337 * - parser expects that the provided data provides complete datastore content (both the configuration and state data)
338 * and performs data validation according to all YANG rules. This can be a problem in case of representing NETCONF's
339 * subtree filter data, edit-config's data or other type of data set - such data do not represent a complete data set
340 * and some of the validation rules can fail. Therefore there are other options (within lower 8 bits) to make parser
341 * to accept such a data.
Radek Krejcif3c218d2016-03-24 12:40:08 +0100342 * - when parser evaluates when-stmt condition to false, the constrained subtree is automatically removed. If the
343 * #LYD_OPT_NOAUTODEL is used, error is raised instead of silent auto delete. The option (and also this default
344 * behavior) takes effect only in case of #LYD_OPT_DATA or #LYD_OPT_CONFIG type of data.
Radek Krejci0c0086a2016-03-24 15:20:28 +0100345 * - whenever the parser see empty non-presence container, it is automatically removed to minimize memory usage. This
346 * behavior can be changed by #LYD_OPT_KEEPEMPTYCONT.
Radek Krejci7b4309c2016-03-23 10:30:29 +0100347 * - for validation, parser needs to add default nodes into the data tree. By default, these additional (implicit)
348 * nodes are removed before the parser returns. However, if caller use one of the LYD_WD_* option, the default nodes
349 * added by parser are kept in the resulting tree or even the explicit nodes with the default values can be removed
350 * (in case of #LYD_WD_TRIM option).
Radek Krejcidef50022016-02-01 16:38:32 +0100351 * @{
352 */
353
354#define LYD_OPT_DATA 0x00 /**< Default type of data - complete datastore content with configuration as well as
355 state data. */
356#define LYD_OPT_CONFIG 0x01 /**< A configuration datastore - complete datastore without state data.
357 Validation modifications:
358 - status data are not allowed */
359#define LYD_OPT_GET 0x02 /**< Data content from a NETCONF reply message to the NETCONF \<get\> operation.
360 Validation modifications:
361 - mandatory nodes can be omitted
362 - leafrefs and instance-identifier are not resolved
363 - list's keys/unique nodes are not required (so duplication is not checked) */
364#define LYD_OPT_GETCONFIG 0x04 /**< Data content from a NETCONF reply message to the NETCONF \<get-config\> operation
365 Validation modifications:
366 - mandatory nodes can be omitted
367 - leafrefs and instance-identifier are not resolved
368 - list's keys/unique nodes are not required (so duplication is not checked)
369 - status data are not allowed */
370#define LYD_OPT_EDIT 0x08 /**< Content of the NETCONF \<edit-config\>'s config element.
371 Validation modifications:
372 - mandatory nodes can be omitted
373 - leafrefs and instance-identifier are not resolved
374 - status data are not allowed */
375#define LYD_OPT_RPC 0x10 /**< Data represents RPC's input parameters. */
376#define LYD_OPT_RPCREPLY 0x20 /**< Data represents RPC's output parameters (maps to NETCONF <rpc-reply> data). */
377#define LYD_OPT_NOTIF 0x40 /**< Data represents an event notification data. */
Radek Krejci92ece002016-04-04 15:45:05 +0200378/* 0x80 reserved, formerly LYD_OPT_FILTER */
Radek Krejcidef50022016-02-01 16:38:32 +0100379#define LYD_OPT_TYPEMASK 0xff /**< Mask to filter data type options. Always only a single data type option (only
380 single bit from the lower 8 bits) can be set. */
381
382#define LYD_OPT_STRICT 0x0100 /**< Instead of silent ignoring data without schema definition, raise an error. */
383#define LYD_OPT_DESTRUCT 0x0200 /**< Free the provided XML tree during parsing the data. With this option, the
384 provided XML tree is affected and all succesfully parsed data are freed.
385 This option is applicable only to lyd_parse_xml() function. */
386#define LYD_OPT_OBSOLETE 0x0400 /**< Raise an error when an obsolete statement (status set to obsolete) is used. */
387#define LYD_OPT_NOSIBLINGS 0x0800 /**< Parse only a single XML tree from the input. This option applies only to
388 XML input data. */
Radek Krejci93fab982016-02-03 15:58:19 +0100389#define LYD_OPT_TRUSTED 0x1000 /**< Data comes from a trusted source and it is not needed to validate them. Data
390 are connected with the schema, but the most validation checks (mandatory nodes,
391 list instance uniqueness, etc.) are not performed. This option does not make
392 sense for lyd_validate() so it is ignored by this function. */
Radek Krejci03b71f72016-03-16 11:10:09 +0100393#define LYD_OPT_NOAUTODEL 0x2000 /**< Avoid automatic delete of subtrees with false when-stmt condition. The flag is
394 applicable only in combination with LYD_OPT_DATA and LYD_OPT_CONFIG flags.
395 If used, libyang generates validation error instead of silently removing the
396 constrained subtree. */
Radek Krejci0c0086a2016-03-24 15:20:28 +0100397#define LYD_OPT_KEEPEMPTYCONT 0x4000 /**< Do not automatically delete empty non-presence containers. */
Radek Krejcidef50022016-02-01 16:38:32 +0100398
Radek Krejciaa3c18d2016-04-15 11:29:10 +0200399#define LYD_WD_MASK 0x1F0000 /**< Mask for with-defaults modes */
400#define LYD_WD_EXPLICIT 0x100000 /**< Explicit mode - add missing default status data, but only in case the data
401 type is supposed to include status data (all except #LYD_OPT_CONFIG,
Radek Krejci9c302312016-04-18 12:32:16 +0200402 #LYD_OPT_GETCONFIG and #LYD_OPT_EDIT */
Radek Krejciaa3c18d2016-04-15 11:29:10 +0200403#define LYD_WD_TRIM 0x010000 /**< Remove all nodes with the value equal to their default value */
404#define LYD_WD_ALL 0x020000 /**< Explicitly add all missing nodes with their default value */
405#define LYD_WD_ALL_TAG 0x040000 /**< Same as LYD_WD_ALL but also adds attribute 'default' with value 'true' to
406 all nodes that has its default value. The 'default' attribute has namespace:
407 urn:ietf:params:xml:ns:netconf:default:1.0 and thus the attributes are
408 created only when the ietf-netconf-with-defaults module is present in libyang
409 context. */
410#define LYD_WD_IMPL_TAG 0x080000 /**< Same as LYD_WD_ALL_TAG but the attributes are added only to the nodes that
411 are being created and were not part of the original data tree despite their
412 value is equal to their default value. There is the same limitation regarding
413 the presence of ietf-netconf-with-defaults module in libyang context. */
Radek Krejci7b4309c2016-03-23 10:30:29 +0100414
Radek Krejcidef50022016-02-01 16:38:32 +0100415/**@} parseroptions */
416
417/**
418 * @brief Parse (and validate according to appropriate schema from the given context) data.
419 *
420 * In case of LY_XML format, the data string is parsed completely. It means that when it contains
421 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
422 * returned data node is a root of the first tree with other trees connected via the next pointer.
423 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
424 *
425 * @param[in] ctx Context to connect with the data tree being built here.
426 * @param[in] data Serialized data in the specified format.
427 * @param[in] format Format of the input data to be parsed.
428 * @param[in] options Parser options, see @ref parseroptions.
429 * @param[in] ... Additional argument must be supplied when #LYD_OPT_RPCREPLY value is specified in \p options. The
430 * argument is supposed to provide pointer to the RPC schema node for the reply's request
431 * (const struct ::lys_node* rpc).
432 * @return Pointer to the built data tree or NULL in case of empty \p data. To free the returned structure,
433 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
434 * #ly_errno contains appropriate error code (see #LY_ERR).
435 */
Radek Krejci722b0072016-02-01 17:09:45 +0100436struct lyd_node *lyd_parse_mem(struct ly_ctx *ctx, const char *data, LYD_FORMAT format, int options, ...);
Radek Krejcidef50022016-02-01 16:38:32 +0100437
438/**
439 * @brief Read data from the given file descriptor.
440 *
441 * \note Current implementation supports only reading data from standard (disk) file, not from sockets, pipes, etc.
442 *
443 * In case of LY_XML format, the file content is parsed completely. It means that when it contains
444 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
445 * returned data node is a root of the first tree with other trees connected via the next pointer.
446 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
447 *
448 * @param[in] ctx Context to connect with the data tree being built here.
449 * @param[in] fd The standard file descriptor of the file containing the data tree in the specified format.
450 * @param[in] format Format of the input data to be parsed.
451 * @param[in] options Parser options, see @ref parseroptions.
452 * @param[in] ... Additional argument must be supplied when #LYD_OPT_RPCREPLY value is specified in \p options. The
453 * argument is supposed to provide pointer to the RPC schema node for the reply's request
454 * (const struct ::lys_node* rpc).
455 * @return Pointer to the built data tree or NULL in case of empty file. To free the returned structure,
456 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
457 * #ly_errno contains appropriate error code (see #LY_ERR).
458 */
459struct lyd_node *lyd_parse_fd(struct ly_ctx *ctx, int fd, LYD_FORMAT format, int options, ...);
460
461/**
462 * @brief Read data from the given file path.
463 *
464 * In case of LY_XML format, the file content is parsed completely. It means that when it contains
465 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
466 * returned data node is a root of the first tree with other trees connected via the next pointer.
467 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
468 *
469 * @param[in] ctx Context to connect with the data tree being built here.
470 * @param[in] path Path to the file containing the data tree in the specified format.
471 * @param[in] format Format of the input data to be parsed.
472 * @param[in] options Parser options, see @ref parseroptions.
473 * @param[in] ... Additional argument must be supplied when #LYD_OPT_RPCREPLY value is specified in \p options. The
474 * argument is supposed to provide pointer to the RPC schema node for the reply's request
475 * (const struct ::lys_node* rpc).
476 * @return Pointer to the built data tree or NULL in case of empty file. To free the returned structure,
477 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
478 * #ly_errno contains appropriate error code (see #LY_ERR).
479 */
480struct lyd_node *lyd_parse_path(struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int options, ...);
481
482/**
483 * @brief Parse (and validate according to appropriate schema from the given context) XML tree.
484 *
485 * The output data tree is parsed from the given XML tree previously parsed by one of the
486 * lyxml_read* functions.
487 *
Radek Krejci722b0072016-02-01 17:09:45 +0100488 * If there are some sibling elements of the \p root (data were read with #LYXML_PARSE_MULTIROOT option
Radek Krejcidef50022016-02-01 16:38:32 +0100489 * or the provided root is a root element of a subtree), all the sibling nodes (previous as well as
490 * following) are processed as well. The returned data node is a root of the first tree with other
491 * trees connected via the next pointer. This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
492 *
493 * When the function is used with #LYD_OPT_DESTRUCT, all the successfully parsed data including the
494 * XML \p root and all its siblings (if #LYD_OPT_NOSIBLINGS is not used) are freed. Only with
495 * #LYD_OPT_DESTRUCT option the \p root pointer is changed - if all the data are parsed, it is set
496 * to NULL, otherwise it will hold the XML tree without the successfully parsed elements.
497 *
498 * The context must be the same as the context used to parse XML tree by lyxml_read* function.
499 *
500 * @param[in] ctx Context to connect with the data tree being built here.
501 * @param[in,out] root XML tree to parse (convert) to data tree. By default, parser do not change the XML tree. However,
502 * when #LYD_OPT_DESTRUCT is specified in \p options, parser frees all successfully parsed data.
503 * @param[in] options Parser options, see @ref parseroptions.
504 * @param[in] ... Additional argument must be supplied when #LYD_OPT_RPCREPLY value is specified in \p options. The
505 * argument is supposed to provide pointer to the RPC schema node for the reply's request
506 * (const struct ::lys_node* rpc).
507 * @return Pointer to the built data tree or NULL in case of empty \p root. To free the returned structure,
508 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
509 * #ly_errno contains appropriate error code (see #LY_ERR).
510 */
511struct lyd_node *lyd_parse_xml(struct ly_ctx *ctx, struct lyxml_elem **root, int options,...);
512
513/**
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200514 * @brief Create a new container node in a data tree.
515 *
516 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
Radek Krejciee360892015-10-06 11:23:14 +0200517 * @param[in] module Module with the node being created.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200518 * @param[in] name Schema node name of the new data node. The node can be #LYS_CONTAINER, #LYS_LIST,
Michal Vaskoa45cf2b2015-10-23 09:45:36 +0200519 * #LYS_NOTIF, or #LYS_RPC.
Michal Vasko1dca6882015-10-22 14:29:42 +0200520 * @return New node, NULL on error.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200521 */
Michal Vasko1e62a092015-12-01 12:27:20 +0100522struct lyd_node *lyd_new(struct lyd_node *parent, const struct lys_module *module, const char *name);
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200523
524/**
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200525 * @brief Create a new leaf or leaflist node in a data tree with a string value that is converted to
526 * the actual value.
527 *
528 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
Radek Krejciee360892015-10-06 11:23:14 +0200529 * @param[in] module Module with the node being created.
530 * @param[in] name Schema node name of the new data node.
Michal Vasko3e671b52015-10-23 16:23:15 +0200531 * @param[in] val_str String form of the value of the node being created. In case the type is #LY_TYPE_INST
532 * or #LY_TYPE_IDENT, JSON node-id format is expected (nodes are prefixed with module names, not XML namespaces).
Michal Vasko1dca6882015-10-22 14:29:42 +0200533 * @return New node, NULL on error.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200534 */
Michal Vasko1e62a092015-12-01 12:27:20 +0100535struct lyd_node *lyd_new_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
Michal Vasko3e671b52015-10-23 16:23:15 +0200536 const char *val_str);
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200537
538/**
Radek Krejcib9b4d002016-01-18 13:08:51 +0100539 * @brief Change value of a leaf node.
540 *
541 * Despite the prototype allows to provide a leaflist node as \p leaf parameter, only leafs are accepted.
Michal Vasko3a55a8a2016-04-13 14:19:53 +0200542 * Also, changing the value of a list key is prohibited.
Radek Krejcib9b4d002016-01-18 13:08:51 +0100543 *
Radek Krejci0562dbc2016-04-18 14:18:26 +0200544 * As for the other data tree manipulation functions, the change is not fully validated to allow multiple changes
545 * in the data tree. Therefore, when all changes on the data tree are done, caller is supposed to call lyd_validate()
546 * to check that the result is valid data tree. Specifically, if a leafref leaf is changed, it is not checked that
547 * the (leafref) value is correct.
548 *
Radek Krejcib9b4d002016-01-18 13:08:51 +0100549 * @param[in] leaf A leaf node to change.
550 * @param[in] val_str String form of the new value to be set to the \p leaf. In case the type is #LY_TYPE_INST
551 * or #LY_TYPE_IDENT, JSON node-id format is expected (nodes are prefixed with module names, not XML namespaces).
552 * @return 0 on success, non-zero on error.
553 */
554int lyd_change_leaf(struct lyd_node_leaf_list *leaf, const char *val_str);
555
556/**
Michal Vaskof748dbc2016-04-05 11:27:47 +0200557 * @brief Create a new anyxml node in a data tree with a string value.
Michal Vasko2d162e12015-09-24 14:33:29 +0200558 *
Michal Vasko2d162e12015-09-24 14:33:29 +0200559 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
Radek Krejciee360892015-10-06 11:23:14 +0200560 * @param[in] module Module with the node being created.
561 * @param[in] name Schema node name of the new data node.
Michal Vaskof748dbc2016-04-05 11:27:47 +0200562 * @param[in] val_str Well-formed XML string value of the node being created. Must be dynamically allocated
563 * and is freed with the data.
Michal Vasko1dca6882015-10-22 14:29:42 +0200564 * @return New node, NULL on error.
Michal Vasko2d162e12015-09-24 14:33:29 +0200565 */
Michal Vaskof748dbc2016-04-05 11:27:47 +0200566struct lyd_node *lyd_new_anyxml_str(struct lyd_node *parent, const struct lys_module *module, const char *name,
567 char *val_str);
568
569/**
570 * @brief Create a new anyxml node in a data tree with an XML structure value.
571 *
572 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
573 * @param[in] module Module with the node being created.
574 * @param[in] name Schema node name of the new data node.
575 * @param[in] val_xml XML structure value of the node being created. There can be more siblings,
576 * they are freed with the data.
577 * @return New node, NULL on error.
578 */
579struct lyd_node *lyd_new_anyxml_xml(struct lyd_node *parent, const struct lys_module *module, const char *name,
580 struct lyxml_elem *val_xml);
Michal Vasko2d162e12015-09-24 14:33:29 +0200581
582/**
Michal Vasko50c0a872016-01-13 14:34:11 +0100583 * @brief Create a new container node in a data tree, whose schema parent is #LYS_OUTPUT.
Michal Vasko0df122f2015-12-14 13:38:21 +0100584 *
Michal Vasko50c0a872016-01-13 14:34:11 +0100585 * @param[in] schema Schema node of the container.
Michal Vasko0df122f2015-12-14 13:38:21 +0100586 * @return New node, NULL on error.
587 */
Michal Vasko50c0a872016-01-13 14:34:11 +0100588struct lyd_node *lyd_output_new(const struct lys_node *schema);
589
590/**
591 * @brief Create a new leaf or leaflist node in a data tree, whose schema parent is #LYS_OUTPUT.
592 *
593 * @param[in] schema Schema node of the leaf.
594 * @param[in] val_str String form of the value of the node being created. In case the type is #LY_TYPE_INST
595 * or #LY_TYPE_IDENT, JSON node-id format is expected (nodes are prefixed with module names, not XML namespaces).
596 * @return New node, NULL on error.
597 */
598struct lyd_node *lyd_output_new_leaf(const struct lys_node *schema, const char *val_str);
599
600/**
Michal Vaskof748dbc2016-04-05 11:27:47 +0200601 * @brief Create a new anyxml node in a data tree, whose schema parent is #LYS_OUTPUT
602 * and has a string value.
Michal Vasko50c0a872016-01-13 14:34:11 +0100603 *
604 * @param[in] schema Schema node of the leaf.
Michal Vaskof748dbc2016-04-05 11:27:47 +0200605 * @param[in] val_str Well-formed XML string value of the node being created. Must be dynamically allocated
606 * and is freed with the data.
Michal Vasko50c0a872016-01-13 14:34:11 +0100607 * @return New node, NULL on error.
608 */
Michal Vaskof748dbc2016-04-05 11:27:47 +0200609struct lyd_node *lyd_output_new_anyxml_str(const struct lys_node *schema, char *val_str);
610
611/**
612 * @brief Create a new anyxml node in a data tree, whose schema parent is #LYS_OUTPUT
613 * and has an XML structure value.
614 *
615 * @param[in] schema Schema node of the leaf.
616 * @param[in] val_xml XML structure value of the node being created. There can be more siblings,
617 * they are freed with the data.
618 * @return New node, NULL on error.
619 */
620struct lyd_node *lyd_output_new_anyxml_xml(const struct lys_node *schema, struct lyxml_elem *val_xml);
Michal Vasko0df122f2015-12-14 13:38:21 +0100621
622/**
Michal Vaskof5299282016-03-16 13:32:02 +0100623 * @defgroup pathoptions Data path creation options
624 * @ingroup datatree
625 *
626 * Various options to change lyd_new_path() behavior.
627 *
628 * Default behavior:
Michal Vaskof5299282016-03-16 13:32:02 +0100629 * - if the target node already exists, an error is returned.
Michal Vasko9db078d2016-03-23 11:08:51 +0100630 * - the whole path to the target node is created (with any missing parents) if necessary.
Michal Vasko2411b942016-03-23 13:50:03 +0100631 * - RPC output schema children are completely ignored in all modules. Input is searched and nodes created normally.
Michal Vaskof5299282016-03-16 13:32:02 +0100632 * @{
633 */
634
Michal Vasko72d35102016-03-31 10:03:38 +0200635#define LYD_PATH_OPT_UPDATE 0x01 /**< If the target node exists and is a leaf, it is updated with the new value and returned.
636 If the target node exists and is not a leaf, NULL is returned and no error set. */
Michal Vasko9db078d2016-03-23 11:08:51 +0100637#define LYD_PATH_OPT_NOPARENT 0x02 /**< If any parents of the target node exist, return an error. */
Michal Vasko2411b942016-03-23 13:50:03 +0100638#define LYD_PATH_OPT_OUTPUT 0x04 /**< Changes the behavior to ignoring RPC input schema nodes and using only output ones. */
Michal Vaskof5299282016-03-16 13:32:02 +0100639
640/** @} pathoptions */
641
642/**
643 * @brief Create a new data node based on a simple XPath.
644 *
Michal Vasko8d18ef52016-04-06 12:21:46 +0200645 * The new node is normally inserted at the end, either as the last child of a parent or as the last sibling
646 * if working with top-level elements. However, when manipulating RPC input or output, schema ordering is
647 * required and always guaranteed. Specially, when working with RPC output (using #LYD_PATH_OPT_OUTPUT flag),
648 * it can therefore happen that a node is created and inserted before \p data_tree.
Michal Vasko58f74f12016-03-24 13:26:06 +0100649 *
Michal Vasko8c419642016-04-13 14:22:01 +0200650 * If \p path points to a list key and the list does not exist, the key value from the predicate is used
651 * and \p value is ignored.
652 *
Michal Vasko2411b942016-03-23 13:50:03 +0100653 * @param[in] data_tree Existing data tree to add to/modify. It is expected to be valid. If creating RPCs,
Michal Vasko58f74f12016-03-24 13:26:06 +0100654 * there should only be one RPC and either input or output. Can be NULL.
Michal Vaskof5299282016-03-16 13:32:02 +0100655 * @param[in] ctx Context to use. Mandatory if \p data_tree is NULL.
Michal Vasko9db078d2016-03-23 11:08:51 +0100656 * @param[in] path Simple data XPath of the new node. It can contain only simple node addressing with optional
Michal Vaskof5299282016-03-16 13:32:02 +0100657 * module names as prefixes. List nodes must have predicates, one for each list key in the correct order and
Michal Vasko58f74f12016-03-24 13:26:06 +0100658 * with its value as well, see @ref howtoxpath.
Michal Vaskof748dbc2016-04-05 11:27:47 +0200659 * @param[in] value Value of the new leaf/lealf-list. If creating anyxml, this value is internally duplicated
660 * (for other options use lyd_*_new_anyxml_*()). If creating nodes of other types, set to NULL.
Michal Vaskof5299282016-03-16 13:32:02 +0100661 * @param[in] options Bitmask of options flags, see @ref pathoptions.
Michal Vasko8c419642016-04-13 14:22:01 +0200662 * @return First created (or updated with #LYD_PATH_OPT_UPDATE) node,
Michal Vasko17bb4902016-04-05 15:20:51 +0200663 * NULL if #LYD_PATH_OPT_UPDATE was used and the full path exists or the leaf original value matches \p value,
Michal Vasko72d35102016-03-31 10:03:38 +0200664 * NULL and ly_errno is set on error.
Michal Vaskof5299282016-03-16 13:32:02 +0100665 */
Michal Vaskof748dbc2016-04-05 11:27:47 +0200666struct lyd_node *lyd_new_path(struct lyd_node *data_tree, struct ly_ctx *ctx, const char *path, const char *value,
667 int options);
Michal Vaskof5299282016-03-16 13:32:02 +0100668
669/**
Michal Vaskoc0797f82015-10-14 15:51:25 +0200670 * @brief Create a copy of the specified data tree \p node. Namespaces are copied as needed,
671 * schema references are kept the same.
Michal Vasko2d162e12015-09-24 14:33:29 +0200672 *
673 * @param[in] node Data tree node to be duplicated.
674 * @param[in] recursive 1 if all children are supposed to be also duplicated.
675 * @return Created copy of the provided data \p node.
676 */
Michal Vasko1e62a092015-12-01 12:27:20 +0100677struct lyd_node *lyd_dup(const struct lyd_node *node, int recursive);
Michal Vasko2d162e12015-09-24 14:33:29 +0200678
679/**
Michal Vasko45fb2822016-04-18 13:32:17 +0200680 * @brief Merge a (sub)tree into a data tree. Missing nodes are merged, leaf values updated.
681 * If \p target and \p source do not share the top-level schema node, even if they
682 * are from different modules, \p source parents up to top-level node will be created and
683 * linked to the \p target (but only containers can be created this way, lists need keys,
684 * so if lists are missing, an error will be returned).
685 *
686 * In short, this function will always try to return a fully valid data tree and will fail
Michal Vaskocf6dc7e2016-04-18 16:00:37 +0200687 * if it is not possible. Also, in some less common cases, despite both trees \p target and
688 * \p source are valid, the resulting tree may be invalid and this function will succeed.
689 * If you know there are such possibilities in your data trees or you are not sure, always
690 * validate the resulting merged \p target tree.
Michal Vasko45fb2822016-04-18 13:32:17 +0200691 *
Michal Vaskocf6dc7e2016-04-18 16:00:37 +0200692 * @param[in] target Top-level (or an RPC output child) data tree to merge to. Must be valid.
Michal Vasko45fb2822016-04-18 13:32:17 +0200693 * @param[in] source Data tree to merge \p target with. Must be valid (at least as a subtree).
694 * @param[in] options Bitmask of 2 option flags:
695 * LYD_OPT_DESTRUCT - spend \p source in the function, otherwise \p source is left untouched,
696 * LYD_OPT_NOSIBLINGS - merge only the \p source subtree (ignore siblings), otherwise merge
697 * \p source and all its succeeding siblings (preceeding ones are still ignored!).
698 * @return 0 on success, nonzero in case of an error.
699 */
700int lyd_merge(struct lyd_node *target, const struct lyd_node *source, int options);
701
702/**
Michal Vasko2d162e12015-09-24 14:33:29 +0200703 * @brief Insert the \p node element as child to the \p parent element. The \p node is inserted as a last child of the
704 * \p parent.
705 *
706 * If the node is part of some other tree, it is automatically unlinked.
707 * If the node is the first node of a node list (with no parent), all
708 * the subsequent nodes are also inserted.
709 *
710 * @param[in] parent Parent node for the \p node being inserted.
711 * @param[in] node The node being inserted.
Michal Vasko24337392015-10-16 09:58:16 +0200712 * @return 0 on success, nonzero in case of error, e.g. when the node is being inserted to an inappropriate place
Michal Vasko2d162e12015-09-24 14:33:29 +0200713 * in the data tree.
714 */
Michal Vasko24337392015-10-16 09:58:16 +0200715int lyd_insert(struct lyd_node *parent, struct lyd_node *node);
Michal Vasko2d162e12015-09-24 14:33:29 +0200716
717/**
Michal Vasko3f7dba12015-10-15 13:09:27 +0200718 * @brief Insert the \p node element after the \p sibling element. If \p node and \p siblings are already
Radek Krejcica7efb72016-01-18 13:06:01 +0100719 * siblings (just moving \p node position), skip validation.
Michal Vasko2d162e12015-09-24 14:33:29 +0200720 *
Michal Vasko2d162e12015-09-24 14:33:29 +0200721 * @param[in] sibling The data tree node before which the \p node will be inserted.
Radek Krejci20a5f292016-02-09 15:04:49 +0100722 * @param[in] node The data tree node to be inserted. If the node is connected somewhere, it is unlinked first.
Michal Vasko24337392015-10-16 09:58:16 +0200723 * @return 0 on success, nonzero in case of error, e.g. when the node is being inserted to an inappropriate place
Michal Vasko2d162e12015-09-24 14:33:29 +0200724 * in the data tree.
725 */
Michal Vasko24337392015-10-16 09:58:16 +0200726int lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
Michal Vasko2d162e12015-09-24 14:33:29 +0200727
728/**
Radek Krejci20a5f292016-02-09 15:04:49 +0100729 * @brief Insert the \p node element after the \p sibling element. If \p node and \p siblings are already
730 * siblings (just moving \p node position), skip validation.
Michal Vasko2d162e12015-09-24 14:33:29 +0200731 *
Michal Vasko3f7dba12015-10-15 13:09:27 +0200732 * @param[in] sibling The data tree node before which the \p node will be inserted. If \p node and \p siblings
Radek Krejcica7efb72016-01-18 13:06:01 +0100733 * are already siblings (just moving \p node position), skip validation.
Radek Krejci20a5f292016-02-09 15:04:49 +0100734 * @param[in] node The data tree node to be inserted. If the node is connected somewhere, it is unlinked first.
Michal Vasko24337392015-10-16 09:58:16 +0200735 * @return 0 on success, nonzero in case of error, e.g. when the node is being inserted to an inappropriate place
Michal Vasko2d162e12015-09-24 14:33:29 +0200736 * in the data tree.
737 */
Michal Vasko24337392015-10-16 09:58:16 +0200738int lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
739
740/**
Michal Vasko2411b942016-03-23 13:50:03 +0100741 * @brief Order siblings according to the schema node ordering.
742 *
Michal Vasko58f74f12016-03-24 13:26:06 +0100743 * If the siblings include data nodes from other modules, they are
744 * sorted based on the module order in the context.
745 *
746 * @param[in] sibling Node, whose siblings will be sorted.
747 * @param[in] recursive Whether sort all siblings of siblings, recursively.
748 * @return 0 on success, nonzero in case of an error.
Michal Vasko2411b942016-03-23 13:50:03 +0100749 */
Michal Vasko58f74f12016-03-24 13:26:06 +0100750int lyd_schema_sort(struct lyd_node *sibling, int recursive);
Michal Vasko2411b942016-03-23 13:50:03 +0100751
752/**
Michal Vasko105cef12016-02-04 12:06:26 +0100753 * @brief Search in the given data for instances of nodes matching the provided XPath expression.
754 *
755 * The \p data is used to find the data root and function then searches in the whole tree and all sibling trees.
Michal Vasko7fdf9b32016-03-01 15:59:48 +0100756 * The XPath expression is evaluated on data -> skip all non-data nodes (input, output, choice, case).
Michal Vasko105cef12016-02-04 12:06:26 +0100757 *
Michal Vasko7fdf9b32016-03-01 15:59:48 +0100758 * Expr examples:
759 * "/ietf-yang-library:modules-state/module[name = 'ietf-yang-library']/namespace"
760 * "/ietf-netconf:get-config/source"
761 *
762 * @param[in] data Node in the data tree considered the context node. If the node is a configuration one,
Michal Vasko105cef12016-02-04 12:06:26 +0100763 * any state nodes in its tree are not accessible!
764 * @param[in] expr XPath expression filtering the matching nodes.
765 * @return Set of found data nodes (use dset member of ::ly_set). If no nodes are matching \p expr or the result
766 * would be a number, a string, or a boolean, the returned set is empty. In case of an error, NULL is returned.
767 */
768struct ly_set *lyd_get_node(const struct lyd_node *data, const char *expr);
769
770/**
Radek Krejcic5b6b912016-01-18 16:35:35 +0100771 * @brief Search in the given data for instances of the provided schema node.
772 *
773 * The \p data is used to find the data root and function then searches in the whole tree and all sibling trees.
774 *
775 * @param[in] data A node in the data tree to search.
776 * @param[in] schema Schema node of the data nodes caller want to find.
Radek Krejci2342cf62016-01-29 16:48:23 +0100777 * @return Set of found data nodes (use dset member of ::ly_set). If no data node is found, the returned set is empty.
Radek Krejcic5b6b912016-01-18 16:35:35 +0100778 * In case of error, NULL is returned.
779 */
Michal Vasko105cef12016-02-04 12:06:26 +0100780struct ly_set *lyd_get_node2(const struct lyd_node *data, const struct lys_node *schema);
Radek Krejcic5b6b912016-01-18 16:35:35 +0100781
782/**
Michal Vasko24337392015-10-16 09:58:16 +0200783 * @brief Validate \p node data subtree.
784 *
Michal Vaskodedea832016-04-19 11:24:45 +0200785 * @param[in,out] node Data tree to be validated. In case the \p options does not includes #LYD_OPT_NOAUTODEL, libyang
Radek Krejci4e941112016-03-23 10:44:30 +0100786 * can modify the provided tree including the root \p node.
Michal Vasko24337392015-10-16 09:58:16 +0200787 * @param[in] options Options for the inserting data to the target data tree options, see @ref parseroptions.
Michal Vaskodedea832016-04-19 11:24:45 +0200788 * @param[in] ... if \p options include #LYD_OPT_RPCREPLY then RPC schema node of the data (unsed ony when \p node is NULL),
789 * otherwise libyang context for the data (used only in case the \p node is NULL, so in case of checking empty data tree).
Radek Krejci92ece002016-04-04 15:45:05 +0200790 * @return 0 on success, nonzero in case of an error.
Michal Vasko24337392015-10-16 09:58:16 +0200791 */
Radek Krejci03b71f72016-03-16 11:10:09 +0100792int lyd_validate(struct lyd_node **node, int options, ...);
Michal Vasko2d162e12015-09-24 14:33:29 +0200793
794/**
Radek Krejci7b4309c2016-03-23 10:30:29 +0100795 * @brief Add default nodes into the data tree.
796 *
Radek Krejci8100ca22016-03-29 10:32:58 +0200797 * The function expects that the provided data tree is valid. If not, the result is undefined - in general, the
798 * result is not more invalid than the provided data tree input, so if the input data tree is invalid, result will
799 * be also invalid and the process of adding default values could be incomplete.
800 *
801 * Since default nodes are also needed by the validation process, to optimize your application you can add default
802 * values directly in lyd_validate() and lyd_parse*() functions using appropriate options value. By default, these
Michal Vaskod88863c2016-05-04 13:17:44 +0200803 * functions remove the default nodes at the end of their processing.
Radek Krejci8100ca22016-03-29 10:32:58 +0200804 *
Michal Vaskod88863c2016-05-04 13:17:44 +0200805 * \p ctx parameter and \p options with #LYD_OPT_NOSIBLINGS values can result in 4 different scenarios:
806 *
807 * - If \p ctx is set and \p options include #LYD_OPT_NOSIBLINGS, tree default nodes will be added ONLY to \p root,
808 * top-level default nodes will be added from ALL the modules (so it has no effect for #LYD_WD_TRIM).
809 * - If \p ctx is set and \p options do not include #LYD_OPT_NOSIBLINGS, tree default values will be added to ALL
810 * the \p root siblings, top-level nodes will be added from ALL the modules.
811 * - If \p ctx is NULL and \p options include #LYD_OPT_NOSIBLINGS, tree default nodes will be added ONLY to \p root,
812 * top-level default nodes will be added ONLY from the module of \p root.
813 * - If \p ctx is NULL and \p options do not include #LYD_OPT_NOSIBLINGS, tree default nodes will be added to ALL
814 * the \p root siblings, top-level default nodes will be added from ALL the \p root siblings modules.
815 *
816 * @param[in] ctx Optional parameter. Exact meaning described in this function description last paragraph.
Radek Krejci7b4309c2016-03-23 10:30:29 +0100817 * @param[in] root Data tree root. In case of #LYD_WD_TRIM the data tree can be modified so the root can be changed or
818 * removed. In other modes and with empty data tree, new default nodes can be created so the root pointer
819 * will contain/return the newly created data tree.
Radek Krejci8100ca22016-03-29 10:32:58 +0200820 * @param[in] options Options for the inserting data to the target data tree options, see @ref parseroptions - only the
Radek Krejci7b4309c2016-03-23 10:30:29 +0100821 * LYD_WD_* options are used to select functionality:
822 * - #LYD_WD_TRIM - remove all nodes that have value equal to their default value
Radek Krejcif6ab2cd2016-04-18 17:15:26 +0200823 * - #LYD_WD_EXPLICIT - add only status default nodes
824 * - #LYD_WD_ALL - add all (status as well as config) default nodes
Radek Krejci7b4309c2016-03-23 10:30:29 +0100825 * - #LYD_WD_ALL_TAG - add default nodes and add attribute 'default' with value 'true' to all nodes having their default value
826 * - #LYD_WD_IMPL_TAG - add default nodes, but add attribute 'default' only to the added nodes
Radek Krejci8100ca22016-03-29 10:32:58 +0200827 * @note The LYD_WD_*_TAG modes require to have ietf-netconf-with-defaults module in the context of the data tree.
Radek Krejci1eefeb32016-04-15 16:01:46 +0200828 * @note If you already added some tagged default nodes (by parser or previous call of lyd_validate()), you should
829 * specify the same LYD_WD_*_TAG in all subsequent call to lyd_validate(). Otherwise, the tagged nodes will be removed.
Radek Krejci7b4309c2016-03-23 10:30:29 +0100830 * @return EXIT_SUCCESS ot EXIT_FAILURE
831 */
832int lyd_wd_add(struct ly_ctx *ctx, struct lyd_node **root, int options);
833
834/**
Radek Krejci1eefeb32016-04-15 16:01:46 +0200835 * @brief Remove all default nodes, respectively all nodes with set ::lyd_node#dflt added by
836 * #LYD_WD_ALL_TAG or #LYD_WD_IMPL_TAG options in lyd_wd_add(), lyd_validate() or lyd_parse_*() functions.
Radek Krejci6b8f6ac2016-03-23 12:33:04 +0100837 *
838 * @param[in] root Data tree root. The data tree can be modified so the root can be changed or completely removed.
Radek Krejci74150cd2016-03-29 15:53:16 +0200839 * @param[in] options Options for the inserting data to the target data tree options, see @ref parseroptions.
Radek Krejci1eefeb32016-04-15 16:01:46 +0200840 * If #LYD_WD_EXPLICIT is found in options, the default status nodes are kept, so it is better to
841 * erase all LYD_WD_* flags from the value.
Radek Krejci6b8f6ac2016-03-23 12:33:04 +0100842 * @return EXIT_SUCCESS or EXIT_FAILURE
843 */
Radek Krejci74150cd2016-03-29 15:53:16 +0200844int lyd_wd_cleanup(struct lyd_node **root, int options);
Radek Krejci6b8f6ac2016-03-23 12:33:04 +0100845
846/**
Michal Vasko55f60be2015-10-14 13:12:58 +0200847 * @brief Unlink the specified data subtree. All referenced namespaces are copied.
Michal Vasko2d162e12015-09-24 14:33:29 +0200848 *
849 * Note, that the node's connection with the schema tree is kept. Therefore, in case of
850 * reconnecting the node to a data tree using lyd_paste() it is necessary to paste it
851 * to the appropriate place in the data tree following the schema.
852 *
853 * @param[in] node Data tree node to be unlinked (together with all children).
854 * @return 0 for success, nonzero for error
855 */
856int lyd_unlink(struct lyd_node *node);
857
858/**
859 * @brief Free (and unlink) the specified data (sub)tree.
860 *
861 * @param[in] node Root of the (sub)tree to be freed.
862 */
863void lyd_free(struct lyd_node *node);
864
865/**
Radek Krejci81468402016-01-07 13:52:40 +0100866 * @brief Free (and unlink) the specified data (sub)tree and all its siblings (preceding as well as following).
867 *
868 * @param[in] node One of the siblings root element of the (sub)trees to be freed.
869 */
870void lyd_free_withsiblings(struct lyd_node *node);
871
872/**
Radek Krejci134610e2015-10-20 17:15:34 +0200873 * @brief Insert attribute into the data node.
874 *
875 * @param[in] parent Data node where to place the attribute
Radek Krejci70ecd722016-03-21 09:04:00 +0100876 * @param[in] mod An alternative way to specify attribute's module (namespace) used in case the \p name does
877 * not include prefix. If neither prefix in the \p name nor mod is specified, the attribute's
878 * module is inherited from the \p parent node. It is not allowed to have attributes with no
879 * module (namespace).
880 * @param[in] name Attribute name. The string can include the attribute's module (namespace) as the name's
881 * prefix (prefix:name). Prefix must be the name of one of the schema in the \p parent's context.
882 * If the prefix is not specified, the \p mod parameter is used. If neither of these parameters is
883 * usable, attribute inherits module (namespace) from the \p parent node. It is not allowed to
884 * have attributes with no module (namespace).
Radek Krejci134610e2015-10-20 17:15:34 +0200885 * @param[in] value Attribute value
886 * @return pointer to the created attribute (which is already connected in \p parent) or NULL on error.
887 */
Radek Krejci70ecd722016-03-21 09:04:00 +0100888struct lyd_attr *lyd_insert_attr(struct lyd_node *parent, const struct lys_module *mod, const char *name,
889 const char *value);
Radek Krejci134610e2015-10-20 17:15:34 +0200890
891/**
Radek Krejci88f29302015-10-30 15:42:33 +0100892 * @brief Destroy data attribute
893 *
894 * If the attribute to destroy is a member of a node attribute list, it is necessary to
895 * provide the node itself as \p parent to keep the list consistent.
896 *
897 * @param[in] ctx Context where the attribute was created (usually it is the context of the \p parent)
898 * @param[in] parent Parent node where the attribute is placed
899 * @param[in] attr Attribute to destroy
900 * @param[in] recursive Zero to destroy only the attribute, non-zero to destroy also all the subsequent attributes
901 * in the list.
902 */
903void lyd_free_attr(struct ly_ctx *ctx, struct lyd_node *parent, struct lyd_attr *attr, int recursive);
904
905/**
Radek Krejci6910a032016-04-13 10:06:21 +0200906 * @brief Return main module of the data tree node.
907 *
908 * In case of regular YANG module, it returns ::lys_node#module pointer,
909 * but in case of submodule, it returns pointer to the main module.
910 *
911 * @param[in] node Data tree node to be examined
912 * @return pointer to the main module (schema structure), NULL in case of error.
913 */
914struct lys_module *lyd_node_module(const struct lyd_node *node);
915
916/**
Radek Krejcidef50022016-02-01 16:38:32 +0100917* @brief Print data tree in the specified format.
918*
919* Same as lyd_print(), but it allocates memory and store the data into it.
920* It is up to caller to free the returned string by free().
921*
922* @param[out] strp Pointer to store the resulting dump.
923* @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
924* node of the data tree to print the specific subtree.
925* @param[in] format Data output format.
926* @param[in] options [printer flags](@ref printerflags).
927* @return 0 on success, 1 on failure (#ly_errno is set).
928*/
929int lyd_print_mem(char **strp, const struct lyd_node *root, LYD_FORMAT format, int options);
Michal Vasko2d162e12015-09-24 14:33:29 +0200930
931/**
Radek Krejcidef50022016-02-01 16:38:32 +0100932 * @brief Print data tree in the specified format.
Michal Vasko2d162e12015-09-24 14:33:29 +0200933 *
Radek Krejcidef50022016-02-01 16:38:32 +0100934 * Same as lyd_print(), but output is written into the specified file descriptor.
935 *
936 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
937 * node of the data tree to print the specific subtree.
938 * @param[in] fd File descriptor where to print the data.
939 * @param[in] format Data output format.
940 * @param[in] options [printer flags](@ref printerflags).
941 * @return 0 on success, 1 on failure (#ly_errno is set).
Michal Vasko2d162e12015-09-24 14:33:29 +0200942 */
Radek Krejcidef50022016-02-01 16:38:32 +0100943int lyd_print_fd(int fd, const struct lyd_node *root, LYD_FORMAT format, int options);
944
945/**
946 * @brief Print data tree in the specified format.
947 *
948 * To write data into a file descriptor, use lyd_print_fd().
949 *
950 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
951 * node of the data tree to print the specific subtree.
952 * @param[in] f File stream where to print the data.
953 * @param[in] format Data output format.
954 * @param[in] options [printer flags](@ref printerflags).
955 * @return 0 on success, 1 on failure (#ly_errno is set).
956 */
957int lyd_print_file(FILE *f, const struct lyd_node *root, LYD_FORMAT format, int options);
958
959/**
960 * @brief Print data tree in the specified format.
961 *
962 * Same as lyd_print(), but output is written via provided callback.
963 *
964 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
965 * node of the data tree to print the specific subtree.
966 * @param[in] writeclb Callback function to write the data (see write(1)).
967 * @param[in] arg Optional caller-specific argument to be passed to the \p writeclb callback.
968 * @param[in] format Data output format.
969 * @param[in] options [printer flags](@ref printerflags).
970 * @return 0 on success, 1 on failure (#ly_errno is set).
971 */
972int lyd_print_clb(ssize_t (*writeclb)(void *arg, const void *buf, size_t count), void *arg,
973 const struct lyd_node *root, LYD_FORMAT format, int options);
Michal Vasko2d162e12015-09-24 14:33:29 +0200974
Michal Vasko2d162e12015-09-24 14:33:29 +0200975/**@} */
976
977#ifdef __cplusplus
978}
979#endif
980
981#endif /* LY_TREE_DATA_H_ */