Very large commit for upcoming 4.4 release
Major New features
* New and updated search functions using xpath, api-path and instance-id
* New search functions using api-path and instance_id:
* C search functions: `clixon_find_instance_id()` and `clixon_find_api_path()`
* Binary search optimization in lists for indexed leafs in all three formats.
* This improves search performance to O(logN) which is drastical improvements for large lists.
* You can also register explicit indexes for making binary search (not only list keys)
* For more info, see docs at [paths](https://clixon-docs.readthedocs.io/en/latest/paths.html) and
[search](https://clixon-docs.readthedocs.io/en/latest/xml.html#searching-in-xml)
API changes on existing features (you may need to change your code)
* On failed validation of leafrefs, error message changed from: `No such leaf` to `No leaf <name> matching path <path>`.
* CLI Error message (clicon_rpc_generate_error()) changed when backend returns netconf error to be more descriptive:
* Original: `Config error: Validate failed. Edit and try again or discard changes: Invalid argument`
* New (example): `Netconf error: application operation-failed Identityref validation failed, undefined not derived from acl-base . Validate failed. Edit and try again or discard changes"
Minor changes
* Test framework
* Added `-- -S <file>` command-line to main example to be able to return any state to main example.
* Added `test/cicd` test scripts for running on a set of other hosts
* C-code restructuring
* clixon_yang.c partitioned and moved code into clixon_yang_parse_lib.c and clixon_yang_module.c and move back some code from clixon_yang_type.c.
* partly to reduce size, but most important to limit code that accesses internal yang structures, only clixon_yang.c does this now.
This commit is contained in:
parent
e8ae628d06
commit
19e21be0bc
132 changed files with 6241 additions and 2332 deletions
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
***** BEGIN LICENSE BLOCK *****
|
||||
|
||||
Copyright (C) 2009-2019 Olof Hagsand and Benny Holmgren
|
||||
Copyright (C) 2009-2020 Olof Hagsand
|
||||
|
||||
This file is part of CLIXON.
|
||||
|
||||
|
|
@ -68,7 +68,6 @@
|
|||
#include "clixon_xpath.h"
|
||||
#include "clixon_xpath_optimize.h"
|
||||
|
||||
|
||||
#ifdef XPATH_LIST_OPTIMIZE
|
||||
static xpath_tree *_xmtop = NULL; /* pattern match tree top */
|
||||
static xpath_tree *_xm = NULL;
|
||||
|
|
@ -77,7 +76,6 @@ static int _optimize_enable = 1;
|
|||
static int _optimize_hits = 0;
|
||||
#endif /* XPATH_LIST_OPTIMIZE */
|
||||
|
||||
|
||||
/* XXX development in clixon_xpath_eval */
|
||||
int
|
||||
xpath_list_optimize_stats(int *hits)
|
||||
|
|
@ -89,6 +87,9 @@ xpath_list_optimize_stats(int *hits)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*! Enable xpath optimize
|
||||
* Cant replace this with optin since there is no handle in xpath functions,...
|
||||
*/
|
||||
int
|
||||
xpath_list_optimize_set(int enable)
|
||||
{
|
||||
|
|
@ -213,7 +214,8 @@ loop_preds(xpath_tree *xt,
|
|||
*
|
||||
* @param[in] xt XPath tree
|
||||
* @param[in] xv XML base node
|
||||
* @param[out] xp XML found node (retval == 1)
|
||||
* @param[out] xvec Array of found nodes
|
||||
* @param[out] xlen Len of xvec
|
||||
* @param[out] key
|
||||
* @param[out] keyval
|
||||
* @retval -1 Error
|
||||
|
|
@ -225,7 +227,8 @@ loop_preds(xpath_tree *xt,
|
|||
static int
|
||||
xpath_list_optimize_fn(xpath_tree *xt,
|
||||
cxobj *xv,
|
||||
cxobj **xp)
|
||||
cxobj ***xvec,
|
||||
size_t *xlen)
|
||||
{
|
||||
int retval = -1;
|
||||
xpath_tree *xm = NULL;
|
||||
|
|
@ -262,9 +265,9 @@ xpath_list_optimize_fn(xpath_tree *xt,
|
|||
if (veclen != 2)
|
||||
goto ok;
|
||||
name = vec[0]->xs_s1;
|
||||
/* Extract variables XXX strdups */
|
||||
/* Extract variables */
|
||||
if ((yc = yang_find(yp, Y_LIST, name)) == NULL)
|
||||
#ifdef NOTYET
|
||||
#ifdef NOTYET /* leaf-list is not detected by xpath optimize detection */
|
||||
if ((yc = yang_find(yp, Y_LEAF_LIST, name)) == NULL) /* XXX */
|
||||
#endif
|
||||
goto ok;
|
||||
|
|
@ -286,14 +289,12 @@ xpath_list_optimize_fn(xpath_tree *xt,
|
|||
i = 0;
|
||||
cvi = NULL;
|
||||
while ((cvi = cvec_each(cvk, cvi)) != NULL) {
|
||||
if (strcmp(cv_name_get(cvi), cv_string_get(cvec_i(cvv,i)))){
|
||||
fprintf(stderr, "%s key name mismatch %s vs %s\n",
|
||||
__FUNCTION__, cv_name_get(cvi), cv_string_get(cvec_i(cvv,i)));
|
||||
if (strcmp(cv_name_get(cvi), cv_string_get(cvec_i(cvv,i))))
|
||||
goto ok;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (xml_binsearch(xv, yc, cvk, xp) < 0)
|
||||
/* Use 2a form since yc allready given to compute cvk */
|
||||
if (clixon_xml_find_index(xv, yp, NULL, name, cvk, xvec, xlen) < 0)
|
||||
goto done;
|
||||
retval = 1; /* match */
|
||||
done:
|
||||
|
|
@ -316,8 +317,9 @@ xpath_list_optimize_fn(xpath_tree *xt,
|
|||
*/
|
||||
int
|
||||
xpath_optimize_check(xpath_tree *xs,
|
||||
cxobj *xv,
|
||||
cxobj **xp)
|
||||
cxobj *xv,
|
||||
cxobj ***xvec,
|
||||
size_t *xlen)
|
||||
|
||||
{
|
||||
#ifdef XPATH_LIST_OPTIMIZE
|
||||
|
|
@ -325,7 +327,7 @@ xpath_optimize_check(xpath_tree *xs,
|
|||
|
||||
if (!_optimize_enable)
|
||||
return 0; /* use regular code */
|
||||
if ((ret = xpath_list_optimize_fn(xs, xv, xp)) < 0)
|
||||
if ((ret = xpath_list_optimize_fn(xs, xv, xvec, xlen)) < 0)
|
||||
return -1;
|
||||
if (ret == 1){
|
||||
_optimize_hits++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue