blob: c66ca906775e041ca51f5da904175258312710d2 [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
Michal Vaskofcd974b2017-08-22 10:17:49 +020021#include "libyang.h"
Mislav Novakovice251a652015-09-29 08:40:12 +020022#include "tree_schema.h"
Radek Krejcidef50022016-02-01 16:38:32 +010023#include "xml.h"
Mislav Novakovice251a652015-09-29 08:40:12 +020024
Michal Vasko2d162e12015-09-24 14:33:29 +020025#ifdef __cplusplus
26extern "C" {
27#endif
28
29/**
Radek Krejcidef50022016-02-01 16:38:32 +010030 * @defgroup datatree Data Tree
Michal Vasko2d162e12015-09-24 14:33:29 +020031 * @{
Radek Krejcidef50022016-02-01 16:38:32 +010032 *
33 * Data structures and functions to manipulate and access instance data tree.
Michal Vasko2d162e12015-09-24 14:33:29 +020034 */
35
36/**
Radek Krejcidef50022016-02-01 16:38:32 +010037 * @brief Data input/output formats supported by libyang [parser](@ref howtodataparsers) and
38 * [printer](@ref howtodataprinters) functions.
Michal Vasko2d162e12015-09-24 14:33:29 +020039 */
40typedef enum {
41 LYD_UNKNOWN, /**< unknown format, used as return value in case of error */
42 LYD_XML, /**< XML format of the instance data */
43 LYD_JSON, /**< JSON format of the instance data */
Michal Vasko1e82a3b2018-07-03 12:16:58 +020044 LYD_LYB, /**< LYB format of the instance data */
Michal Vasko2d162e12015-09-24 14:33:29 +020045} LYD_FORMAT;
46
47/**
Radek Krejci45826012016-08-24 15:07:57 +020048 * @brief List of possible value types stored in ::lyd_node_anydata.
49 */
50typedef enum {
Radek Krejci83bf1402016-09-27 15:05:20 +020051 LYD_ANYDATA_CONSTSTRING = 0x00, /**< value is constant string (const char *) which is internally duplicated for
52 storing in the anydata structure; XML sensitive characters (such as & or \>)
Radek Krejcie534c132016-11-23 13:32:31 +010053 are automatically escaped when the anydata is printed in XML format. */
Radek Krejci83bf1402016-09-27 15:05:20 +020054 LYD_ANYDATA_STRING = 0x01, /**< value is dynamically allocated string (char*), so the data are used directly
55 without duplication and caller is supposed to not manipulate with the data
56 after a successful call (including calling free() on the provided data); XML
57 sensitive characters (such as & or \>) are automatically escaped when the
58 anydata is printed in XML format */
59 LYD_ANYDATA_JSON = 0x02, /**< value is string containing the data modeled by YANG and encoded as I-JSON. The
60 string is handled as constant string. In case of using the value as input
61 parameter, the #LYD_ANYDATA_JSOND can be used for dynamically allocated
62 string. */
63 LYD_ANYDATA_JSOND = 0x03, /**< In case of using value as input parameter, this enumeration is supposed to be
64 used for dynamically allocated strings (it is actually combination of
65 #LYD_ANYDATA_JSON and #LYD_ANYDATA_STRING (and it can be also specified as
66 ORed value of the mentioned values. */
67 LYD_ANYDATA_SXML = 0x04, /**< value is string containing the serialized XML data. The string is handled as
68 constant string. In case of using the value as input parameter, the
69 #LYD_ANYDATA_SXMLD can be used for dynamically allocated string. */
70 LYD_ANYDATA_SXMLD = 0x05, /**< In case of using serialized XML value as input parameter, this enumeration is
71 supposed to be used for dynamically allocated strings (it is actually
72 combination of #LYD_ANYDATA_SXML and #LYD_ANYDATA_STRING (and it can be also
73 specified as ORed value of the mentioned values). */
74 LYD_ANYDATA_XML = 0x08, /**< value is struct lyxml_elem*, the structure is directly connected into the
75 anydata node without duplication, caller is supposed to not manipulate with the
76 data after a successful call (including calling lyxml_free() on the provided
77 data) */
78 LYD_ANYDATA_DATATREE = 0x10, /**< value is struct lyd_node* (first sibling), the structure is directly connected
79 into the anydata node without duplication, caller is supposed to not manipulate
80 with the data after a successful call (including calling lyd_free() on the
81 provided data) */
Michal Vaskodcaf7222018-08-08 16:27:00 +020082 LYD_ANYDATA_LYB = 0x20, /**< value is a memory with serialized data tree in LYB format. The data are handled
83 as a constant string. In case of using the value as input parameter,
84 the #LYD_ANYDATA_LYBD can be used for dynamically allocated string. */
85 LYD_ANYDATA_LYBD = 0x21, /**< In case of using LYB value as input parameter, this enumeration is
86 supposed to be used for dynamically allocated strings (it is actually
87 combination of #LYD_ANYDATA_LYB and #LYD_ANYDATA_STRING (and it can be also
88 specified as ORed value of the mentioned values). */
Radek Krejci45826012016-08-24 15:07:57 +020089} LYD_ANYDATA_VALUETYPE;
90
91/**
Michal Vasko2d162e12015-09-24 14:33:29 +020092 * @brief node's value representation
93 */
94typedef union lyd_value_u {
95 const char *binary; /**< base64 encoded, NULL terminated string */
Michal Vasko8ea2b7f2015-09-29 14:30:53 +020096 struct lys_type_bit **bit; /**< bitmap of pointers to the schema definition of the bit value that are set,
97 its size is always the number of defined bits in the schema */
Radek Krejci489773c2015-12-17 13:20:03 +010098 int8_t bln; /**< 0 as false, 1 as true */
Michal Vasko2d162e12015-09-24 14:33:29 +020099 int64_t dec64; /**< decimal64: value = dec64 / 10^fraction-digits */
100 struct lys_type_enum *enm; /**< pointer to the schema definition of the enumeration value */
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200101 struct lys_ident *ident; /**< pointer to the schema definition of the identityref value */
Radek Krejci40f17b92016-02-03 14:30:43 +0100102 struct lyd_node *instance; /**< pointer to the instance-identifier target, note that if the tree was modified,
103 the target (address) can be invalid - the pointer is correctly checked and updated
104 by lyd_validate() */
Michal Vasko2d162e12015-09-24 14:33:29 +0200105 int8_t int8; /**< 8-bit signed integer */
106 int16_t int16; /**< 16-bit signed integer */
107 int32_t int32; /**< 32-bit signed integer */
108 int64_t int64; /**< 64-bit signed integer */
109 struct lyd_node *leafref; /**< pointer to the referenced leaf/leaflist instance in data tree */
110 const char *string; /**< string */
111 uint8_t uint8; /**< 8-bit unsigned integer */
112 uint16_t uint16; /**< 16-bit signed integer */
113 uint32_t uint32; /**< 32-bit signed integer */
114 uint64_t uint64; /**< 64-bit signed integer */
Michal Vaskoc6cd3f02018-03-02 14:07:42 +0100115 void *ptr; /**< arbitrary data stored using a type plugin */
Michal Vasko2d162e12015-09-24 14:33:29 +0200116} lyd_val;
117
118/**
Radek Krejcia571d942017-02-24 09:26:49 +0100119 * @brief Attribute structure.
120 *
121 * The structure provides information about attributes of a data element. Such attributes must map to
122 * annotations as specified in RFC 7952. The only exception is the filter type (in NETCONF get operations)
Renato Westphal99fded72018-10-22 14:44:24 -0200123 * and edit-config's operation attributes. In XML, they are represented as standard XML attributes. In JSON,
Radek Krejcia571d942017-02-24 09:26:49 +0100124 * they are represented as JSON elements starting with the '@' character (for more information, see the
125 * YANG metadata RFC.
126 *
127 */
128struct lyd_attr {
129 struct lyd_node *parent; /**< data node where the attribute is placed */
130 struct lyd_attr *next; /**< pointer to the next attribute of the same element */
131 struct lys_ext_instance_complex *annotation; /**< pointer to the attribute/annotation's definition */
132 const char *name; /**< attribute name */
133 const char *value_str; /**< string representation of value (for comparison, printing,...), always corresponds to value_type */
134 lyd_val value; /**< node's value representation, always corresponds to schema->type.base */
Michal Vasko70bf8e52018-03-26 11:32:33 +0200135 LY_DATA_TYPE _PACKED value_type; /**< type of the value in the node, mainly for union to avoid repeating of type detection */
Michal Vasko101658e2018-06-05 15:05:54 +0200136 uint8_t value_flags; /**< value type flags */
Radek Krejcia571d942017-02-24 09:26:49 +0100137};
138
139/**
Radek Krejcica7efb72016-01-18 13:06:01 +0100140 * @defgroup validityflags Validity flags
141 * @ingroup datatree
142 *
143 * Validity flags for data nodes.
144 *
145 * @{
146 */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100147#define LYD_VAL_OK 0x00 /**< Node is successfully validated including whole subtree */
Michal Vasko185b5272018-09-13 14:26:12 +0200148#define LYD_VAL_DUP 0x01 /**< Instance duplication must be checked again, applicable only to ::lys_node_list and
149 ::lys_node_leaf_list data nodes */
150#define LYD_VAL_UNIQUE 0x02 /**< Unique value(s) changed, applicable only to ::lys_node_list data nodes */
151#define LYD_VAL_MAND 0x04 /**< Some child added/removed and it is needed to perform check for mandatory
Radek Krejcid788a522016-07-25 14:57:38 +0200152 node or min/max constraints of direct list/leaflist children, applicable only
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100153 to ::lys_node_list and ::lys_node_container data nodes, but if on any other node
154 except ::lys_node_leaflist, it means checking that data node for duplicities.
155 Additionally, it can be set on truly any node type and then status references
156 are checked for this node if flag #LYD_OPT_OBSOLETE is used. */
Michal Vasko185b5272018-09-13 14:26:12 +0200157#define LYD_VAL_LEAFREF 0x08 /**< Node is a leafref, which needs to be resolved (it is invalid, new possible
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100158 resolvent, or something similar) */
159#define LYD_VAL_INUSE 0x80 /**< Internal flag for note about various processing on data, should be used only
160 internally and removed before libyang returns the node to the caller */
Radek Krejcica7efb72016-01-18 13:06:01 +0100161/**
162 * @}
163 */
164
165/**
Michal Vasko2d162e12015-09-24 14:33:29 +0200166 * @brief Generic structure for a data node, directly applicable to the data nodes defined as #LYS_CONTAINER, #LYS_LIST
167 * and #LYS_CHOICE.
168 *
169 * Completely fits to containers and choices and is compatible (can be used interchangeably except the #child member)
170 * with all other lyd_node_* structures. All data nodes are provides as ::lyd_node structure by default.
171 * According to the schema's ::lys_node#nodetype member, the specific object is supposed to be cast to
Radek Krejcibf2abff2016-08-23 15:51:52 +0200172 * ::lyd_node_leaf_list or ::lyd_node_anydata structures. This structure fits only to #LYS_CONTAINER, #LYS_LIST and
Radek Krejcica7efb72016-01-18 13:06:01 +0100173 * #LYS_CHOICE values.
Michal Vasko2d162e12015-09-24 14:33:29 +0200174 *
Michal Vaskoc30c95a2018-08-01 14:35:54 +0200175 * To traverse all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro. To traverse
176 * the whole subtree, use #LY_TREE_DFS_BEGIN macro.
Michal Vasko2d162e12015-09-24 14:33:29 +0200177 */
178struct lyd_node {
179 struct lys_node *schema; /**< pointer to the schema definition of this node */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100180 uint8_t validity; /**< [validity flags](@ref validityflags) */
Michal Vaskoe77dc992017-01-18 12:09:42 +0100181 uint8_t dflt:1; /**< flag for implicit default node */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100182 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 +0100183 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200184
185 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
186 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
187 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
188 never NULL. If there is no sibling node, pointer points to the node
189 itself. In case of the first node, this pointer points to the last
190 node in the list. */
191 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
Michal Vasko24affa02018-04-03 09:06:06 +0200192
Michal Vaskod025ee32018-06-28 10:04:19 +0200193#ifdef LY_ENABLED_LYD_PRIV
194 void *priv; /**< private user data, not used by libyang */
195#endif
196
Michal Vasko24affa02018-04-03 09:06:06 +0200197#ifdef LY_ENABLED_CACHE
198 uint32_t hash; /**< hash of this particular node (module name + schema name + key string values if list) */
199 struct hash_table *ht; /**< hash table with all the direct children (except keys for a list, lists without keys) */
200#endif
201
Michal Vasko2d162e12015-09-24 14:33:29 +0200202 struct lyd_node *child; /**< pointer to the first child node \note Since other lyd_node_*
Radek Krejciee360892015-10-06 11:23:14 +0200203 structures represent end nodes, this member
Michal Vasko2d162e12015-09-24 14:33:29 +0200204 is replaced in those structures. Therefore, be careful with accessing
205 this member without having information about the node type from the schema's
206 ::lys_node#nodetype member. */
207};
208
209/**
Michal Vasko4c183312015-09-25 10:41:47 +0200210 * @brief Structure for data nodes defined as #LYS_LEAF or #LYS_LEAFLIST.
Michal Vasko2d162e12015-09-24 14:33:29 +0200211 *
Michal Vasko4c183312015-09-25 10:41:47 +0200212 * Extension for ::lyd_node structure. It replaces the ::lyd_node#child member by
213 * three new members (#value, #value_str and #value_type) to provide
214 * information about the value. The first five members (#schema, #attr, #next,
Michal Vasko2d162e12015-09-24 14:33:29 +0200215 * #prev and #parent) are compatible with the ::lyd_node's members.
216 *
217 * To traverse through all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro.
218 */
Michal Vasko4c183312015-09-25 10:41:47 +0200219struct lyd_node_leaf_list {
Michal Vasko2d162e12015-09-24 14:33:29 +0200220 struct lys_node *schema; /**< pointer to the schema definition of this node which is ::lys_node_leaflist
221 structure */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100222 uint8_t validity; /**< [validity flags](@ref validityflags) */
Michal Vaskoe77dc992017-01-18 12:09:42 +0100223 uint8_t dflt:1; /**< flag for implicit default node */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100224 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 +0100225 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200226
227 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
228 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
229 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
230 never NULL. If there is no sibling node, pointer points to the node
231 itself. In case of the first node, this pointer points to the last
232 node in the list. */
233 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
234
Michal Vaskod025ee32018-06-28 10:04:19 +0200235#ifdef LY_ENABLED_LYD_PRIV
236 void *priv; /**< private user data, not used by libyang */
237#endif
238
Michal Vasko24affa02018-04-03 09:06:06 +0200239#ifdef LY_ENABLED_CACHE
240 uint32_t hash; /**< hash of this particular node (module name + schema name + string value if leaf-list) */
241#endif
242
Michal Vasko2d162e12015-09-24 14:33:29 +0200243 /* struct lyd_node *child; should be here, but is not */
244
245 /* leaflist's specific members */
Michal Vasko6a027702016-06-30 10:32:14 +0200246 const char *value_str; /**< string representation of value (for comparison, printing,...), always corresponds to value_type */
247 lyd_val value; /**< node's value representation, always corresponds to schema->type.base */
Michal Vasko70bf8e52018-03-26 11:32:33 +0200248 LY_DATA_TYPE _PACKED value_type; /**< type of the value in the node, mainly for union to avoid repeating of type detection */
Michal Vasko101658e2018-06-05 15:05:54 +0200249 uint8_t value_flags; /**< value type flags */
Michal Vasko2d162e12015-09-24 14:33:29 +0200250};
251
252/**
Michal Vasko101658e2018-06-05 15:05:54 +0200253 * @brief Flags for values
254 */
255#define LY_VALUE_UNRES 0x01 /**< flag for unresolved leafref or instance-identifier,
256 leafref - value union is filled as if being the target node's type,
257 instance-identifier - value union should not be accessed */
258#define LY_VALUE_USER 0x02 /**< flag for a user type stored value */
Renato Westphal99fded72018-10-22 14:44:24 -0200259/* 0x80 is reserved for internal use */
Michal Vasko101658e2018-06-05 15:05:54 +0200260
261/**
Radek Krejcibf2abff2016-08-23 15:51:52 +0200262 * @brief Structure for data nodes defined as #LYS_ANYDATA or #LYS_ANYXML.
Michal Vasko2d162e12015-09-24 14:33:29 +0200263 *
264 * Extension for ::lyd_node structure - replaces the ::lyd_node#child member by new #value member. The first five
265 * members (#schema, #attr, #next, #prev and #parent) are compatible with the ::lyd_node's members.
266 *
267 * To traverse through all the child elements or attributes, use #LY_TREE_FOR or #LY_TREE_FOR_SAFE macro.
268 */
Radek Krejcibf2abff2016-08-23 15:51:52 +0200269struct lyd_node_anydata {
270 struct lys_node *schema; /**< pointer to the schema definition of this node which is ::lys_node_anydata
Michal Vasko2d162e12015-09-24 14:33:29 +0200271 structure */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100272 uint8_t validity; /**< [validity flags](@ref validityflags) */
Michal Vaskoe77dc992017-01-18 12:09:42 +0100273 uint8_t dflt:1; /**< flag for implicit default node */
Radek Krejci0b7704f2016-03-18 12:16:14 +0100274 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 +0100275 do not use this value! */
Michal Vasko2d162e12015-09-24 14:33:29 +0200276
277 struct lyd_attr *attr; /**< pointer to the list of attributes of this node */
278 struct lyd_node *next; /**< pointer to the next sibling node (NULL if there is no one) */
279 struct lyd_node *prev; /**< pointer to the previous sibling node \note Note that this pointer is
280 never NULL. If there is no sibling node, pointer points to the node
281 itself. In case of the first node, this pointer points to the last
282 node in the list. */
283 struct lyd_node *parent; /**< pointer to the parent node, NULL in case of root node */
284
Michal Vaskod025ee32018-06-28 10:04:19 +0200285#ifdef LY_ENABLED_LYD_PRIV
286 void *priv; /**< private user data, not used by libyang */
287#endif
288
Michal Vasko24affa02018-04-03 09:06:06 +0200289#ifdef LY_ENABLED_CACHE
290 uint32_t hash; /**< hash of this particular node (module name + schema name) */
291#endif
292
Michal Vasko2d162e12015-09-24 14:33:29 +0200293 /* struct lyd_node *child; should be here, but is not */
294
295 /* anyxml's specific members */
Radek Krejci45826012016-08-24 15:07:57 +0200296 LYD_ANYDATA_VALUETYPE value_type;/**< type of the stored anydata value */
297 union {
298 const char *str; /**< string value, in case of printing as XML, characters like '<' or '&' are escaped */
Michal Vaskodcaf7222018-08-08 16:27:00 +0200299 char *mem; /**< raw memory (used for LYB format) */
Radek Krejci45826012016-08-24 15:07:57 +0200300 struct lyxml_elem *xml; /**< xml tree */
301 struct lyd_node *tree; /**< libyang data tree, does not change the root's parent, so it is not possible
302 to get from the data tree into the anydata/anyxml */
303 } value;
Michal Vasko2d162e12015-09-24 14:33:29 +0200304};
305
306/**
Renato Westphal99fded72018-10-22 14:44:24 -0200307 * @brief list of possible types of differences in #lyd_difflist
Radek Krejci991a3962016-05-05 15:00:14 +0200308 */
309typedef enum {
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200310 LYD_DIFF_END = 0, /**< end of the differences list */
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200311 LYD_DIFF_DELETED, /**< deleted node
312 - Node is present in the first tree, but not in the second tree.
313 - To make both trees the same the node in lyd_difflist::first can be deleted from the
314 first tree. The pointer at the same index in the lyd_difflist::second array is
Michal Vasko6407fca2018-04-24 09:44:11 +0200315 NULL.
316 - If the deleted node has some children, these do not appear in the resulting diff
317 separately. In other words, a deleted node is considered deleted with all
318 its children. */
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200319 LYD_DIFF_CHANGED, /**< value of a leaf or anyxml is changed, the lyd_difflist::first and lyd_difflist::second
320 points to the leaf/anyxml instances in the first and the second tree respectively. */
Radek Krejci22d2ca92016-05-17 16:23:51 +0200321 LYD_DIFF_MOVEDAFTER1, /**< user-ordered (leaf-)list item was moved.
322 - To make both trees the same, all #LYD_DIFF_MOVEDAFTER1 transactions must be applied
Radek Krejci9e6f0b82016-05-13 17:33:16 +0200323 to the first tree in the strict order they appear in the difflist. The
324 lyd_difflist::first points to the first tree node being moved and the
325 lyd_difflist::second points to the first tree node after which the first node is
326 supposed to be moved. If the second pointer is NULL, the node is being moved into
327 the beginning as the first node of the (leaf-)list instances. */
Radek Krejci22d2ca92016-05-17 16:23:51 +0200328 LYD_DIFF_CREATED, /**< newly created node
329 - Node is present in the second tree, but not in the first tree.
330 - To make both trees the same the node in lyd_difflist::second is supposed to be
331 inserted (copied via lyd_dup()) into the node (as a child) at the same index in the
332 lyd_difflist::first array (where is its parent). If the lyd_difflist::first at the
Michal Vasko6407fca2018-04-24 09:44:11 +0200333 index is NULL, the missing node is top-level.
334 - If the created node has some children, these do not appear in the resulting diff
335 separately. In other words, a created node is considered created with all
336 its children. */
Radek Krejci22d2ca92016-05-17 16:23:51 +0200337 LYD_DIFF_MOVEDAFTER2 /**< similar to LYD_DIFF_MOVEDAFTER1, but this time the moved item is in the second tree.
338 This type is always used in combination with (as a successor of) #LYD_DIFF_CREATED
Michal Vasko6a2597e2019-01-24 16:29:02 +0100339 as an instruction to move the newly created node to a specific position. If it is not
340 present, it means that even the parent of the user-ordered instances did not exist
341 (or was empty) so it is safe to just create the instances in the same order. Note,
342 that due to applicability to the second tree, the meaning of lyd_difflist:first and
Radek Krejci22d2ca92016-05-17 16:23:51 +0200343 lyd_difflist:second is inverse in comparison to #LYD_DIFF_MOVEDAFTER1. The
344 lyd_difflist::second points to the (previously) created node in the second tree and
345 the lyd_difflist::first points to the predecessor node in the second tree. If the
346 predecessor is NULL, the node is supposed to bes the first sibling. */
Radek Krejci991a3962016-05-05 15:00:14 +0200347} LYD_DIFFTYPE;
348
349/**
350 * @brief Structure for the result of lyd_diff(), describing differences between two data trees.
351 */
352struct lyd_difflist {
353 LYD_DIFFTYPE *type; /**< array of the differences types, terminated by #LYD_DIFF_END value. */
354 struct lyd_node **first; /**< array of nodes in the first tree for the specific type of difference, see the
355 description of #LYD_DIFFTYPE values for more information. */
356 struct lyd_node **second;/**< array of nodes in the second tree for the specific type of difference, see the
357 description of #LYD_DIFFTYPE values for more information. */
358};
359
360/**
361 * @brief Free the result of lyd_diff(). It frees the structure of the lyd_diff() result, not the referenced nodes.
362 *
363 * @param[in] diff The lyd_diff() result to free.
364 */
365void lyd_free_diff(struct lyd_difflist *diff);
366
367/**
368 * @brief Compare two data trees and provide list of differences.
369 *
370 * Note, that the \p first and the \p second must have the same schema parent (or they must be top-level elements).
371 * In case of using #LYD_OPT_NOSIBLINGS, they both must be instances of the same schema node.
372 *
Radek Krejci913100d2016-05-09 17:23:51 +0200373 * Order of the resulting set follows these rules:
Radek Krejci22d2ca92016-05-17 16:23:51 +0200374 * - To change the first tree into the second tree, the resulting transactions are supposed to be applied in the order
375 * they appear in the result. First, the changed (#LYD_DIFF_CHANGED) nodes are described followed by the deleted
376 * (#LYD_DIFF_DELETED) nodes. Then, the moving of the user-ordered nodes present in both trees (#LYD_DIFF_MOVEDAFTER1)
377 * follows and the last transactions in the results are the newly created (#LYD_DIFF_CREATED) nodes. These nodes are
378 * supposed to be added as the last siblings, but in some case they can need additional move. In such a case, the
379 * #LYD_DIFF_MOVEDAFTER2 transactions can appear.
380 * - The order of the changed (#LYD_DIFF_CHANGED) and created (#LYD_DIFF_CREATED) follows the nodes order in the
381 * second tree - the current siblings are processed first and then the children are processed. Note, that this is
382 * actually not the BFS:
Radek Krejci9e47ddf2016-05-18 15:01:09 +0200383 *
Radek Krejci913100d2016-05-09 17:23:51 +0200384 * 1 2
385 * / \ / \
386 * 3 4 7 8
387 * / \
388 * 5 6
Radek Krejci9e47ddf2016-05-18 15:01:09 +0200389 *
Radek Krejci22d2ca92016-05-17 16:23:51 +0200390 * - The order of the deleted (#LYD_DIFF_DELETED) nodes is the DFS:
Radek Krejci9e47ddf2016-05-18 15:01:09 +0200391 *
392 * 1 6
393 * / \ / \
394 * 2 5 7 8
395 * / \
396 * 3 4
Radek Krejci913100d2016-05-09 17:23:51 +0200397 *
398 * To change the first tree into the second one, it is necessary to follow the order of transactions described in
399 * the result. Note, that it is not possible just to use the transactions in the reverse order to transform the
400 * second tree into the first one. The transactions can be generalized (to be used on a different instance of the
401 * first tree) using lyd_path() to get identifiers for the nodes used in the transactions.
402 *
Radek Krejci9a6a5dd2016-05-05 15:56:24 +0200403 * @param[in] first The first (sub)tree to compare. Without #LYD_OPT_NOSIBLINGS option, all siblings are
Radek Krejci4c3bc112016-05-19 15:09:03 +0200404 * taken into comparison. If NULL, all the \p second nodes are supposed to be top level and they will
405 * be marked as #LYD_DIFF_CREATED.
Radek Krejci9a6a5dd2016-05-05 15:56:24 +0200406 * @param[in] second The second (sub)tree to compare. Without #LYD_OPT_NOSIBLINGS option, all siblings are
Radek Krejci4c3bc112016-05-19 15:09:03 +0200407 * taken into comparison. If NULL, all the \p first nodes will be marked as #LYD_DIFF_DELETED.
Radek Krejci99d737f2016-09-06 11:19:52 +0200408 * @param[in] options The @ref diffoptions are accepted.
Radek Krejci991a3962016-05-05 15:00:14 +0200409 * @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 +0200410 * 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 +0200411 */
412struct lyd_difflist *lyd_diff(struct lyd_node *first, struct lyd_node *second, int options);
413
414/**
Radek Krejci99d737f2016-09-06 11:19:52 +0200415 * @defgroup diffoptions Diff options
416 * @ingroup datatree
417 *
418 * @{
419 */
420/* LYD_DIFFOPT_NOSIBLINGS value is the same as LYD_OPT_NOSIBLINGS due to backward compatibility. The LYD_OPT_NOSIBLINGS
421 * was used previously as an option for lyd_diff(). */
422#define LYD_DIFFOPT_NOSIBLINGS 0x0800 /**< The both trees to diff have to instantiate the same schema node so only the
423 single subtree is compared. */
424#define LYD_DIFFOPT_WITHDEFAULTS 0x0001 /**< Take default nodes with their values into account and handle them as part
Michal Vaskoe6ff4282017-02-07 15:13:36 +0100425 of both trees. Summary of the modified behavior:
426 - deleted node is replaced with implicit default node - #LYD_DIFF_CHANGED instead delete
427 - created node replaces an implicit default node - #LYD_DIFF_CHANGED instead create
428 - in both cases even if the values match - #LYD_DIFF_CHANGED is still returned, because dlft flag was changed
429 Note that in this case, applying the resulting
Radek Krejci99d737f2016-09-06 11:19:52 +0200430 transactions on the first tree does not result to the exact second tree,
431 because instead of having implicit default nodes you are going to have
432 explicit default nodes. */
433/**@} diffoptions */
434
435/**
Michal Vasko50576712017-07-28 12:28:33 +0200436 * @brief Build data path (usable as path, see @ref howtoxpath) of the data node.
Radek Krejci6d538282016-05-05 14:24:12 +0200437 * @param[in] node Data node to be processed. Note that the node should be from a complete data tree, having a subtree
438 * (after using lyd_unlink()) can cause generating invalid paths.
439 * @return NULL on error, on success the buffer for the resulting path is allocated and caller is supposed to free it
440 * with free().
441 */
Michal Vasko5efa25c2017-01-10 11:34:30 +0100442char *lyd_path(const struct lyd_node *node);
443
444/**
Radek Krejcidef50022016-02-01 16:38:32 +0100445 * @defgroup parseroptions Data parser options
446 * @ingroup datatree
447 *
448 * Various options to change the data tree parsers behavior.
449 *
450 * Default behavior:
451 * - in case of XML, parser reads all data from its input (file, memory, XML tree) including the case of not well-formed
452 * XML document (multiple top-level elements) and if there is an unknown element, it is skipped including its subtree
453 * (see the next point). This can be changed by the #LYD_OPT_NOSIBLINGS option which make parser to read only a single
454 * tree (with a single root element) from its input.
455 * - parser silently ignores the data without a matching node in schema trees. If the caller want to stop
456 * parsing in case of presence of unknown data, the #LYD_OPT_STRICT can be used. The strict mode is useful for
457 * NETCONF servers, since NETCONF clients should always send data according to the capabilities announced by the server.
458 * On the other hand, the default non-strict mode is useful for clients receiving data from NETCONF server since
459 * clients are not required to understand everything the server does. Of course, the optimal strategy for clients is
460 * to use filtering to get only the required data. Having an unknown element of the known namespace is always an error.
461 * The behavior can be changed by #LYD_OPT_STRICT option.
462 * - using obsolete statements (status set to obsolete) just generates a warning, but the processing continues. The
463 * behavior can be changed by #LYD_OPT_OBSOLETE option.
464 * - parser expects that the provided data provides complete datastore content (both the configuration and state data)
465 * and performs data validation according to all YANG rules. This can be a problem in case of representing NETCONF's
466 * subtree filter data, edit-config's data or other type of data set - such data do not represent a complete data set
467 * and some of the validation rules can fail. Therefore there are other options (within lower 8 bits) to make parser
468 * to accept such a data.
Michal Vaskobbc43b12018-10-12 09:22:00 +0200469 * - when parser evaluates when-stmt condition to false, a validation error is raised. If the
470 * #LYD_OPT_WHENAUTODEL is used, the invalid node is silently removed instead of an error. The option (and also this default
Radek Krejcif3c218d2016-03-24 12:40:08 +0100471 * behavior) takes effect only in case of #LYD_OPT_DATA or #LYD_OPT_CONFIG type of data.
Radek Krejcidef50022016-02-01 16:38:32 +0100472 * @{
473 */
474
475#define LYD_OPT_DATA 0x00 /**< Default type of data - complete datastore content with configuration as well as
Radek Krejci06f8bb92017-08-02 15:36:25 +0200476 state data. To handle possibly missing (but by default required) ietf-yang-library
477 data, use #LYD_OPT_DATA_NO_YANGLIB or #LYD_OPT_DATA_ADD_YANGLIB options. */
Radek Krejcidef50022016-02-01 16:38:32 +0100478#define LYD_OPT_CONFIG 0x01 /**< A configuration datastore - complete datastore without state data.
479 Validation modifications:
480 - status data are not allowed */
481#define LYD_OPT_GET 0x02 /**< Data content from a NETCONF reply message to the NETCONF \<get\> operation.
482 Validation modifications:
483 - mandatory nodes can be omitted
Michal Vasko62671b92017-01-02 13:08:57 +0100484 - leafrefs and instance-identifier resolution is allowed to fail
Michal Vaskoebf7df22017-03-28 16:08:07 +0200485 - list's keys/unique nodes are not required (so duplication is not checked)
486 - must and when evaluation skipped */
Radek Krejcidef50022016-02-01 16:38:32 +0100487#define LYD_OPT_GETCONFIG 0x04 /**< Data content from a NETCONF reply message to the NETCONF \<get-config\> operation
488 Validation modifications:
489 - mandatory nodes can be omitted
Michal Vasko62671b92017-01-02 13:08:57 +0100490 - leafrefs and instance-identifier resolution is allowed to fail
Radek Krejcidef50022016-02-01 16:38:32 +0100491 - list's keys/unique nodes are not required (so duplication is not checked)
Michal Vaskoebf7df22017-03-28 16:08:07 +0200492 - must and when evaluation skipped
Radek Krejcidef50022016-02-01 16:38:32 +0100493 - status data are not allowed */
494#define LYD_OPT_EDIT 0x08 /**< Content of the NETCONF \<edit-config\>'s config element.
495 Validation modifications:
496 - mandatory nodes can be omitted
Michal Vasko62671b92017-01-02 13:08:57 +0100497 - leafrefs and instance-identifier resolution is allowed to fail
Michal Vaskoebf7df22017-03-28 16:08:07 +0200498 - must and when evaluation skipped
Radek Krejcidef50022016-02-01 16:38:32 +0100499 - status data are not allowed */
Michal Vasko75250262017-02-09 15:36:13 +0100500#define LYD_OPT_RPC 0x10 /**< Data represents RPC or action input parameters. */
501#define LYD_OPT_RPCREPLY 0x20 /**< Data represents RPC or action output parameters (maps to NETCONF <rpc-reply> data). */
Radek Krejcidef50022016-02-01 16:38:32 +0100502#define LYD_OPT_NOTIF 0x40 /**< Data represents an event notification data. */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100503#define LYD_OPT_NOTIF_FILTER 0x80 /**< Data represents a filtered event notification data.
504 Validation modification:
505 - the only requirement is that the data tree matches the schema tree */
PavolVican832f5432018-02-21 00:54:45 +0100506#define LYD_OPT_TYPEMASK 0x10000ff /**< Mask to filter data type options. Always only a single data type option (only
507 single bit from the lower 8 bits) can be set. */
Radek Krejcidef50022016-02-01 16:38:32 +0100508
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100509/* 0x100 reserved, used internally */
510#define LYD_OPT_STRICT 0x0200 /**< Instead of silent ignoring data without schema definition, raise an error. */
511#define LYD_OPT_DESTRUCT 0x0400 /**< Free the provided XML tree during parsing the data. With this option, the
Radek Krejci06f8bb92017-08-02 15:36:25 +0200512 provided XML tree is affected and all successfully parsed data are freed.
Radek Krejcidef50022016-02-01 16:38:32 +0100513 This option is applicable only to lyd_parse_xml() function. */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100514#define LYD_OPT_OBSOLETE 0x0800 /**< Raise an error when an obsolete statement (status set to obsolete) is used. */
515#define LYD_OPT_NOSIBLINGS 0x1000 /**< Parse only a single XML tree from the input. This option applies only to
Radek Krejcidef50022016-02-01 16:38:32 +0100516 XML input data. */
Michal Vaskoe3886bb2017-01-02 11:33:28 +0100517#define LYD_OPT_TRUSTED 0x2000 /**< Data comes from a trusted source and it is not needed to validate them. Data
Radek Krejci93fab982016-02-03 15:58:19 +0100518 are connected with the schema, but the most validation checks (mandatory nodes,
Michal Vaskod7f9bda2018-03-16 12:33:35 +0100519 list instance uniqueness, etc.) are not performed. This option does not make
520 sense for lyd_validate() so it is ignored by this function. */
Michal Vaskobbc43b12018-10-12 09:22:00 +0200521#define LYD_OPT_WHENAUTODEL 0x4000 /**< Automatically delete subtrees with false when-stmt condition. The flag is
522 applicable only in combination with #LYD_OPT_DATA and #LYD_OPT_CONFIG flags.
523 If used, libyang will not generate a validation error. */
Michal Vasko3cfa3182017-01-17 10:00:58 +0100524#define LYD_OPT_NOEXTDEPS 0x8000 /**< Allow external dependencies (external leafrefs, instance-identifiers, must,
Michal Vaskof6aa8612017-03-02 10:52:44 +0100525 and when) to not be resolved/satisfied during validation. */
Radek Krejci06f8bb92017-08-02 15:36:25 +0200526#define LYD_OPT_DATA_NO_YANGLIB 0x10000 /**< Ignore (possibly) missing ietf-yang-library data. Applicable only with #LYD_OPT_DATA. */
527#define LYD_OPT_DATA_ADD_YANGLIB 0x20000 /**< Add missing ietf-yang-library data into the validated data tree. Applicable
528 only with #LYD_OPT_DATA. If some ietf-yang-library data are present, they are
529 preserved and option is ignored. */
Michal Vasko20555d82018-12-12 16:30:50 +0100530#define LYD_OPT_VAL_DIFF 0x40000 /**< Flag only for validation, store all the data node changes performed by the validation
531 in a diff structure. */
PavolVican832f5432018-02-21 00:54:45 +0100532#define LYD_OPT_DATA_TEMPLATE 0x1000000 /**< Data represents YANG data template. */
Radek Krejcidef50022016-02-01 16:38:32 +0100533
534/**@} parseroptions */
535
536/**
Michal Vasko299f9832017-01-06 13:29:22 +0100537 * @brief Parse (and validate) data from memory.
Radek Krejcidef50022016-02-01 16:38:32 +0100538 *
539 * In case of LY_XML format, the data string is parsed completely. It means that when it contains
540 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
541 * returned data node is a root of the first tree with other trees connected via the next pointer.
542 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
543 *
544 * @param[in] ctx Context to connect with the data tree being built here.
545 * @param[in] data Serialized data in the specified format.
546 * @param[in] format Format of the input data to be parsed.
Michal Vasko228431e2018-07-10 15:47:11 +0200547 * @param[in] options Parser options, see @ref parseroptions. \p format LYD_LYB uses #LYD_OPT_TRUSTED implicitly.
Michal Vasko6b44d712016-09-12 16:25:46 +0200548 * @param[in] ... Variable arguments depend on \p options. If they include:
549 * - #LYD_OPT_DATA:
550 * - #LYD_OPT_CONFIG:
551 * - #LYD_OPT_GET:
552 * - #LYD_OPT_GETCONFIG:
553 * - #LYD_OPT_EDIT:
554 * - no variable arguments expected.
555 * - #LYD_OPT_RPC:
556 * - #LYD_OPT_NOTIF:
557 * - struct lyd_node *data_tree - additional data tree that will be used
558 * when checking any "when" or "must" conditions in the parsed tree that require
559 * some nodes outside their subtree. It must be a list of top-level elements!
560 * - #LYD_OPT_RPCREPLY:
Michal Vaskod55f1092016-10-24 11:21:08 +0200561 * - const struct ::lyd_node *rpc_act - pointer to the whole RPC or action operation data
562 * tree (the request) of the reply.
Michal Vasko945b96b2016-10-18 11:49:12 +0200563 * - const struct ::lyd_node *data_tree - additional data tree that will be used
Michal Vasko6b44d712016-09-12 16:25:46 +0200564 * when checking any "when" or "must" conditions in the parsed tree that require
565 * some nodes outside their subtree. It must be a list of top-level elements!
Radek Krejcidef50022016-02-01 16:38:32 +0100566 * @return Pointer to the built data tree or NULL in case of empty \p data. To free the returned structure,
567 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
568 * #ly_errno contains appropriate error code (see #LY_ERR).
569 */
Radek Krejci722b0072016-02-01 17:09:45 +0100570struct lyd_node *lyd_parse_mem(struct ly_ctx *ctx, const char *data, LYD_FORMAT format, int options, ...);
Radek Krejcidef50022016-02-01 16:38:32 +0100571
572/**
Michal Vasko299f9832017-01-06 13:29:22 +0100573 * @brief Read (and validate) data from the given file descriptor.
Radek Krejcidef50022016-02-01 16:38:32 +0100574 *
575 * \note Current implementation supports only reading data from standard (disk) file, not from sockets, pipes, etc.
576 *
577 * In case of LY_XML format, the file content is parsed completely. It means that when it contains
578 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
579 * returned data node is a root of the first tree with other trees connected via the next pointer.
580 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
581 *
582 * @param[in] ctx Context to connect with the data tree being built here.
583 * @param[in] fd The standard file descriptor of the file containing the data tree in the specified format.
584 * @param[in] format Format of the input data to be parsed.
Michal Vasko228431e2018-07-10 15:47:11 +0200585 * @param[in] options Parser options, see @ref parseroptions. \p format LYD_LYB uses #LYD_OPT_TRUSTED implicitly.
Michal Vasko6b44d712016-09-12 16:25:46 +0200586 * @param[in] ... Variable arguments depend on \p options. If they include:
587 * - #LYD_OPT_DATA:
588 * - #LYD_OPT_CONFIG:
589 * - #LYD_OPT_GET:
590 * - #LYD_OPT_GETCONFIG:
591 * - #LYD_OPT_EDIT:
592 * - no variable arguments expected.
593 * - #LYD_OPT_RPC:
594 * - #LYD_OPT_NOTIF:
595 * - struct lyd_node *data_tree - additional data tree that will be used
596 * when checking any "when" or "must" conditions in the parsed tree that require
597 * some nodes outside their subtree. It must be a list of top-level elements!
598 * - #LYD_OPT_RPCREPLY:
Michal Vaskod55f1092016-10-24 11:21:08 +0200599 * - const struct ::lyd_node *rpc_act - pointer to the whole RPC or action operation data
600 * tree (the request) of the reply.
Michal Vasko945b96b2016-10-18 11:49:12 +0200601 * - const struct ::lyd_node *data_tree - additional data tree that will be used
Michal Vasko6b44d712016-09-12 16:25:46 +0200602 * when checking any "when" or "must" conditions in the parsed tree that require
603 * some nodes outside their subtree. It must be a list of top-level elements!
Radek Krejcidef50022016-02-01 16:38:32 +0100604 * @return Pointer to the built data tree or NULL in case of empty file. To free the returned structure,
605 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
606 * #ly_errno contains appropriate error code (see #LY_ERR).
607 */
608struct lyd_node *lyd_parse_fd(struct ly_ctx *ctx, int fd, LYD_FORMAT format, int options, ...);
609
610/**
Michal Vasko299f9832017-01-06 13:29:22 +0100611 * @brief Read (and validate) data from the given file path.
Radek Krejcidef50022016-02-01 16:38:32 +0100612 *
613 * In case of LY_XML format, the file content is parsed completely. It means that when it contains
614 * a non well-formed XML with multiple root elements, all those sibling XML trees are parsed. The
615 * returned data node is a root of the first tree with other trees connected via the next pointer.
616 * This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
617 *
618 * @param[in] ctx Context to connect with the data tree being built here.
619 * @param[in] path Path to the file containing the data tree in the specified format.
620 * @param[in] format Format of the input data to be parsed.
Michal Vasko228431e2018-07-10 15:47:11 +0200621 * @param[in] options Parser options, see @ref parseroptions. \p format LYD_LYB uses #LYD_OPT_TRUSTED implicitly.
Michal Vasko6b44d712016-09-12 16:25:46 +0200622 * @param[in] ... Variable arguments depend on \p options. If they include:
623 * - #LYD_OPT_DATA:
624 * - #LYD_OPT_CONFIG:
625 * - #LYD_OPT_GET:
626 * - #LYD_OPT_GETCONFIG:
627 * - #LYD_OPT_EDIT:
628 * - no variable arguments expected.
629 * - #LYD_OPT_RPC:
630 * - #LYD_OPT_NOTIF:
631 * - struct lyd_node *data_tree - additional data tree that will be used
632 * when checking any "when" or "must" conditions in the parsed tree that require
633 * some nodes outside their subtree. It must be a list of top-level elements!
634 * - #LYD_OPT_RPCREPLY:
Michal Vaskod55f1092016-10-24 11:21:08 +0200635 * - const struct ::lyd_node *rpc_act - pointer to the whole RPC or action operation data
636 * tree (the request) of the reply.
Michal Vasko945b96b2016-10-18 11:49:12 +0200637 * - const struct ::lyd_node *data_tree - additional data tree that will be used
Michal Vasko6b44d712016-09-12 16:25:46 +0200638 * when checking any "when" or "must" conditions in the parsed tree that require
639 * some nodes outside their subtree. It must be a list of top-level elements!
Radek Krejcidef50022016-02-01 16:38:32 +0100640 * @return Pointer to the built data tree or NULL in case of empty file. To free the returned structure,
641 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
642 * #ly_errno contains appropriate error code (see #LY_ERR).
643 */
644struct lyd_node *lyd_parse_path(struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int options, ...);
645
646/**
Michal Vasko299f9832017-01-06 13:29:22 +0100647 * @brief Parse (and validate) XML tree.
Radek Krejcidef50022016-02-01 16:38:32 +0100648 *
649 * The output data tree is parsed from the given XML tree previously parsed by one of the
650 * lyxml_read* functions.
651 *
Radek Krejci722b0072016-02-01 17:09:45 +0100652 * 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 +0100653 * or the provided root is a root element of a subtree), all the sibling nodes (previous as well as
654 * following) are processed as well. The returned data node is a root of the first tree with other
655 * trees connected via the next pointer. This behavior can be changed by #LYD_OPT_NOSIBLINGS option.
656 *
657 * When the function is used with #LYD_OPT_DESTRUCT, all the successfully parsed data including the
658 * XML \p root and all its siblings (if #LYD_OPT_NOSIBLINGS is not used) are freed. Only with
659 * #LYD_OPT_DESTRUCT option the \p root pointer is changed - if all the data are parsed, it is set
660 * to NULL, otherwise it will hold the XML tree without the successfully parsed elements.
661 *
662 * The context must be the same as the context used to parse XML tree by lyxml_read* function.
663 *
664 * @param[in] ctx Context to connect with the data tree being built here.
665 * @param[in,out] root XML tree to parse (convert) to data tree. By default, parser do not change the XML tree. However,
666 * when #LYD_OPT_DESTRUCT is specified in \p options, parser frees all successfully parsed data.
667 * @param[in] options Parser options, see @ref parseroptions.
Michal Vasko6b44d712016-09-12 16:25:46 +0200668 * @param[in] ... Variable arguments depend on \p options. If they include:
669 * - #LYD_OPT_DATA:
670 * - #LYD_OPT_CONFIG:
671 * - #LYD_OPT_GET:
672 * - #LYD_OPT_GETCONFIG:
673 * - #LYD_OPT_EDIT:
674 * - no variable arguments expected.
675 * - #LYD_OPT_RPC:
676 * - #LYD_OPT_NOTIF:
677 * - struct lyd_node *data_tree - additional data tree that will be used
678 * when checking any "when" or "must" conditions in the parsed tree that require
679 * some nodes outside their subtree. It must be a list of top-level elements!
680 * - #LYD_OPT_RPCREPLY:
Michal Vaskod55f1092016-10-24 11:21:08 +0200681 * - const struct ::lyd_node *rpc_act - pointer to the whole RPC or action operation data
682 * tree (the request) of the reply.
Michal Vasko945b96b2016-10-18 11:49:12 +0200683 * - const struct ::lyd_node *data_tree - additional data tree that will be used
Michal Vasko6b44d712016-09-12 16:25:46 +0200684 * when checking any "when" or "must" conditions in the parsed tree that require
685 * some nodes outside their subtree. It must be a list of top-level elements!
Radek Krejcidef50022016-02-01 16:38:32 +0100686 * @return Pointer to the built data tree or NULL in case of empty \p root. To free the returned structure,
687 * use lyd_free(). In these cases, the function sets #ly_errno to LY_SUCCESS. In case of error,
688 * #ly_errno contains appropriate error code (see #LY_ERR).
689 */
690struct lyd_node *lyd_parse_xml(struct ly_ctx *ctx, struct lyxml_elem **root, int options,...);
691
692/**
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200693 * @brief Create a new container node in a data tree.
694 *
Michal Vasko299f9832017-01-06 13:29:22 +0100695 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
696 *
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200697 * @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 +0200698 * @param[in] module Module with the node being created.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200699 * @param[in] name Schema node name of the new data node. The node can be #LYS_CONTAINER, #LYS_LIST,
Michal Vasko945b96b2016-10-18 11:49:12 +0200700 * #LYS_NOTIF, #LYS_RPC, or #LYS_ACTION.
Michal Vasko1dca6882015-10-22 14:29:42 +0200701 * @return New node, NULL on error.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200702 */
Michal Vasko1e62a092015-12-01 12:27:20 +0100703struct lyd_node *lyd_new(struct lyd_node *parent, const struct lys_module *module, const char *name);
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200704
705/**
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200706 * @brief Create a new leaf or leaflist node in a data tree with a string value that is converted to
707 * the actual value.
708 *
Michal Vasko299f9832017-01-06 13:29:22 +0100709 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
710 *
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200711 * @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 +0200712 * @param[in] module Module with the node being created.
713 * @param[in] name Schema node name of the new data node.
Michal Vasko3e671b52015-10-23 16:23:15 +0200714 * @param[in] val_str String form of the value of the node being created. In case the type is #LY_TYPE_INST
715 * 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 +0200716 * @return New node, NULL on error.
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200717 */
Michal Vasko1e62a092015-12-01 12:27:20 +0100718struct lyd_node *lyd_new_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
Michal Vasko3e671b52015-10-23 16:23:15 +0200719 const char *val_str);
Michal Vasko8ea2b7f2015-09-29 14:30:53 +0200720
721/**
Radek Krejcib9b4d002016-01-18 13:08:51 +0100722 * @brief Change value of a leaf node.
723 *
Michal Vasko299f9832017-01-06 13:29:22 +0100724 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
725 *
Radek Krejcib9b4d002016-01-18 13:08:51 +0100726 * Despite the prototype allows to provide a leaflist node as \p leaf parameter, only leafs are accepted.
Michal Vasko2da8e042018-05-25 11:10:13 +0200727 * Also, the leaf will never be default after calling this function successfully.
Radek Krejcib9b4d002016-01-18 13:08:51 +0100728 *
729 * @param[in] leaf A leaf node to change.
730 * @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
731 * or #LY_TYPE_IDENT, JSON node-id format is expected (nodes are prefixed with module names, not XML namespaces).
Michal Vasko3c0eb752018-02-08 16:09:19 +0100732 * @return 0 if the leaf was changed successfully (either its value changed or at least its default flag was cleared),
733 * <0 on error,
734 * 1 if the (canonical) value matched the original one and no value neither default flag change occured.
Radek Krejcib9b4d002016-01-18 13:08:51 +0100735 */
736int lyd_change_leaf(struct lyd_node_leaf_list *leaf, const char *val_str);
737
738/**
Radek Krejci45826012016-08-24 15:07:57 +0200739 * @brief Create a new anydata or anyxml node in a data tree.
740 *
Michal Vasko299f9832017-01-06 13:29:22 +0100741 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
742 *
Radek Krejci45826012016-08-24 15:07:57 +0200743 * This function is supposed to be a replacement for the lyd_new_anyxml_str() and lyd_new_anyxml_xml().
Michal Vasko2d162e12015-09-24 14:33:29 +0200744 *
Michal Vasko2d162e12015-09-24 14:33:29 +0200745 * @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 +0200746 * @param[in] module Module with the node being created.
Radek Krejci45826012016-08-24 15:07:57 +0200747 * @param[in] name Schema node name of the new data node. The schema node determines if the anydata or anyxml node
748 * is created.
749 * @param[in] value Pointer to the value data to be stored in the anydata/anyxml node. The type of the data is
750 * determined according to the \p value_type parameter.
751 * @param[in] value_type Type of the provided data \p value.
Michal Vasko1dca6882015-10-22 14:29:42 +0200752 * @return New node, NULL on error.
Michal Vasko2d162e12015-09-24 14:33:29 +0200753 */
Radek Krejci45826012016-08-24 15:07:57 +0200754struct lyd_node *lyd_new_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name,
755 void *value, LYD_ANYDATA_VALUETYPE value_type);
Michal Vasko2d162e12015-09-24 14:33:29 +0200756
757/**
Michal Vasko945b96b2016-10-18 11:49:12 +0200758 * @brief Create a new container node in a data tree. Ignore RPC/action input nodes and instead use RPC/action output ones.
Michal Vasko0df122f2015-12-14 13:38:21 +0100759 *
Michal Vasko299f9832017-01-06 13:29:22 +0100760 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
761 *
Michal Vasko98a5a742016-05-11 11:02:56 +0200762 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
763 * @param[in] module Module with the node being created.
Michal Vasko945b96b2016-10-18 11:49:12 +0200764 * @param[in] name Schema node name of the new data node. The node should only be #LYS_CONTAINER or #LYS_LIST,
765 * but accepted are also #LYS_NOTIF, #LYS_RPC, or #LYS_ACTION.
Michal Vasko0df122f2015-12-14 13:38:21 +0100766 * @return New node, NULL on error.
767 */
Michal Vasko98a5a742016-05-11 11:02:56 +0200768struct lyd_node *lyd_new_output(struct lyd_node *parent, const struct lys_module *module, const char *name);
Michal Vasko50c0a872016-01-13 14:34:11 +0100769
770/**
Michal Vasko98a5a742016-05-11 11:02:56 +0200771 * @brief Create a new leaf or leaflist node in a data tree with a string value that is converted to
Michal Vasko945b96b2016-10-18 11:49:12 +0200772 * the actual value. Ignore RPC/action input nodes and instead use RPC/action output ones.
Michal Vasko50c0a872016-01-13 14:34:11 +0100773 *
Michal Vasko299f9832017-01-06 13:29:22 +0100774 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
775 *
Michal Vasko98a5a742016-05-11 11:02:56 +0200776 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
777 * @param[in] module Module with the node being created.
778 * @param[in] name Schema node name of the new data node.
Michal Vasko50c0a872016-01-13 14:34:11 +0100779 * @param[in] val_str String form of the value of the node being created. In case the type is #LY_TYPE_INST
780 * or #LY_TYPE_IDENT, JSON node-id format is expected (nodes are prefixed with module names, not XML namespaces).
781 * @return New node, NULL on error.
782 */
Michal Vasko98a5a742016-05-11 11:02:56 +0200783struct lyd_node *lyd_new_output_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
784 const char *val_str);
Michal Vasko50c0a872016-01-13 14:34:11 +0100785
786/**
Michal Vasko945b96b2016-10-18 11:49:12 +0200787 * @brief Create a new anydata or anyxml node in a data tree. Ignore RPC/action input nodes and instead use
788 * RPC/action output ones.
Michal Vasko50c0a872016-01-13 14:34:11 +0100789 *
Michal Vasko299f9832017-01-06 13:29:22 +0100790 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
791 *
Michal Vasko98a5a742016-05-11 11:02:56 +0200792 * @param[in] parent Parent node for the node being created. NULL in case of creating top level element.
793 * @param[in] module Module with the node being created.
Radek Krejci45826012016-08-24 15:07:57 +0200794 * @param[in] name Schema node name of the new data node. The schema node determines if the anydata or anyxml node
795 * is created.
796 * @param[in] value Pointer to the value data to be stored in the anydata/anyxml node. The type of the data is
797 * determined according to the \p value_type parameter. Data are supposed to be dynamically allocated.
798 * Since it is directly attached into the created data node, caller is supposed to not manipulate with
799 * the data after a successful call (including calling free() on the provided data).
800 * @param[in] value_type Type of the provided data \p value.
Michal Vasko50c0a872016-01-13 14:34:11 +0100801 * @return New node, NULL on error.
802 */
Radek Krejci45826012016-08-24 15:07:57 +0200803struct lyd_node *lyd_new_output_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name,
804 void *value, LYD_ANYDATA_VALUETYPE value_type);
Michal Vasko0df122f2015-12-14 13:38:21 +0100805
806/**
PavolVican832f5432018-02-21 00:54:45 +0100807 * @brief Create a new yang-data template in a data tree. It creates container, which name is in third parameter.
808 *
809 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
810 *
811 * @param[in] module Module with the node being created.
812 * @param[in] name_template Yang-data template name. This name is used for searching of yang-data instance.
813 * @param[in] name Schema node name of the new data node. This node is container.
814 * @return New node, NULL on error.
815 */
816struct lyd_node *lyd_new_yangdata(const struct lys_module *module, const char *name_template, const char *name);
817
818/**
Michal Vaskof5299282016-03-16 13:32:02 +0100819 * @defgroup pathoptions Data path creation options
820 * @ingroup datatree
821 *
822 * Various options to change lyd_new_path() behavior.
823 *
824 * Default behavior:
Michal Vasko3c0eb752018-02-08 16:09:19 +0100825 * - if the target node already exists (and is not default), an error is returned.
Michal Vasko9db078d2016-03-23 11:08:51 +0100826 * - the whole path to the target node is created (with any missing parents) if necessary.
Michal Vasko2411b942016-03-23 13:50:03 +0100827 * - RPC output schema children are completely ignored in all modules. Input is searched and nodes created normally.
Michal Vaskof5299282016-03-16 13:32:02 +0100828 * @{
829 */
830
Michal Vasko3c0eb752018-02-08 16:09:19 +0100831#define LYD_PATH_OPT_UPDATE 0x01 /**< If the target node exists, is a leaf, and it is updated with a new value or its
832 default flag is changed, it is returned. If the target node exists and is not
833 a leaf or generally no change occurs in the \p data_tree, NULL is returned and no error set. */
Michal Vaskoae5ad2f2018-10-19 11:21:30 +0200834#define LYD_PATH_OPT_NOPARENT 0x02 /**< If any parents of the target node do not exist, return an error instead of implicitly
835 creating them. */
Michal Vasko945b96b2016-10-18 11:49:12 +0200836#define LYD_PATH_OPT_OUTPUT 0x04 /**< Changes the behavior to ignoring RPC/action input schema nodes and using only output ones. */
Michal Vaskoae5ad2f2018-10-19 11:21:30 +0200837#define LYD_PATH_OPT_DFLT 0x08 /**< The created node (nodes, if also creating the parents) is a default one. If working with
838 data tree of type #LYD_OPT_DATA, #LYD_OPT_CONFIG, #LYD_OPT_RPC, #LYD_OPT_RPCREPLY, or
839 #LYD_OPT_NOTIF, this flag is never needed and therefore should not be used. However, if
840 the tree is #LYD_OPT_GET, #LYD_OPT_GETCONFIG, or #LYD_OPT_EDIT, the default nodes are not
841 created during validation and using this flag one can set them (see @ref howtodatawd). */
842#define LYD_PATH_OPT_NOPARENTRET 0x10 /**< Changes the return value in the way that even if some parents were created in
843 addition to the path-referenced node, the path-referenced node will always be returned. */
Michal Vaskof9329492018-11-27 12:29:55 +0100844#define LYD_PATH_OPT_EDIT 0x20 /**< Allows the creation of special leaves without value. These leaves are valid if used
845 in a NETCONF edit-config with delete/remove operation. */
Michal Vaskof5299282016-03-16 13:32:02 +0100846
847/** @} pathoptions */
848
849/**
850 * @brief Create a new data node based on a simple XPath.
851 *
Michal Vasko299f9832017-01-06 13:29:22 +0100852 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
853 *
Michal Vasko8d18ef52016-04-06 12:21:46 +0200854 * The new node is normally inserted at the end, either as the last child of a parent or as the last sibling
855 * if working with top-level elements. However, when manipulating RPC input or output, schema ordering is
Michal Vasko98a5a742016-05-11 11:02:56 +0200856 * required and always guaranteed.
Michal Vasko58f74f12016-03-24 13:26:06 +0100857 *
Michal Vasko8c419642016-04-13 14:22:01 +0200858 * If \p path points to a list key and the list does not exist, the key value from the predicate is used
859 * and \p value is ignored.
860 *
Michal Vasko7800b242018-04-03 11:15:05 +0200861 * @param[in] data_tree Existing data tree to add to/modify (including siblings). If creating RPCs/actions, there
862 * should only be one RPC/action and either input or output, not both. Can be NULL.
Michal Vaskof5299282016-03-16 13:32:02 +0100863 * @param[in] ctx Context to use. Mandatory if \p data_tree is NULL.
Michal Vasko50576712017-07-28 12:28:33 +0200864 * @param[in] path Simple data path (see @ref howtoxpath). List nodes can have predicates, one for each list key
865 * in the correct order and with its value as well or using specific instance position, leaves and leaf-lists
Michal Vasko310bc582018-05-22 10:47:59 +0200866 * can have predicates too that have preference over \p value. When specifying an identityref value in a predicate,
867 * you MUST use the module name as the value prefix!
Radek Krejci45826012016-08-24 15:07:57 +0200868 * @param[in] value Value of the new leaf/lealf-list (const char*). If creating anydata or anyxml, the following
Michal Vasko50576712017-07-28 12:28:33 +0200869 * \p value_type parameter is required to be specified correctly. If creating nodes of other types, the
870 * parameter is ignored.
Radek Krejci45826012016-08-24 15:07:57 +0200871 * @param[in] value_type Type of the provided \p value parameter in case of creating anydata or anyxml node.
Michal Vaskof5299282016-03-16 13:32:02 +0100872 * @param[in] options Bitmask of options flags, see @ref pathoptions.
Michal Vasko8c419642016-04-13 14:22:01 +0200873 * @return First created (or updated with #LYD_PATH_OPT_UPDATE) node,
Michal Vasko17bb4902016-04-05 15:20:51 +0200874 * 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 +0200875 * NULL and ly_errno is set on error.
Michal Vaskof5299282016-03-16 13:32:02 +0100876 */
Michal Vasko73304a22019-01-22 09:05:22 +0100877struct lyd_node *lyd_new_path(struct lyd_node *data_tree, const struct ly_ctx *ctx, const char *path, void *value,
Radek Krejci45826012016-08-24 15:07:57 +0200878 LYD_ANYDATA_VALUETYPE value_type, int options);
Michal Vaskof5299282016-03-16 13:32:02 +0100879
880/**
Michal Vaskoae5a53e2017-01-05 10:33:41 +0100881 * @brief Learn the relative instance position of a list or leaf-list within other instances of the
882 * same schema node.
883 *
884 * @param[in] node List or leaf-list to get the position of.
885 * @return 0 on error or positive integer of the instance position.
886 */
887unsigned int lyd_list_pos(const struct lyd_node *node);
888
889/**
Michal Vasko85225a22018-11-19 13:24:38 +0100890 * @defgroup dupoptions Data duplication options
891 * @ingroup datatree
892 *
893 * Various options to change lyd_dup() behavior.
894 *
895 * Default behavior:
896 * - only the specified node is duplicated without siblings, parents, or children.
897 * - all the attributes of the duplicated nodes are also duplicated.
898 * @{
899 */
900
901#define LYD_DUP_OPT_RECURSIVE 0x01 /**< Duplicate not just the node but also all the children. */
902#define LYD_DUP_OPT_NO_ATTR 0x02 /**< Do not duplicate attributes of any node. */
903#define LYD_DUP_OPT_WITH_PARENTS 0x04 /**< If a nested node is being duplicated, duplicate also all the parents.
904 Keys are also duplicated for lists. Return value does not change! */
905
906/** @} dupoptions */
907
908/**
Michal Vasko39dc8992018-04-03 11:32:00 +0200909 * @brief Create a copy of the specified data tree \p node. Schema references are kept the same. Use carefully,
910 * since libyang silently creates default nodes, it is always better to use lyd_dup_withsiblings() to duplicate
911 * the complete data tree.
Michal Vasko2d162e12015-09-24 14:33:29 +0200912 *
Michal Vasko299f9832017-01-06 13:29:22 +0100913 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
Michal Vasko2f95fe62016-12-01 09:36:08 +0100914 *
Michal Vasko2d162e12015-09-24 14:33:29 +0200915 * @param[in] node Data tree node to be duplicated.
Michal Vasko85225a22018-11-19 13:24:38 +0100916 * @param[in] options Bitmask of options flags, see @ref dupoptions.
Michal Vasko2d162e12015-09-24 14:33:29 +0200917 * @return Created copy of the provided data \p node.
918 */
Michal Vasko85225a22018-11-19 13:24:38 +0100919struct lyd_node *lyd_dup(const struct lyd_node *node, int options);
Michal Vasko2d162e12015-09-24 14:33:29 +0200920
921/**
Michal Vasko39dc8992018-04-03 11:32:00 +0200922 * @brief Create a copy of the specified data tree and all its siblings (preceding as well as following).
923 * Schema references are kept the same.
924 *
925 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
926 *
927 * @param[in] node Data tree sibling node to be duplicated.
Michal Vasko85225a22018-11-19 13:24:38 +0100928 * @param[in] options Bitmask of options flags, see @ref dupoptions.
Michal Vasko39dc8992018-04-03 11:32:00 +0200929 * @return Created copy of the provided data \p node and all of its siblings.
930 */
Michal Vasko85225a22018-11-19 13:24:38 +0100931struct lyd_node *lyd_dup_withsiblings(const struct lyd_node *node, int options);
Michal Vasko39dc8992018-04-03 11:32:00 +0200932
933/**
Radek Krejcia17c85c2017-01-06 12:22:34 +0100934 * @brief Create a copy of the specified data tree \p node in the different context. All the
935 * schema references and strings are re-mapped into the specified context.
936 *
937 * If the target context does not contain the schemas used in the source data tree, error
938 * is raised and the new data tree is not created.
939 *
940 * @param[in] node Data tree node to be duplicated.
Michal Vasko85225a22018-11-19 13:24:38 +0100941 * @param[in] options Bitmask of options flags, see @ref dupoptions.
Radek Krejcia17c85c2017-01-06 12:22:34 +0100942 * @param[in] ctx Target context for the duplicated data.
943 * @return Created copy of the provided data \p node.
944 */
Michal Vasko85225a22018-11-19 13:24:38 +0100945struct lyd_node *lyd_dup_to_ctx(const struct lyd_node *node, int options, struct ly_ctx *ctx);
Radek Krejcia17c85c2017-01-06 12:22:34 +0100946
947/**
Michal Vasko299f9832017-01-06 13:29:22 +0100948 * @brief Merge a (sub)tree into a data tree.
949 *
950 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
951 *
952 * Missing nodes are merged, leaf values updated.
Radek Krejci8f4eba52017-01-06 15:32:41 +0100953 *
Michal Vasko45fb2822016-04-18 13:32:17 +0200954 * If \p target and \p source do not share the top-level schema node, even if they
955 * are from different modules, \p source parents up to top-level node will be created and
956 * linked to the \p target (but only containers can be created this way, lists need keys,
957 * so if lists are missing, an error will be returned).
958 *
Radek Krejci2ffe9932017-01-06 16:29:47 +0100959 * If the source data tree is in a different context, the resulting data are placed into the context
960 * of the target tree.
Michal Vasko45fb2822016-04-18 13:32:17 +0200961 *
Michal Vaskocf6dc7e2016-04-18 16:00:37 +0200962 * @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 +0200963 * @param[in] source Data tree to merge \p target with. Must be valid (at least as a subtree).
Radek Krejci2ffe9932017-01-06 16:29:47 +0100964 * @param[in] options Bitmask of the following option flags:
Michal Vasko0300b532016-09-14 12:16:02 +0200965 * - #LYD_OPT_DESTRUCT - spend \p source in the function, otherwise \p source is left untouched,
966 * - #LYD_OPT_NOSIBLINGS - merge only the \p source subtree (ignore siblings), otherwise merge
967 * \p source and all its succeeding siblings (preceeding ones are still ignored!),
968 * - #LYD_OPT_EXPLICIT - when merging an explicitly set node and a default node, always put
969 * the explicit node into \p target, otherwise the node which is in \p source is used.
Michal Vasko45fb2822016-04-18 13:32:17 +0200970 * @return 0 on success, nonzero in case of an error.
971 */
972int lyd_merge(struct lyd_node *target, const struct lyd_node *source, int options);
973
Radek Krejci2ffe9932017-01-06 16:29:47 +0100974/**
975 * @brief Same as lyd_merge(), but moves the resulting data into the specified context.
976 *
977 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
978 *
979 * @param[in] trg Top-level (or an RPC output child) data tree to merge to. Must be valid. If its context
980 * differs from the specified \p ctx of the result, the provided data tree is freed and the new
Radek Krejciab80e3a2017-01-09 13:07:31 +0100981 * tree in the required context is returned on success. To keep the \p trg tree, convert it to the
982 * target context using lyd_dup_to_ctx() and then call lyd_merge() instead of lyd_merge_to_ctx().
Radek Krejci2ffe9932017-01-06 16:29:47 +0100983 * @param[in] src Data tree to merge \p target with. Must be valid (at least as a subtree).
984 * @param[in] options Bitmask of the following option flags:
985 * - #LYD_OPT_DESTRUCT - spend \p source in the function, otherwise \p source is left untouched,
986 * - #LYD_OPT_NOSIBLINGS - merge only the \p source subtree (ignore siblings), otherwise merge
Renato Westphal99fded72018-10-22 14:44:24 -0200987 * \p source and all its succeeding siblings (preceding ones are still ignored!),
Radek Krejci2ffe9932017-01-06 16:29:47 +0100988 * - #LYD_OPT_EXPLICIT - when merging an explicitly set node and a default node, always put
989 * the explicit node into \p target, otherwise the node which is in \p source is used.
990 * @param[in] ctx Target context in which the result will be created. Note that the successful merge requires to have
991 * all the used modules in the source and target data trees loaded in the target context.
992 * @return 0 on success, nonzero in case of an error.
993 */
994int lyd_merge_to_ctx(struct lyd_node **trg, const struct lyd_node *src, int options, struct ly_ctx *ctx);
995
Michal Vasko0300b532016-09-14 12:16:02 +0200996#define LYD_OPT_EXPLICIT 0x0100
997
Michal Vasko45fb2822016-04-18 13:32:17 +0200998/**
Michal Vasko2d162e12015-09-24 14:33:29 +0200999 * @brief Insert the \p node element as child to the \p parent element. The \p node is inserted as a last child of the
1000 * \p parent.
1001 *
Michal Vasko299f9832017-01-06 13:29:22 +01001002 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1003 *
Michal Vaskob6c51f12016-09-14 12:15:11 +02001004 * - if the node is part of some other tree, it is automatically unlinked.
1005 * - if the node is the first node of a node list (with no parent), all the subsequent nodes are also inserted.
1006 * - if the key of a list is being inserted, it is placed into a correct position instead of being placed as the last
Radek Krejcia1c33bf2016-09-07 12:38:49 +02001007 * element.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001008 * - if the target tree includes the default instance of the node being inserted, the default node is silently replaced
Michal Vasko3c126822016-09-22 13:48:42 +02001009 * by the new node.
1010 * - if a default node is being inserted and the target tree already contains non-default instance, the existing
1011 * instance is silently replaced. If it contains the exact same default node, it is replaced as well.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001012 * - if a non-default node is being inserted and there is already its non-default instance in the target tree, the new
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001013 * node is inserted and it is up to the caller to solve the presence of multiple instances afterwards.
1014 *
1015 * Note that this function differs from lyd_insert_before() and lyd_insert_after() because the position of the
1016 * node being inserted is determined automatically according to the rules described above. In contrast to
1017 * lyd_insert_parent(), lyd_insert() can not be used for top-level elements since the \p parent parameter must not be
Michal Vasko3c126822016-09-22 13:48:42 +02001018 * NULL. If inserting something larger and not fitting the mentioned use-cases (or simply if unsure), you can always
1019 * use lyd_merge(), it should be able to handle any situation.
Michal Vasko2d162e12015-09-24 14:33:29 +02001020 *
1021 * @param[in] parent Parent node for the \p node being inserted.
1022 * @param[in] node The node being inserted.
Michal Vasko24337392015-10-16 09:58:16 +02001023 * @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 +02001024 * in the data tree.
1025 */
Michal Vasko24337392015-10-16 09:58:16 +02001026int lyd_insert(struct lyd_node *parent, struct lyd_node *node);
Michal Vasko2d162e12015-09-24 14:33:29 +02001027
1028/**
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001029 * @brief Insert the \p node element as a last sibling of the specified \p sibling element.
1030 *
Michal Vasko299f9832017-01-06 13:29:22 +01001031 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1032 *
Michal Vaskob6c51f12016-09-14 12:15:11 +02001033 * - if the node is part of some other tree, it is automatically unlinked.
1034 * - if the node is the first node of a node list (with no parent), all the subsequent nodes are also inserted.
1035 * - if the key of a list is being inserted, it is placed into a correct position instead of being placed as the last
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001036 * element.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001037 * - if the target tree includes the default instance of the node being inserted, the default node is silently replaced
Michal Vasko3c126822016-09-22 13:48:42 +02001038 * by the new node.
1039 * - if a default node is being inserted and the target tree already contains non-default instance, the existing
1040 * instance is silently replaced. If it contains the exact same default node, it is replaced as well.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001041 * - if a non-default node is being inserted and there is already its non-default instance in the target tree, the new
1042 * node is inserted and it is up to the caller to solve the presence of multiple instances afterwards.
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001043 *
1044 * Note that this function differs from lyd_insert_before() and lyd_insert_after() because the position of the
1045 * node being inserted is determined automatically as in the case of lyd_insert(). In contrast to lyd_insert(),
Michal Vasko3c126822016-09-22 13:48:42 +02001046 * lyd_insert_sibling() can be used to insert top-level elements. If inserting something larger and not fitting
1047 * the mentioned use-cases (or simply if unsure), you can always use lyd_merge(), it should be able to handle
1048 * any situation.
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001049 *
1050 * @param[in,out] sibling Sibling node as a reference where to insert the \p node. When function succeeds, the sibling
1051 * is always set to point to the first sibling node. Note that in some cases described above, the provided sibling
1052 * node could be removed from the tree.
1053 * @param[in] node The node being inserted.
1054 * @return 0 on success, nonzero in case of error, e.g. when the node is being inserted to an inappropriate place
1055 * in the data tree.
1056 */
1057int lyd_insert_sibling(struct lyd_node **sibling, struct lyd_node *node);
1058
1059/**
Michal Vasko3f7dba12015-10-15 13:09:27 +02001060 * @brief Insert the \p node element after the \p sibling element. If \p node and \p siblings are already
Michal Vasko299f9832017-01-06 13:29:22 +01001061 * siblings (just moving \p node position).
1062 *
1063 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
Michal Vasko2d162e12015-09-24 14:33:29 +02001064 *
Michal Vaskob6c51f12016-09-14 12:15:11 +02001065 * - if the target tree includes the default instance of the node being inserted, the default node is silently removed.
Michal Vasko3c126822016-09-22 13:48:42 +02001066 * - if a default node is being inserted and the target tree already contains non-default instance, the existing
1067 * instance is removed. If it contains the exact same default node, it is removed as well.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001068 * - if a non-default node is being inserted and there is already its non-default instance in the target tree, the new
1069 * node is inserted and it is up to the caller to solve the presence of multiple instances afterwards.
1070 *
Michal Vasko2d162e12015-09-24 14:33:29 +02001071 * @param[in] sibling The data tree node before which the \p node will be inserted.
Radek Krejci20a5f292016-02-09 15:04:49 +01001072 * @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 +02001073 * @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 +02001074 * in the data tree.
1075 */
Michal Vasko24337392015-10-16 09:58:16 +02001076int lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
Michal Vasko2d162e12015-09-24 14:33:29 +02001077
1078/**
Radek Krejci20a5f292016-02-09 15:04:49 +01001079 * @brief Insert the \p node element after the \p sibling element. If \p node and \p siblings are already
Michal Vasko299f9832017-01-06 13:29:22 +01001080 * siblings (just moving \p node position).
1081 *
1082 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
Michal Vasko2d162e12015-09-24 14:33:29 +02001083 *
Michal Vaskob6c51f12016-09-14 12:15:11 +02001084 * - if the target tree includes the default instance of the node being inserted, the default node is silently removed.
Michal Vasko3c126822016-09-22 13:48:42 +02001085 * - if a default node is being inserted and the target tree already contains non-default instance, the existing
1086 * instance is removed. If it contains the exact same default node, it is removed as well.
Michal Vaskob6c51f12016-09-14 12:15:11 +02001087 * - if a non-default node is being inserted and there is already its non-default instance in the target tree, the new
1088 * node is inserted and it is up to the caller to solve the presence of multiple instances afterwards.
1089 *
Michal Vasko3f7dba12015-10-15 13:09:27 +02001090 * @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 +01001091 * are already siblings (just moving \p node position), skip validation.
Radek Krejci20a5f292016-02-09 15:04:49 +01001092 * @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 +02001093 * @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 +02001094 * in the data tree.
1095 */
Michal Vasko24337392015-10-16 09:58:16 +02001096int lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
1097
1098/**
Michal Vasko2411b942016-03-23 13:50:03 +01001099 * @brief Order siblings according to the schema node ordering.
1100 *
Michal Vasko299f9832017-01-06 13:29:22 +01001101 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1102 *
Michal Vasko58f74f12016-03-24 13:26:06 +01001103 * If the siblings include data nodes from other modules, they are
1104 * sorted based on the module order in the context.
1105 *
1106 * @param[in] sibling Node, whose siblings will be sorted.
1107 * @param[in] recursive Whether sort all siblings of siblings, recursively.
1108 * @return 0 on success, nonzero in case of an error.
Michal Vasko2411b942016-03-23 13:50:03 +01001109 */
Michal Vasko58f74f12016-03-24 13:26:06 +01001110int lyd_schema_sort(struct lyd_node *sibling, int recursive);
Michal Vasko2411b942016-03-23 13:50:03 +01001111
1112/**
Michal Vasko50576712017-07-28 12:28:33 +02001113 * @brief Search in the given data for instances of nodes matching the provided path.
Michal Vasko105cef12016-02-04 12:06:26 +01001114 *
Michal Vasko50576712017-07-28 12:28:33 +02001115 * Learn more about the path format on page @ref howtoxpath.
Michal Vasko105cef12016-02-04 12:06:26 +01001116 *
Michal Vasko50576712017-07-28 12:28:33 +02001117 * @param[in] ctx_node Path context node.
1118 * @param[in] path Data path expression filtering the matching nodes.
1119 * @return Set of found data nodes. If no nodes are matching \p path or the result
Michal Vasko105cef12016-02-04 12:06:26 +01001120 * would be a number, a string, or a boolean, the returned set is empty. In case of an error, NULL is returned.
1121 */
Michal Vasko50576712017-07-28 12:28:33 +02001122struct ly_set *lyd_find_path(const struct lyd_node *ctx_node, const char *path);
Michal Vasko105cef12016-02-04 12:06:26 +01001123
1124/**
Radek Krejcic5b6b912016-01-18 16:35:35 +01001125 * @brief Search in the given data for instances of the provided schema node.
1126 *
1127 * The \p data is used to find the data root and function then searches in the whole tree and all sibling trees.
1128 *
1129 * @param[in] data A node in the data tree to search.
1130 * @param[in] schema Schema node of the data nodes caller want to find.
Michal Vasko46a4bf92016-09-08 08:23:49 +02001131 * @return Set of found data nodes. If no data node is found, the returned set is empty.
Radek Krejcic5b6b912016-01-18 16:35:35 +01001132 * In case of error, NULL is returned.
1133 */
Michal Vaskof06fb5b2016-09-08 10:05:56 +02001134struct ly_set *lyd_find_instance(const struct lyd_node *data, const struct lys_node *schema);
Radek Krejcic5b6b912016-01-18 16:35:35 +01001135
1136/**
Radek Krejcid788a522016-07-25 14:57:38 +02001137 * @brief Get the first sibling of the given node.
1138 *
1139 * @param[in] node Node which first sibling is going to be the result.
1140 * @return The first sibling of the given node or the node itself if it is the first child of the parent.
1141 */
1142struct lyd_node *lyd_first_sibling(struct lyd_node *node);
1143
1144/**
Michal Vasko24337392015-10-16 09:58:16 +02001145 * @brief Validate \p node data subtree.
1146 *
Michal Vaskobbc43b12018-10-12 09:22:00 +02001147 * @param[in,out] node Data tree to be validated. In case the \p options includes #LYD_OPT_WHENAUTODEL, libyang
Michal Vaskob2f40be2016-09-08 16:03:48 +02001148 * can modify the provided tree including the root \p node.
Michal Vasko24337392015-10-16 09:58:16 +02001149 * @param[in] options Options for the inserting data to the target data tree options, see @ref parseroptions.
Michal Vaskocdb90172016-09-13 09:34:36 +02001150 * @param[in] var_arg Variable argument depends on \p options. If they include:
Michal Vasko6b44d712016-09-12 16:25:46 +02001151 * - #LYD_OPT_DATA:
1152 * - #LYD_OPT_CONFIG:
1153 * - #LYD_OPT_GET:
1154 * - #LYD_OPT_GETCONFIG:
1155 * - #LYD_OPT_EDIT:
Michal Vaskocdb90172016-09-13 09:34:36 +02001156 * - struct ly_ctx *ctx - context to use when \p node is NULL (for checking an empty tree),
1157 * otherwise can be NULL.
Michal Vasko6b44d712016-09-12 16:25:46 +02001158 * - #LYD_OPT_RPC:
1159 * - #LYD_OPT_RPCREPLY:
1160 * - #LYD_OPT_NOTIF:
1161 * - struct ::lyd_node *data_tree - additional data tree that will be used when checking
Michal Vaskocdb90172016-09-13 09:34:36 +02001162 * any "when" or "must" conditions in the \p node tree
1163 * that require some nodes outside their subtree. If set,
1164 * it must be a list of top-level elements!
Michal Vasko20555d82018-12-12 16:30:50 +01001165 * @param[in] ... Used only if options include #LYD_OPT_VAL_DIFF. In that case a (struct lyd_difflist **)
1166 * is expected into which all data node changes performed by the validation will be stored.
1167 * Needs to be properly freed. Meaning of diff type is following:
1168 * - LYD_DIFF_CREATED:
1169 * - first - Path identifying the parent node (format of lyd_path()).
1170 * - second - Duplicated subtree of the created nodes.
1171 * - LYD_DIFF_DELETED:
1172 * - first - Unlinked subtree of the deleted nodes.
1173 * - second - Path identifying the original parent (format of lyd_path()).
Radek Krejci92ece002016-04-04 15:45:05 +02001174 * @return 0 on success, nonzero in case of an error.
Michal Vasko24337392015-10-16 09:58:16 +02001175 */
Michal Vasko20555d82018-12-12 16:30:50 +01001176int lyd_validate(struct lyd_node **node, int options, void *var_arg, ...);
Michal Vasko2d162e12015-09-24 14:33:29 +02001177
1178/**
Michal Vasko993af1e2018-12-10 12:05:17 +01001179 * @brief Validate \p node data tree but only subtrees that belong to the schema found in \p modules. All other
1180 * schemas are effectively disabled for the validation.
1181 *
1182 * @param[in,out] node Data tree to be validated. In case the \p options includes #LYD_OPT_WHENAUTODEL, libyang
1183 * can modify the provided tree including the root \p node.
1184 * @param[in] modules List of module names to validate.
1185 * @param[in] mod_count Number of modules in \p modules.
1186 * @param[in] options Options for the inserting data to the target data tree options, see @ref parseroptions.
1187 * Accepted data type values include #LYD_OPT_DATA, #LYD_OPT_CONFIG, #LYD_OPT_GET,
1188 * #LYD_OPT_GETCONFIG, and #LYD_OPT_EDIT.
Michal Vasko20555d82018-12-12 16:30:50 +01001189 * @param[in] ... Used only if options include #LYD_OPT_VAL_DIFF. In that case a (struct lyd_difflist **)
1190 * is expected into which all data node changes performed by the validation will be stored.
1191 * Needs to be properly freed. Meaning of diff type is following:
1192 * - LYD_DIFF_CREATED:
1193 * - first - Path identifying the parent node (format of lyd_path()).
1194 * - second - Duplicated subtree of the created nodes.
1195 * - LYD_DIFF_DELETED:
1196 * - first - Unlinked subtree of the deleted nodes.
1197 * - second - Path identifying the original parent (format of lyd_path()).
Michal Vasko993af1e2018-12-10 12:05:17 +01001198 * @return 0 on success, nonzero in case of an error.
1199 */
Michal Vasko20555d82018-12-12 16:30:50 +01001200int lyd_validate_modules(struct lyd_node **node, const struct lys_module **modules, int mod_count, int options, ...);
1201
1202/**
1203 * @brief Free special diff that was returned by lyd_validate() or lyd_validate_modules().
1204 *
1205 * @param[in] diff Diff to free.
1206 */
1207void lyd_free_val_diff(struct lyd_difflist *diff);
Michal Vasko993af1e2018-12-10 12:05:17 +01001208
1209/**
Radek Krejcif6fac5e2017-05-18 15:14:18 +02001210 * @brief Check restrictions applicable to the particular leaf/leaf-list on the given string value.
1211 *
1212 * Validates the value only using the types' restrictions. Do not check the rest of restrictions dependent on the
1213 * data tree (must, when statements or uniqueness of the leaf-list item).
1214 *
Radek Krejcie3bd2f32017-08-07 13:52:28 +02001215 * The format of the data must follow rules for the lexical representation of the specific YANG type. Note
1216 * that if there are some extensions of the lexical representation for the YANG module (default value), they are
1217 * not supported by this function - it strictly follows rules for the lexical representations in data trees.
1218 *
Radek Krejcif6fac5e2017-05-18 15:14:18 +02001219 * @param[in] node Schema node of the leaf or leaf-list eventually holding the \p value.
1220 * @param[in] value Value to be checked (NULL is checked as empty string).
1221 * @return EXIT_SUCCESS if the \p value conforms to the restrictions, EXIT_FAILURE otherwise.
1222 */
1223int lyd_validate_value(struct lys_node *node, const char *value);
1224
1225/**
Radek Krejci46180b52016-08-31 16:01:32 +02001226 * @brief Get know if the node contain (despite implicit or explicit) default value.
Radek Krejci7b4309c2016-03-23 10:30:29 +01001227 *
Radek Krejci46180b52016-08-31 16:01:32 +02001228 * @param[in] node The leaf or leaf-list to check. Note, that leaf-list is marked as default only when the complete
1229 * and only the default set is present (node's siblings are also checked).
1230 * @return 1 if the node contains the default value, 0 otherwise.
Radek Krejci7b4309c2016-03-23 10:30:29 +01001231 */
Radek Krejci46180b52016-08-31 16:01:32 +02001232int lyd_wd_default(struct lyd_node_leaf_list *node);
Radek Krejci6b8f6ac2016-03-23 12:33:04 +01001233
1234/**
Michal Vasko55f60be2015-10-14 13:12:58 +02001235 * @brief Unlink the specified data subtree. All referenced namespaces are copied.
Michal Vasko2d162e12015-09-24 14:33:29 +02001236 *
Michal Vasko299f9832017-01-06 13:29:22 +01001237 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1238 *
Michal Vasko2d162e12015-09-24 14:33:29 +02001239 * Note, that the node's connection with the schema tree is kept. Therefore, in case of
1240 * reconnecting the node to a data tree using lyd_paste() it is necessary to paste it
1241 * to the appropriate place in the data tree following the schema.
1242 *
1243 * @param[in] node Data tree node to be unlinked (together with all children).
1244 * @return 0 for success, nonzero for error
1245 */
1246int lyd_unlink(struct lyd_node *node);
1247
1248/**
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001249 * @brief Free (and unlink) the specified data subtree. Use carefully, since libyang silently creates default nodes,
1250 * it is always better to use lyd_free_withsiblings() to free the complete data tree.
Michal Vasko2d162e12015-09-24 14:33:29 +02001251 *
Michal Vasko299f9832017-01-06 13:29:22 +01001252 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1253 *
Michal Vasko2d162e12015-09-24 14:33:29 +02001254 * @param[in] node Root of the (sub)tree to be freed.
1255 */
1256void lyd_free(struct lyd_node *node);
1257
1258/**
Radek Krejcifd0bcf02016-09-09 13:28:34 +02001259 * @brief Free (and unlink) the specified data tree and all its siblings (preceding as well as following).
Radek Krejci81468402016-01-07 13:52:40 +01001260 *
Michal Vaskof41c25e2018-12-07 12:06:17 +01001261 * If used on a top-level node it means that the whole data tree is being freed and unnecessary operations
1262 * are skipped. Always use this function for freeing a whole data tree to achieve better performance.
1263 *
Michal Vasko299f9832017-01-06 13:29:22 +01001264 * __PARTIAL CHANGE__ - validate after the final change on the data tree (see @ref howtodatamanipulators).
1265 *
Radek Krejci81468402016-01-07 13:52:40 +01001266 * @param[in] node One of the siblings root element of the (sub)trees to be freed.
1267 */
1268void lyd_free_withsiblings(struct lyd_node *node);
1269
1270/**
Radek Krejci134610e2015-10-20 17:15:34 +02001271 * @brief Insert attribute into the data node.
1272 *
1273 * @param[in] parent Data node where to place the attribute
Radek Krejci70ecd722016-03-21 09:04:00 +01001274 * @param[in] mod An alternative way to specify attribute's module (namespace) used in case the \p name does
1275 * not include prefix. If neither prefix in the \p name nor mod is specified, the attribute's
1276 * module is inherited from the \p parent node. It is not allowed to have attributes with no
1277 * module (namespace).
1278 * @param[in] name Attribute name. The string can include the attribute's module (namespace) as the name's
1279 * prefix (prefix:name). Prefix must be the name of one of the schema in the \p parent's context.
1280 * If the prefix is not specified, the \p mod parameter is used. If neither of these parameters is
1281 * usable, attribute inherits module (namespace) from the \p parent node. It is not allowed to
1282 * have attributes with no module (namespace).
Radek Krejci134610e2015-10-20 17:15:34 +02001283 * @param[in] value Attribute value
1284 * @return pointer to the created attribute (which is already connected in \p parent) or NULL on error.
1285 */
Radek Krejci70ecd722016-03-21 09:04:00 +01001286struct lyd_attr *lyd_insert_attr(struct lyd_node *parent, const struct lys_module *mod, const char *name,
1287 const char *value);
Radek Krejci134610e2015-10-20 17:15:34 +02001288
1289/**
Radek Krejci88f29302015-10-30 15:42:33 +01001290 * @brief Destroy data attribute
1291 *
1292 * If the attribute to destroy is a member of a node attribute list, it is necessary to
1293 * provide the node itself as \p parent to keep the list consistent.
1294 *
1295 * @param[in] ctx Context where the attribute was created (usually it is the context of the \p parent)
1296 * @param[in] parent Parent node where the attribute is placed
1297 * @param[in] attr Attribute to destroy
1298 * @param[in] recursive Zero to destroy only the attribute, non-zero to destroy also all the subsequent attributes
1299 * in the list.
1300 */
1301void lyd_free_attr(struct ly_ctx *ctx, struct lyd_node *parent, struct lyd_attr *attr, int recursive);
1302
1303/**
Radek Krejci6910a032016-04-13 10:06:21 +02001304 * @brief Return main module of the data tree node.
1305 *
1306 * In case of regular YANG module, it returns ::lys_node#module pointer,
1307 * but in case of submodule, it returns pointer to the main module.
1308 *
1309 * @param[in] node Data tree node to be examined
1310 * @return pointer to the main module (schema structure), NULL in case of error.
1311 */
1312struct lys_module *lyd_node_module(const struct lyd_node *node);
1313
1314/**
Michal Vasko0a8ab412017-01-09 11:10:08 +01001315 * @brief Get the type structure of a leaf.
1316 *
1317 * In case of a union, the correct specific type is found.
1318 * In case of a leafref, the final (if there is a chain of leafrefs) target's type is found.
Michal Vaskoe3886bb2017-01-02 11:33:28 +01001319 *
1320 * @param[in] leaf Leaf to examine.
Michal Vasko0a8ab412017-01-09 11:10:08 +01001321 * @return Found type, NULL on error.
Michal Vaskoe3886bb2017-01-02 11:33:28 +01001322 */
1323const struct lys_type *lyd_leaf_type(const struct lyd_node_leaf_list *leaf);
1324
1325/**
Radek Krejcidef50022016-02-01 16:38:32 +01001326* @brief Print data tree in the specified format.
1327*
Radek Krejcidef50022016-02-01 16:38:32 +01001328* @param[out] strp Pointer to store the resulting dump.
1329* @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
1330* node of the data tree to print the specific subtree.
1331* @param[in] format Data output format.
Michal Vasko228431e2018-07-10 15:47:11 +02001332* @param[in] options [printer flags](@ref printerflags). \p format LYD_LYB accepts only #LYP_WITHSIBLINGS option.
Radek Krejcidef50022016-02-01 16:38:32 +01001333* @return 0 on success, 1 on failure (#ly_errno is set).
1334*/
1335int lyd_print_mem(char **strp, const struct lyd_node *root, LYD_FORMAT format, int options);
Michal Vasko2d162e12015-09-24 14:33:29 +02001336
1337/**
Radek Krejcidef50022016-02-01 16:38:32 +01001338 * @brief Print data tree in the specified format.
Michal Vasko2d162e12015-09-24 14:33:29 +02001339 *
Michal Vaskof8942f62018-09-24 14:12:28 +02001340 * @param[in] fd File descriptor where to print the data.
Radek Krejcidef50022016-02-01 16:38:32 +01001341 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
1342 * node of the data tree to print the specific subtree.
Radek Krejcidef50022016-02-01 16:38:32 +01001343 * @param[in] format Data output format.
Michal Vasko228431e2018-07-10 15:47:11 +02001344 * @param[in] options [printer flags](@ref printerflags). \p format LYD_LYB accepts only #LYP_WITHSIBLINGS option.
Radek Krejcidef50022016-02-01 16:38:32 +01001345 * @return 0 on success, 1 on failure (#ly_errno is set).
Michal Vasko2d162e12015-09-24 14:33:29 +02001346 */
Radek Krejcidef50022016-02-01 16:38:32 +01001347int lyd_print_fd(int fd, const struct lyd_node *root, LYD_FORMAT format, int options);
1348
1349/**
1350 * @brief Print data tree in the specified format.
1351 *
Michal Vaskof8942f62018-09-24 14:12:28 +02001352 * @param[in] f File stream where to print the data.
Radek Krejcidef50022016-02-01 16:38:32 +01001353 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
1354 * node of the data tree to print the specific subtree.
Radek Krejcidef50022016-02-01 16:38:32 +01001355 * @param[in] format Data output format.
Michal Vasko228431e2018-07-10 15:47:11 +02001356 * @param[in] options [printer flags](@ref printerflags). \p format LYD_LYB accepts only #LYP_WITHSIBLINGS option.
Radek Krejcidef50022016-02-01 16:38:32 +01001357 * @return 0 on success, 1 on failure (#ly_errno is set).
1358 */
1359int lyd_print_file(FILE *f, const struct lyd_node *root, LYD_FORMAT format, int options);
1360
1361/**
1362 * @brief Print data tree in the specified format.
1363 *
Michal Vaskof8942f62018-09-24 14:12:28 +02001364 * @param[in] path File path where to print the data.
Radek Krejcidef50022016-02-01 16:38:32 +01001365 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
1366 * node of the data tree to print the specific subtree.
Michal Vaskof8942f62018-09-24 14:12:28 +02001367 * @param[in] format Data output format.
1368 * @param[in] options [printer flags](@ref printerflags). \p format LYD_LYB accepts only #LYP_WITHSIBLINGS option.
1369 * @return 0 on success, 1 on failure (#ly_errno is set).
1370 */
1371int lyd_print_path(const char *path, const struct lyd_node *root, LYD_FORMAT format, int options);
1372
1373/**
1374 * @brief Print data tree in the specified format.
1375 *
Radek Krejcidef50022016-02-01 16:38:32 +01001376 * @param[in] writeclb Callback function to write the data (see write(1)).
Michal Vaskof8942f62018-09-24 14:12:28 +02001377 * @param[in] root Root node of the data tree to print. It can be actually any (not only real root)
1378 * node of the data tree to print the specific subtree.
Radek Krejcidef50022016-02-01 16:38:32 +01001379 * @param[in] arg Optional caller-specific argument to be passed to the \p writeclb callback.
1380 * @param[in] format Data output format.
Michal Vasko228431e2018-07-10 15:47:11 +02001381 * @param[in] options [printer flags](@ref printerflags). \p format LYD_LYB accepts only #LYP_WITHSIBLINGS option.
Radek Krejcidef50022016-02-01 16:38:32 +01001382 * @return 0 on success, 1 on failure (#ly_errno is set).
1383 */
1384int lyd_print_clb(ssize_t (*writeclb)(void *arg, const void *buf, size_t count), void *arg,
1385 const struct lyd_node *root, LYD_FORMAT format, int options);
Michal Vasko2d162e12015-09-24 14:33:29 +02001386
Michal Vasko4d1f0482016-09-19 14:35:06 +02001387/**
1388 * @brief Get the double value of a decimal64 leaf/leaf-list.
1389 *
1390 * YANG decimal64 type enables higher precision numbers than IEEE 754 double-precision
1391 * format, so this conversion does not have to be lossless.
1392 *
1393 * @param[in] node Leaf/leaf-list of type decimal64.
1394 * @return Closest double equivalent to the decimal64 value.
1395 */
1396double lyd_dec64_to_double(const struct lyd_node *node);
1397
Michal Vasko196c6102018-08-08 16:27:42 +02001398/**
1399 * @brief Get the length of a printed LYB data tree.
1400 *
1401 * @param[in] data LYB data.
1402 * @return \p data length or -1 on error.
1403 */
1404int lyd_lyb_data_length(const char *data);
1405
Michal Vaskod025ee32018-06-28 10:04:19 +02001406#ifdef LY_ENABLED_LYD_PRIV
1407
1408/**
1409 * @brief Set a schema private pointer to a user pointer.
1410 *
1411 * @param[in] node Data node, whose private field will be assigned.
1412 * @param[in] priv Arbitrary user-specified pointer.
1413 * @return Previous private object of the \p node (NULL if this is the first call on the \p node). Note, that
1414 * the caller is in this case responsible (if it is necessary) for freeing the replaced private object. In case
1415 * of invalid (NULL) \p node, NULL is returned and #ly_errno is set to #LY_EINVAL.
1416 */
1417void *lyd_set_private(const struct lyd_node *node, void *priv);
1418
1419#endif
1420
Michal Vasko2d162e12015-09-24 14:33:29 +02001421/**@} */
1422
1423#ifdef __cplusplus
1424}
1425#endif
1426
1427#endif /* LY_TREE_DATA_H_ */