62 #include <amxc/amxc.h>
63 #include <amxp/amxp_signal.h>
64 #include <amxp/amxp_slot.h>
65 #include <amxp/amxp_expression.h>
81 amxc_htable_it_t* hit = NULL;
82 amxc_var_t* ht_data = NULL;
84 hit = amxc_htable_get(data, name);
86 ht_data = amxc_var_from_htable_it(hit);
87 value = amxc_var_dyncast(cstring_t, ht_data);
94 const amxc_htable_t*
const data,
95 amxc_string_t* str_expr) {
97 const amxc_htable_t* ht_params = NULL;
98 const char* unique_lop =
")";
99 const char* key_lop =
"(";
101 ht_params = amxc_var_constcast(amxc_htable_t, templ_params);
102 amxc_htable_for_each(it, ht_params) {
103 const char* name = amxc_htable_it_get_key(it);
104 amxc_var_t* param = amxc_var_from_htable_it(it);
106 if(!amxc_var_constcast(
bool,
GET_FIELD(param,
"attributes.key"))) {
111 if(amxc_var_constcast(
bool,
GET_FIELD(param,
"attributes.unique"))) {
112 if((unique_lop[0] ==
')') && (key_lop[0] ==
'&')) {
115 amxc_string_prependf(str_expr,
"%s==\"%s\"%s", name, value, unique_lop);
118 if((key_lop[0] ==
'(') && (unique_lop[0] ==
'|')) {
121 amxc_string_appendf(str_expr,
"%s%s==\"%s\"", key_lop, name, value);
127 if(unique_lop[0] ==
'|') {
128 amxc_string_prependf(str_expr,
"(");
130 if(key_lop[0] ==
'&') {
131 amxc_string_appendf(str_expr,
")");
141 const amxc_htable_t*
const data) {
143 amxp_expr_status_t expr_status = amxp_expr_status_ok;
144 amxc_string_t str_expr;
146 amxc_string_init(&str_expr, 64);
148 when_null(templ_params, exit);
149 when_null(expr, exit);
154 !amxc_string_is_empty(&str_expr)) {
155 expr_status = amxp_expr_new(expr, amxc_string_get(&str_expr, 0));
156 when_true_status(expr_status != amxp_expr_status_ok,
162 amxc_string_clean(&str_expr);
170 amxp_expr_status_t
status = amxp_expr_status_unknown_error;
173 const char* op = NULL;
174 const char* param = NULL;
178 status = amxp_expr_status_field_not_found);
189 when_null_status(
object,
191 status = amxp_expr_status_field_not_found);
195 status = amxp_expr_status_ok;
197 status = amxp_expr_status_field_not_found;
207 const amxc_var_t*
const data) {
209 const amxc_htable_t* ht_data = NULL;
212 amxc_var_init(¶ms);
213 when_null(data, exit);
214 when_true(amxc_var_type_of(data) != AMXC_VAR_ID_HTABLE, exit);
218 ht_data = amxc_var_constcast(amxc_htable_t, data);
222 amxc_var_clean(¶ms);
230 when_null(templ, exit);
232 when_null(expr, exit);
249 amxc_llist_it_t* it = NULL;
251 when_null(instance, exit);
253 when_null(expr, exit);
255 it = amxc_llist_it_get_next(&instance->
it);
261 it = amxc_llist_it_get_next(it);
281 const amxc_htable_t* ht_params = NULL;
283 amxc_var_init(¶ms);
285 when_null(instance, exit);
291 ht_params = amxc_var_constcast(amxc_htable_t, ¶ms);
292 amxc_htable_for_each(it, ht_params) {
293 amxc_var_t* param = amxc_var_from_htable_it(it);
294 if(amxc_var_constcast(
bool,
GET_FIELD(param,
"attributes.key"))) {
301 amxc_var_clean(¶ms);
309 when_null(
object, exit);
310 when_null(expr, exit);
#define when_failed_status(x, l, c)
Ambiorix Data Model API header file.
Ambiorix Data Model API header file.
bool amxd_object_matches_expr(amxd_object_t *const object, amxp_expr_t *expr)
bool amxd_object_has_keys(amxd_object_t *const instance)
amxd_status_t amxd_object_new_key_expr(amxd_object_t *const templ, amxp_expr_t **expr, const amxc_var_t *const data)
static amxd_status_t amxd_build_key_expr_string(amxc_var_t *const templ_params, const amxc_htable_t *const data, amxc_string_t *str_expr)
bool amxd_object_has_matching_instances(const amxd_object_t *const templ, amxp_expr_t *expr)
amxd_status_t PRIVATE amxd_object_build_key_expr(amxc_var_t *const templ_params, amxp_expr_t **expr, const amxc_htable_t *const data)
amxp_expr_status_t amxd_object_expr_get_field(UNUSED amxp_expr_t *expr, amxc_var_t *value, const char *path, void *priv)
amxd_object_t * amxd_object_find_next_instance(const amxd_object_t *const instance, amxp_expr_t *expr)
amxd_object_t * amxd_object_find_instance(const amxd_object_t *const templ, amxp_expr_t *expr)
static char * amxd_key_expr_get_value(const amxc_htable_t *const data, const char *name)
amxd_status_t amxd_object_describe_key_params(amxd_object_t *const object, amxc_var_t *const value, amxd_dm_access_t access)
amxd_status_t amxd_object_describe_params(amxd_object_t *const object, amxc_var_t *const value, amxd_dm_access_t access)
Ambiorix path API header file.
#define GET_FIELD(var, field)
enum _amxd_status amxd_status_t
@ amxd_status_missing_key
@ amxd_status_unknown_error
@ amxd_status_invalid_value
#define AMXD_OBJECT_TERMINATE
Path format flag - when set the object path is terminated with a dot.
amxd_object_t * amxd_object_findf(amxd_object_t *object, const char *rel_path,...) __attribute__((format(printf
Find an object in the data model tree, starting from an object.
amxd_status_t amxd_object_get_param(amxd_object_t *const object, const char *name, amxc_var_t *const value)
Gets a single parameter value.
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
#define amxd_object_for_each(type, it, object)
Helper macro for iterating object content.
amxd_status_t amxd_path_init(amxd_path_t *path, const char *object_path)
Initializes an amxd_path_t structure.
const char * amxd_path_get_param(amxd_path_t *path)
Gets the parameter name.
const char * amxd_path_get(amxd_path_t *path, int flags)
Returns the path stored in the amxd_path_t structure.
void amxd_path_clean(amxd_path_t *path)
Cleans an amxd_path_t structure.
static amxd_status_t status