diff BUGFIX add support for anyxm/anydata
diff --git a/src/diff.c b/src/diff.c
index 3a447d6..67039af 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -480,10 +480,13 @@
}
/* orig-value */
- if ((schema->nodetype == LYS_LEAF) && (*op == LYD_DIFF_OP_REPLACE)) {
- /* leaf */
- *orig_value = strdup(LYD_CANON_VALUE(first));
- LY_CHECK_ERR_RET(!*orig_value, LOGMEM(schema->module->ctx), LY_EMEM);
+ if ((schema->nodetype & (LYS_LEAF | LYS_ANYDATA)) && (*op == LYD_DIFF_OP_REPLACE)) {
+ if (schema->nodetype == LYS_LEAF) {
+ *orig_value = strdup(LYD_CANON_VALUE(first));
+ LY_CHECK_ERR_RET(!*orig_value, LOGMEM(schema->module->ctx), LY_EMEM);
+ } else {
+ LY_CHECK_RET(lyd_any_value_str(first, orig_value));
+ }
}
return LY_SUCCESS;
@@ -965,16 +968,22 @@
/* we are not going recursively in this case, the whole subtree was already deleted */
return LY_SUCCESS;
case LYD_DIFF_OP_REPLACE:
- LY_CHECK_ERR_RET(diff_node->schema->nodetype != LYS_LEAF, LOGINT(ctx), LY_EINT);
+ LY_CHECK_ERR_RET(!(diff_node->schema->nodetype & (LYS_LEAF | LYS_ANYDATA)), LOGINT(ctx), LY_EINT);
/* find the node */
lyd_diff_find_node(*first_node, diff_node, &match);
LY_CHECK_ERR_RET(!match, LOGINT(LYD_CTX(diff_node)), LY_EINT);
- /* update its value */
- ret = lyd_change_term(match, LYD_CANON_VALUE(diff_node));
- if (ret && (ret != LY_EEXIST)) {
- LOGINT_RET(ctx);
+ /* update the value */
+ if (diff_node->schema->nodetype == LYS_LEAF) {
+ ret = lyd_change_term(match, LYD_CANON_VALUE(diff_node));
+ if (ret && (ret != LY_EEXIST)) {
+ LOGINT_RET(ctx);
+ }
+ } else {
+ struct lyd_node_any *any = (struct lyd_node_any *)diff_node;
+ ret = lyd_any_copy_value(match, &any->value, any->value_type);
+ LY_CHECK_RET(ret);
}
/* with flags */
@@ -1531,7 +1540,7 @@
}
static LY_ERR
-lyd_diff_reverse_value(struct lyd_node *leaf, const struct lys_module *mod)
+lyd_diff_reverse_value(struct lyd_node *node, const struct lys_module *mod)
{
LY_ERR ret = LY_SUCCESS;
struct lyd_meta *meta;
@@ -1539,19 +1548,30 @@
char *val2;
uint32_t flags;
- meta = lyd_find_meta(leaf->meta, mod, "orig-value");
- LY_CHECK_ERR_RET(!meta, LOGINT(LYD_CTX(leaf)), LY_EINT);
+ assert(node->schema->nodetype & (LYS_LEAF | LYS_ANYDATA));
+
+ meta = lyd_find_meta(node->meta, mod, "orig-value");
+ LY_CHECK_ERR_RET(!meta, LOGINT(LYD_CTX(node)), LY_EINT);
/* orig-value */
val1 = meta->value.canonical;
/* current value */
- val2 = strdup(LYD_CANON_VALUE(leaf));
+ if (node->schema->nodetype == LYS_LEAF) {
+ val2 = strdup(LYD_CANON_VALUE(node));
+ } else {
+ LY_CHECK_RET(lyd_any_value_str(node, &val2));
+ }
/* switch values, keep default flag */
- flags = leaf->flags;
- LY_CHECK_GOTO(ret = lyd_change_term(leaf, val1), cleanup);
- leaf->flags = flags;
+ flags = node->flags;
+ if (node->schema->nodetype == LYS_LEAF) {
+ LY_CHECK_GOTO(ret = lyd_change_term(node, val1), cleanup);
+ } else {
+ union lyd_any_value anyval = {.str = val1};
+ LY_CHECK_GOTO(ret = lyd_any_copy_value(node, &anyval, LYD_ANYDATA_STRING), cleanup);
+ }
+ node->flags = flags;
LY_CHECK_GOTO(ret = lyd_change_meta(meta, val2), cleanup);
cleanup:
@@ -1665,6 +1685,11 @@
LY_CHECK_GOTO(ret = lyd_diff_reverse_value(elem, mod), cleanup);
LY_CHECK_GOTO(ret = lyd_diff_reverse_default(elem, mod), cleanup);
break;
+ case LYS_ANYXML:
+ case LYS_ANYDATA:
+ /* any value change */
+ LY_CHECK_GOTO(ret = lyd_diff_reverse_value(elem, mod), cleanup);
+ break;
case LYS_LEAFLIST:
/* leaf-list move */
LY_CHECK_GOTO(ret = lyd_diff_reverse_default(elem, mod), cleanup);