lyb OPTIMIZE for a fixed length plugin types
The length number is not printed/parsed.
diff --git a/src/parser_lyb.c b/src/parser_lyb.c
index f25578b..2756bb7 100644
--- a/src/parser_lyb.c
+++ b/src/parser_lyb.c
@@ -226,6 +226,7 @@
/**
* @brief Read the term node.
*
+ * @param[in] term Compiled term node.
* @param[out] term_value Set to term node value in dynamically
* allocated memory. The caller must release it.
* @param[out] term_value_len Value length in bytes. The zero byte is
@@ -234,14 +235,32 @@
* @return LY_ERR value.
*/
static LY_ERR
-lyb_read_term(uint8_t **term_value, uint32_t *term_value_len, struct lylyb_ctx *lybctx)
+lyb_read_term(const struct lysc_node_leaf *term, uint8_t **term_value,
+ uint32_t *term_value_len, struct lylyb_ctx *lybctx)
{
uint32_t allocated_size;
+ int32_t lyb_data_len;
+ struct lysc_type_leafref *type_lf;
- assert(term_value && term_value_len && lybctx);
+ assert(term && term_value && term_value_len && lybctx);
- /* Parse value size. */
- lyb_read_number(term_value_len, sizeof *term_value_len, sizeof *term_value_len, lybctx);
+ /* Find out the size from @ref howtoDataLYB. */
+ if (term->type->basetype == LY_TYPE_LEAFREF) {
+ /* Leafref itself is ignored, the target is loaded directly. */
+ type_lf = (struct lysc_type_leafref *)term->type;
+ lyb_data_len = type_lf->realtype->plugin->lyb_data_len;
+ } else {
+ lyb_data_len = term->type->plugin->lyb_data_len;
+ }
+
+ if (lyb_data_len < 0) {
+ /* Parse value size. */
+ lyb_read_number(term_value_len, sizeof *term_value_len,
+ sizeof *term_value_len, lybctx);
+ } else {
+ /* Data size is fixed. */
+ *term_value_len = lyb_data_len;
+ }
/* Allocate memory. */
allocated_size = *term_value_len + 1;
@@ -882,7 +901,8 @@
}
} else if (snode->nodetype & LYD_NODE_TERM) {
/* parse value */
- ret = lyb_read_term(&term_value, &term_value_len, lybctx->lybctx);
+ ret = lyb_read_term((struct lysc_node_leaf *)snode, &term_value,
+ &term_value_len, lybctx->lybctx);
LY_CHECK_GOTO(ret, cleanup);
dynamic = 1;
diff --git a/src/plugins_types.h b/src/plugins_types.h
index 1763134..5f592e9 100644
--- a/src/plugins_types.h
+++ b/src/plugins_types.h
@@ -548,6 +548,8 @@
lyplg_type_print_clb print; /**< printer callback to get string representing the value */
lyplg_type_dup_clb duplicate; /**< data duplication callback */
lyplg_type_free_clb free; /**< optional function to free the type-spceific way stored value */
+ int32_t lyb_data_len; /**< Length of the data in [LYB format](@ref howtoDataLYB).
+ For variable-length is set to -1. */
};
struct lyplg_type_record {
diff --git a/src/plugins_types/binary.c b/src/plugins_types/binary.c
index f8cff94..5da2fc1 100644
--- a/src/plugins_types/binary.c
+++ b/src/plugins_types/binary.c
@@ -408,6 +408,7 @@
.plugin.print = lyplg_type_print_binary,
.plugin.duplicate = lyplg_type_dup_binary,
.plugin.free = lyplg_type_free_binary,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/bits.c b/src/plugins_types/bits.c
index c0765c4..d065824 100644
--- a/src/plugins_types/bits.c
+++ b/src/plugins_types/bits.c
@@ -503,7 +503,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_bits,
.plugin.duplicate = lyplg_type_dup_bits,
- .plugin.free = lyplg_type_free_bits
+ .plugin.free = lyplg_type_free_bits,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/boolean.c b/src/plugins_types/boolean.c
index 6500f0e..e16db4f 100644
--- a/src/plugins_types/boolean.c
+++ b/src/plugins_types/boolean.c
@@ -158,7 +158,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_boolean,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 1,
},
{0}
};
diff --git a/src/plugins_types/date_and_time.c b/src/plugins_types/date_and_time.c
index cbc1578..6633622 100644
--- a/src/plugins_types/date_and_time.c
+++ b/src/plugins_types/date_and_time.c
@@ -289,7 +289,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_date_and_time,
.plugin.duplicate = lyplg_type_dup_date_and_time,
- .plugin.free = lyplg_type_free_date_and_time
+ .plugin.free = lyplg_type_free_date_and_time,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/decimal64.c b/src/plugins_types/decimal64.c
index fa8f837..a048198 100644
--- a/src/plugins_types/decimal64.c
+++ b/src/plugins_types/decimal64.c
@@ -212,7 +212,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_decimal64,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 8,
},
{0}
};
diff --git a/src/plugins_types/empty.c b/src/plugins_types/empty.c
index c45c7c9..f3b1478 100644
--- a/src/plugins_types/empty.c
+++ b/src/plugins_types/empty.c
@@ -96,7 +96,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_simple,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 0,
},
{0}
};
diff --git a/src/plugins_types/enumeration.c b/src/plugins_types/enumeration.c
index 9964ca2..77c9112 100644
--- a/src/plugins_types/enumeration.c
+++ b/src/plugins_types/enumeration.c
@@ -170,7 +170,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_enum,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 4,
},
{0}
};
diff --git a/src/plugins_types/identityref.c b/src/plugins_types/identityref.c
index 8647a5a..3a6319c 100644
--- a/src/plugins_types/identityref.c
+++ b/src/plugins_types/identityref.c
@@ -339,7 +339,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_identityref,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/instanceid.c b/src/plugins_types/instanceid.c
index 591af8e..733405a 100644
--- a/src/plugins_types/instanceid.c
+++ b/src/plugins_types/instanceid.c
@@ -366,7 +366,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_instanceid,
.plugin.duplicate = lyplg_type_dup_instanceid,
- .plugin.free = lyplg_type_free_instanceid
+ .plugin.free = lyplg_type_free_instanceid,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/integer.c b/src/plugins_types/integer.c
index 9239562..3acd154 100644
--- a/src/plugins_types/integer.c
+++ b/src/plugins_types/integer.c
@@ -449,7 +449,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_uint,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 1,
}, {
.module = "",
.revision = NULL,
@@ -462,7 +463,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_uint,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 2,
}, {
.module = "",
.revision = NULL,
@@ -475,7 +477,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_uint,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 4,
}, {
.module = "",
.revision = NULL,
@@ -488,7 +491,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_uint,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 8,
}, {
.module = "",
.revision = NULL,
@@ -501,7 +505,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_int,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 1,
}, {
.module = "",
.revision = NULL,
@@ -514,7 +519,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_int,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 2,
}, {
.module = "",
.revision = NULL,
@@ -527,7 +533,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_int,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 4,
}, {
.module = "",
.revision = NULL,
@@ -540,7 +547,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_int,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 8,
},
{0}
};
diff --git a/src/plugins_types/ipv4_address.c b/src/plugins_types/ipv4_address.c
index 1d3b07c..ee8cffc 100644
--- a/src/plugins_types/ipv4_address.c
+++ b/src/plugins_types/ipv4_address.c
@@ -365,7 +365,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv4_address,
.plugin.duplicate = lyplg_type_dup_ipv4_address,
- .plugin.free = lyplg_type_free_ipv4_address
+ .plugin.free = lyplg_type_free_ipv4_address,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/ipv4_address_no_zone.c b/src/plugins_types/ipv4_address_no_zone.c
index fe403e6..1e30e4f 100644
--- a/src/plugins_types/ipv4_address_no_zone.c
+++ b/src/plugins_types/ipv4_address_no_zone.c
@@ -209,7 +209,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv4_address_no_zone,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = 4,
},
{0}
};
diff --git a/src/plugins_types/ipv4_prefix.c b/src/plugins_types/ipv4_prefix.c
index a4738f5..8f38c3e 100644
--- a/src/plugins_types/ipv4_prefix.c
+++ b/src/plugins_types/ipv4_prefix.c
@@ -325,7 +325,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv4_prefix,
.plugin.duplicate = lyplg_type_dup_ipv4_prefix,
- .plugin.free = lyplg_type_free_ipv4_prefix
+ .plugin.free = lyplg_type_free_ipv4_prefix,
+ .plugin.lyb_data_len = LYB_VALUE_LEN,
},
{0}
};
diff --git a/src/plugins_types/ipv6_address.c b/src/plugins_types/ipv6_address.c
index 1ed2e8f..944f2f3 100644
--- a/src/plugins_types/ipv6_address.c
+++ b/src/plugins_types/ipv6_address.c
@@ -366,7 +366,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv6_address,
.plugin.duplicate = lyplg_type_dup_ipv6_address,
- .plugin.free = lyplg_type_free_ipv6_address
+ .plugin.free = lyplg_type_free_ipv6_address,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/ipv6_address_no_zone.c b/src/plugins_types/ipv6_address_no_zone.c
index b69da95..8af2581 100644
--- a/src/plugins_types/ipv6_address_no_zone.c
+++ b/src/plugins_types/ipv6_address_no_zone.c
@@ -300,7 +300,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv6_address_no_zone,
.plugin.duplicate = lyplg_type_dup_ipv6_address_no_zone,
- .plugin.free = lyplg_type_free_ipv6_address_no_zone
+ .plugin.free = lyplg_type_free_ipv6_address_no_zone,
+ .plugin.lyb_data_len = 16,
},
{0}
};
diff --git a/src/plugins_types/ipv6_prefix.c b/src/plugins_types/ipv6_prefix.c
index e864c74..0027df2 100644
--- a/src/plugins_types/ipv6_prefix.c
+++ b/src/plugins_types/ipv6_prefix.c
@@ -339,7 +339,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_ipv6_prefix,
.plugin.duplicate = lyplg_type_dup_ipv6_prefix,
- .plugin.free = lyplg_type_free_ipv6_prefix
+ .plugin.free = lyplg_type_free_ipv6_prefix,
+ .plugin.lyb_data_len = LYB_VALUE_LEN,
},
{0}
};
diff --git a/src/plugins_types/leafref.c b/src/plugins_types/leafref.c
index 9755796..2e2d052 100644
--- a/src/plugins_types/leafref.c
+++ b/src/plugins_types/leafref.c
@@ -131,7 +131,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_leafref,
.plugin.duplicate = lyplg_type_dup_leafref,
- .plugin.free = lyplg_type_free_leafref
+ .plugin.free = lyplg_type_free_leafref,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/node_instanceid.c b/src/plugins_types/node_instanceid.c
index fd0322c..32fb028 100644
--- a/src/plugins_types/node_instanceid.c
+++ b/src/plugins_types/node_instanceid.c
@@ -252,7 +252,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_instanceid,
.plugin.duplicate = lyplg_type_dup_instanceid,
- .plugin.free = lyplg_type_free_instanceid
+ .plugin.free = lyplg_type_free_instanceid,
+ .plugin.lyb_data_len = -1,
},
{
.module = "ietf-netconf-acm",
@@ -266,7 +267,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_instanceid,
.plugin.duplicate = lyplg_type_dup_instanceid,
- .plugin.free = lyplg_type_free_instanceid
+ .plugin.free = lyplg_type_free_instanceid,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/string.c b/src/plugins_types/string.c
index c127148..efebf4d 100644
--- a/src/plugins_types/string.c
+++ b/src/plugins_types/string.c
@@ -102,7 +102,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_simple,
.plugin.duplicate = lyplg_type_dup_simple,
- .plugin.free = lyplg_type_free_simple
+ .plugin.free = lyplg_type_free_simple,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/union.c b/src/plugins_types/union.c
index f8698b8..6477189 100644
--- a/src/plugins_types/union.c
+++ b/src/plugins_types/union.c
@@ -606,7 +606,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_union,
.plugin.duplicate = lyplg_type_dup_union,
- .plugin.free = lyplg_type_free_union
+ .plugin.free = lyplg_type_free_union,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/plugins_types/xpath1.0.c b/src/plugins_types/xpath1.0.c
index b98c59c..b721691 100644
--- a/src/plugins_types/xpath1.0.c
+++ b/src/plugins_types/xpath1.0.c
@@ -436,7 +436,8 @@
.plugin.sort = NULL,
.plugin.print = lyplg_type_print_xpath10,
.plugin.duplicate = lyplg_type_dup_xpath10,
- .plugin.free = lyplg_type_free_xpath10
+ .plugin.free = lyplg_type_free_xpath10,
+ .plugin.lyb_data_len = -1,
},
{0}
};
diff --git a/src/printer_lyb.c b/src/printer_lyb.c
index 4023646..dade5de 100644
--- a/src/printer_lyb.c
+++ b/src/printer_lyb.c
@@ -704,30 +704,54 @@
static LY_ERR
lyb_print_term(struct lyd_node_term *term, struct ly_out *out, struct lylyb_ctx *lybctx)
{
- LY_ERR ret;
+ LY_ERR ret = LY_SUCCESS;
ly_bool dynamic = 0;
void *value;
size_t value_len = 0;
+ int32_t lyb_data_len;
+ lyplg_type_print_clb print;
assert(term->value.realtype && term->value.realtype->plugin && term->value.realtype->plugin->print &&
term->schema);
- value = (void *)term->value.realtype->plugin->print(term->schema->module->ctx,
- &term->value, LY_VALUE_LYB, NULL, &dynamic, &value_len);
- LY_CHECK_RET(!value, LY_EINT);
+ /* Get length of LYB data to print. */
+ lyb_data_len = term->value.realtype->plugin->lyb_data_len;
- if (value_len > UINT32_MAX) {
- LOGERR(lybctx->ctx, LY_EINT, "The maximum length of the LYB data "
- "from a term node must not exceed %lu.", UINT32_MAX);
- return LY_EINT;
+ /* Get value and also print its length only if size is not fixed. */
+ print = term->value.realtype->plugin->print;
+ if (lyb_data_len < 0) {
+ /* Variable-length data. */
+
+ /* Get value and its length from plugin. */
+ value = (void *)print(term->schema->module->ctx, &term->value,
+ LY_VALUE_LYB, NULL, &dynamic, &value_len);
+ LY_CHECK_GOTO(ret, cleanup);
+
+ if (value_len > UINT32_MAX) {
+ LOGERR(lybctx->ctx, LY_EINT, "The maximum length of the LYB data "
+ "from a term node must not exceed %lu.", UINT32_MAX);
+ ret = LY_EINT;
+ goto cleanup;
+ }
+
+ /* Print the length of the data as 32-bit unsigned integer. */
+ ret = lyb_write_number(value_len, sizeof(uint32_t), out, lybctx);
+ LY_CHECK_GOTO(ret, cleanup);
+ } else {
+ /* Fixed-length data. */
+
+ /* Get value from plugin. */
+ value = (void *)print(term->schema->module->ctx, &term->value,
+ LY_VALUE_LYB, NULL, &dynamic, NULL);
+ LY_CHECK_GOTO(ret, cleanup);
+
+ /* Copy the length from the compiled node. */
+ value_len = lyb_data_len;
}
- /* Print the length of the data as 32-bit unsigned integer. */
- ret = lyb_write_number(value_len, sizeof(uint32_t), out, lybctx);
- LY_CHECK_GOTO(ret, cleanup);
-
+ /* Print value. */
if (value_len > 0) {
- /* Print the data simply as it is. */
+ /* Print the value simply as it is. */
ret = lyb_write(out, value, value_len, lybctx);
LY_CHECK_GOTO(ret, cleanup);
}