1 /*************************************************************************
3 * Copyright 2021 highstreet technologies GmbH and others
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 ***************************************************************************/
18 #include "populate_internal.h"
19 #include "utils/log_utils.h"
20 #include "utils/rand_utils.h"
21 #include "utils/type_utils.h"
23 #include "core/datastore/schema.h"
24 #include "core/framework.h"
25 #include "core/session.h"
28 #include <libyang/libyang.h>
33 int populate_late_resolve_add_leaf(populate_job_t *job, populate_instance_t *instance, struct lys_node *schema, struct lyd_node *parent_d, struct lyd_node *parent_o, struct lyd_node *parent_r) {
37 job->late_resolve_schema = (struct lys_node **)realloc(job->late_resolve_schema, (job->late_resolve_count + 1) * sizeof(struct lys_node *));
38 if(!job->late_resolve_schema) {
39 log_error("bad realloc\n");
40 return NTS_ERR_FAILED;
42 job->late_resolve_schema[job->late_resolve_count] = schema;
44 job->late_resolve_parent_d = (struct lyd_node **)realloc(job->late_resolve_parent_d, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
45 if(!job->late_resolve_parent_d) {
46 log_error("bad realloc\n");
47 return NTS_ERR_FAILED;
49 job->late_resolve_parent_d[job->late_resolve_count] = parent_d;
51 job->late_resolve_parent_o = (struct lyd_node **)realloc(job->late_resolve_parent_o, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
52 if(!job->late_resolve_parent_o) {
53 log_error("bad realloc\n");
54 return NTS_ERR_FAILED;
56 job->late_resolve_parent_o[job->late_resolve_count] = parent_o;
58 job->late_resolve_parent_r = (struct lyd_node **)realloc(job->late_resolve_parent_r, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
59 if(!job->late_resolve_parent_r) {
60 log_error("bad realloc\n");
61 return NTS_ERR_FAILED;
63 job->late_resolve_parent_r[job->late_resolve_count] = parent_r;
65 job->late_resolve_instance = (populate_instance_t **)realloc(job->late_resolve_instance, (job->late_resolve_count + 1) * sizeof(populate_instance_t *));
66 if(!job->late_resolve_instance) {
67 log_error("bad realloc\n");
68 return NTS_ERR_FAILED;
70 job->late_resolve_instance[job->late_resolve_count] = instance;
72 job->late_resolve_count++;
78 int populate_late_resolve(populate_job_t *job) {
81 job->late_resolving = true;
83 int prev_count = job->late_resolve_count + 1;
85 while(prev_count > job->late_resolve_count) {
86 int late_resolve_count = job->late_resolve_count;
87 struct lys_node **late_resolve_schema = job->late_resolve_schema;
88 struct lyd_node **late_resolve_parent_d = job->late_resolve_parent_d;
89 struct lyd_node **late_resolve_parent_o = job->late_resolve_parent_o;
90 struct lyd_node **late_resolve_parent_r = job->late_resolve_parent_r;
91 populate_instance_t **late_resolve_instance = job->late_resolve_instance;
93 job->late_resolve_count = 0;
94 job->late_resolve_schema = 0;
95 job->late_resolve_parent_d = 0;
96 job->late_resolve_parent_o = 0;
97 job->late_resolve_parent_r = 0;
98 job->late_resolve_instance = 0;
100 prev_count = late_resolve_count;
102 for(int i = 0; i < late_resolve_count; i++) {
103 log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"late-populating "LOG_COLOR_RESET": ");
104 int rc = populate_add_leaf(job, late_resolve_instance[i], late_resolve_schema[i], late_resolve_parent_d[i], late_resolve_parent_o[i], late_resolve_parent_r[i]);
105 if(rc != NTS_ERR_OK) {
106 log_error("populate_add_leaf failed on late-resolve\n");
111 free(late_resolve_schema);
112 free(late_resolve_parent_d);
113 free(late_resolve_parent_o);
114 free(late_resolve_parent_r);
115 free(late_resolve_instance);
117 job->late_resolving = false;
119 if(prev_count != 0) {
120 log_error("populate_late_resolve detected circular loop!\n");