76 amxc_var_clean(&(*trans)->data);
95 amxc_var_t* var_index = amxc_var_get_key(args,
"index", AMXC_VAR_FLAG_DEFAULT);
96 amxc_var_t* var_name = amxc_var_get_key(args,
"name", AMXC_VAR_FLAG_DEFAULT);
98 uint32_t index = amxc_var_dyncast(uint32_t, var_index);
99 char* name = amxc_var_dyncast(cstring_t, var_name);
109 when_null(action, exit);
112 amxc_var_init(&action->
data);
113 amxc_var_set_type(&action->
data, AMXC_VAR_ID_HTABLE);
114 amxc_llist_append(&trans->
actions, &action->
it);
122 amxc_llist_for_each_reverse(it, (&trans->
actions)) {
141 amxc_var_t* var_path = amxc_var_get_key(data,
"path", AMXC_VAR_FLAG_DEFAULT);
142 const char* path = amxc_var_constcast(cstring_t, var_path);
144 if((path == NULL) || (*path == 0)) {
161 amxc_var_t* temp = NULL;
163 const char* name = NULL;
165 temp = amxc_var_get_key(data,
"index", AMXC_VAR_FLAG_DEFAULT);
166 index = amxc_var_dyncast(uint32_t, temp);
167 temp = amxc_var_get_key(data,
"name", AMXC_VAR_FLAG_DEFAULT);
168 name = amxc_var_constcast(cstring_t, temp);
170 if(rollback != NULL) {
179 amxc_var_t* revert_params) {
183 const char* path =
"";
185 amxc_string_init(&p, 0);
187 amxc_var_init(&temp);
192 if((strlen(path) <= 1) && (path[0] ==
'.')) {
199 amxc_var_set_type(&temp, AMXC_VAR_ID_HTABLE);
202 "attributes.volatile==false",
204 amxc_var_for_each(t, &temp) {
209 if(GET_ARG(revert_params, amxc_string_get(&p, 0)) != NULL) {
212 amxc_var_set_key(revert_params,
213 amxc_string_get(&p, 0),
215 AMXC_VAR_FLAG_DEFAULT | AMXC_VAR_FLAG_UPDATE);
217 amxc_string_clean(&p);
219 amxc_var_clean(&temp);
225 const char* param_fields[] = {
"parameters",
"oparameters", NULL };
227 amxc_var_t* revert_params = NULL;
228 amxc_var_t* params = NULL;
230 amxc_var_add_key(
bool, &action->
data,
"set_read_only",
true);
232 revert_params = amxc_var_add_key(amxc_htable_t, &action->
data,
"parameters", NULL);
233 while(param_fields[index] != NULL) {
234 params = GET_ARG(data, param_fields[index]);
235 amxc_var_for_each(param, params) {
237 if(GET_ARG(revert_params, amxc_var_key(param)) != NULL) {
241 if(param_def == NULL) {
246 amxc_var_set_key(revert_params, amxc_var_key(param), ¶m_def->
value, AMXC_VAR_FLAG_COPY);
256 amxc_string_t* path = (amxc_string_t*) calloc(1,
sizeof(amxc_string_t));
260 amxc_string_init(path, 0);
261 amxc_string_push_buffer(path, object_path, strlen(object_path) + 1);
262 amxc_llist_append(&trans->
garbage, &path->it);
273 size_t path_len = strlen(object_path);
275 amxc_llist_for_each(it, (&trans->
validate)) {
277 val_info = amxc_llist_it_get_data(it,
validate_t, it);
278 length = strlen(val_info->
path);
279 if(length <= path_len) {
280 if((length == path_len) &&
281 ( strcmp(object_path, val_info->
path) == 0) &&
289 if(val_info != NULL) {
290 amxc_var_t* event_params = GET_ARG(val_info->
event_data,
"parameters");
291 amxc_var_for_each(var, GET_ARG(data,
"parameters")) {
292 amxc_var_set_key(event_params, amxc_var_key(var), var, AMXC_VAR_FLAG_DEFAULT);
297 when_null(val_info, exit);
298 val_info->
path = object_path;
299 val_info->
reason = reason;
301 amxc_llist_append(&trans->
validate, &val_info->
it);
312 if(rollback != NULL) {
313 amxc_llist_it_t* it = NULL;
316 it = amxc_llist_get_last(&rollback->
actions);
326 amxc_var_t* retval) {
332 when_null_status(trans->
current,
335 if(rollback != NULL) {
355 amxc_var_t* retval = amxc_var_add_new(&trans->
retvals);
358 if((trans->
current != NULL) && (rollback != NULL)) {
362 when_null_status(trans->
current,
381 when_failed(
status, exit);
391 amxc_llist_for_each_reverse(it, (&trans->
garbage)) {
392 amxc_string_t* path = amxc_string_from_llist_it(it);
398 amxc_llist_clean(&trans->
garbage, amxc_string_list_it_free);
402 amxc_llist_for_each_reverse(it, (&trans->
actions)) {
415 amxc_var_init(&objects);
416 amxc_var_set_type(&objects, AMXC_VAR_ID_HTABLE);
420 amxc_var_for_each(param, params) {
421 amxc_var_t* obj_params = NULL;
422 const char* rel_obj_path = NULL;
426 obj_params = GET_ARG(&objects, rel_obj_path);
428 if(obj_params == NULL) {
429 obj_params = amxc_var_add_key(amxc_htable_t, &objects, rel_obj_path, NULL);
435 amxc_var_for_each(object_params, &objects) {
441 amxc_var_clean(&objects);
448 amxc_llist_for_each(it, (&trans->
validate)) {
461 amxc_llist_for_each(it, (&trans->
validate)) {
469 amxc_var_t* params = GET_ARG(val->
event_data,
"parameters");
486 when_true(write(fd,
"SELECT - \n", 10) == -1, exit);
489 when_true(write(fd,
"SET - \n", 7) == -1, exit);
492 when_true(write(fd,
"ADD - \n", 7) == -1, exit);
495 when_true(write(fd,
"DEL - \n", 7) == -1, exit);
500 amxc_var_dump(&action->
data, fd);
501 when_true(write(fd,
"\n", 1) == -1, exit);
509 when_null(trans, exit);
511 amxc_llist_init(&trans->
actions);
512 amxc_llist_init(&trans->
garbage);
514 amxc_var_init(&trans->
retvals);
515 amxc_var_set_type(&trans->
retvals, AMXC_VAR_ID_LIST);
530 when_null(trans, exit);
533 amxc_llist_clean(&trans->
garbage, amxc_string_list_it_free);
535 amxc_var_clean(&trans->
retvals);
546 when_null(trans, exit);
549 when_null((*trans), exit);
558 when_null(trans, exit);
559 when_null((*trans), exit);
574 when_null(trans, exit);
599 const amxc_var_t* data) {
603 when_null(trans, exit);
612 when_null(action, exit);
613 amxc_var_copy(&action->
data, data);
627 amxc_string_t full_path;
632 amxc_string_init(&full_path, 64);
634 when_null(trans, exit);
635 when_null(path, exit);
637 va_start(args, path);
638 amxc_string_vsetf(&full_path, path, args);
641 amxc_string_trim(&full_path, NULL);
642 when_str_empty(amxc_string_get(&full_path, 0), exit);
643 length = amxc_string_text_length(&full_path);
644 if(amxc_string_get(&full_path, 0)[length - 1] !=
'.') {
645 amxc_string_append(&full_path,
".", 1);
649 when_null(action, exit);
650 when_null(amxc_var_add_key(cstring_t,
653 amxc_string_get(&full_path, 0)),
662 amxc_string_clean(&full_path);
669 char* full_path = NULL;
672 when_null(trans, exit);
676 when_null(action, exit);
677 when_null(amxc_var_add_key(cstring_t,
683 when_null(
object, exit);
696 const char* param_name,
697 amxc_var_t*
const value) {
700 amxc_var_t* params = NULL;
702 when_null(trans, exit);
703 when_str_empty(param_name, exit);
704 when_null(value, exit);
709 when_null(action, exit);
710 when_null(amxc_var_add_key(
bool, &action->
data,
"set_read_only",
713 when_null(amxc_var_add_key(uint32_t, &action->
data,
"access", trans->
access),
717 params = amxc_var_get_key(&action->
data,
"parameters",
718 AMXC_VAR_FLAG_DEFAULT);
720 params = amxc_var_add_key(amxc_htable_t, (&action->
data),
"parameters",
722 when_null(params, exit);
725 when_failed(amxc_var_set_key(params, param_name, value,
726 AMXC_VAR_FLAG_UPDATE | AMXC_VAR_FLAG_COPY),
739 const uint32_t index,
744 when_null(trans, exit);
747 when_null(action, exit);
749 when_null(amxc_var_add_key(
bool,
754 when_null(amxc_var_add_key(uint32_t,
759 when_null(amxc_var_add_key(uint32_t, &action->
data,
"index", index),
761 when_null(amxc_var_add_key(cstring_t,
764 name == NULL ?
"" : name),
777 const uint32_t index,
782 when_null(trans, exit);
785 when_null(action, exit);
786 when_true((index == 0 && (name == NULL || *name == 0)), exit);
788 when_null(amxc_var_add_key(
bool,
793 when_null(amxc_var_add_key(uint32_t,
798 when_null(amxc_var_add_key(uint32_t, &action->
data,
"index", index),
800 when_null(amxc_var_add_key(cstring_t,
803 name == NULL ?
"" : name),
816 const char* mib_name) {
820 when_null(trans, exit);
823 when_null(action, exit);
824 when_str_empty(mib_name, exit);
826 when_null(amxc_var_add_key(cstring_t,
843 static bool trans_buzy =
false;
848 when_true(trans_buzy, exit);
849 when_null(trans, exit);
854 amxc_var_clean(&trans->
retvals);
855 amxc_var_set_type(&trans->
retvals, AMXC_VAR_ID_LIST);
856 amxc_llist_for_each(it, (&trans->
actions)) {
860 when_failed(
status, exit);
871 amxc_llist_clean(&trans->
garbage, amxc_string_list_it_free);
884 const bool reverse) {
886 amxc_llist_for_each_reverse(it, (&trans->
actions)) {
892 amxc_llist_for_each(it, (&trans->
actions)) {
#define when_failed_status(x, l, c)
Ambiorix Data Model API header file.
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...) __attribute__((format(printf
amxd_status_t amxd_dm_invoke_action(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval)
Ambiorix Data Model API header file.
amxd_status_t amxd_object_validate(amxd_object_t *const object, int32_t depth)
Ambiorix Data Model API header file.
amxd_status_t amxd_object_get_params_filtered(amxd_object_t *const object, amxc_var_t *const params, const char *filter, amxd_dm_access_t access)
bool amxd_param_is_attr_set(const amxd_param_t *const param, const amxd_pattr_id_t attr)
Ambiorix path API header file.
static void amxd_trans_add_validate(amxd_trans_t *trans, amxd_object_t *object, amxd_action_t reason, amxc_var_t *data)
static void amxd_trans_action_start(amxd_trans_t *trans, amxd_trans_action_t *action, amxd_trans_t *rollback)
static void amxd_trans_free_action_it(amxc_llist_it_t *it)
amxd_status_t amxd_trans_select_pathf(amxd_trans_t *const trans, const char *path,...)
static void amxd_trans_emit_changed(UNUSED amxd_object_t *object, amxc_var_t *params)
static void amxd_trans_collect_garbage(amxd_trans_t *trans, amxd_dm_t *dm)
static amxd_status_t amxd_trans_validate_objects(amxd_trans_t *trans, amxd_dm_t *dm)
static void amxd_trans_delete_action(amxd_trans_action_t **trans)
amxd_status_t amxd_trans_add_mib(amxd_trans_t *const trans, const char *mib_name)
static void amxd_trans_revert(amxd_trans_t *trans, amxd_dm_t *dm)
static amxd_object_t * amxd_trans_select_instance(amxd_object_t *object, amxd_trans_t *rollback, amxc_var_t *data)
struct _validate validate_t
static void amxd_trans_add_garbage(amxd_trans_t *trans, amxc_var_t *data)
static amxd_trans_action_t * amxd_trans_new_action(amxd_trans_t *trans, amxd_action_t reason)
static void amxd_trans_revert_write(amxd_object_t *object, amxd_trans_t *rollback, amxc_var_t *data)
static amxd_trans_action_t * amxd_trans_find_write_action(amxd_trans_t *trans)
static amxd_status_t amxd_trans_invoke_action(amxd_trans_t *trans, amxd_dm_t *dm, amxd_trans_action_t *action, amxd_trans_t *rollback)
static amxd_object_t * amxd_trans_select(amxd_dm_t *dm, amxd_object_t *object, amxc_var_t *data)
static void amxd_trans_store_all_params(amxd_object_t *object, const char *param, amxc_var_t *revert_params)
static amxd_status_t amxd_trans_action_end(amxd_trans_t *trans, amxd_trans_action_t *action, amxd_trans_t *rollback, amxc_var_t *retval)
static void amxd_trans_free_validate_it(amxc_llist_it_t *it)
static amxd_object_t * amxd_get_instance_from_args(amxd_object_t *templ, amxc_var_t *args)
static void amxd_trans_dump_action(amxd_trans_action_t *action, int fd)
Ambiorix Data Model API header file.
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_object_not_found
@ amxd_status_unknown_error
@ amxd_status_invalid_action
#define AMXD_OBJECT_INDEXED
Name and path format flag - use index for instance objects.
#define AMXD_OBJECT_TERMINATE
Path format flag - when set the object path is terminated with a dot.
@ amxd_dm_access_protected
AMXD_INLINE void amxd_object_emit_add_inst(amxd_object_t *instance)
Emit an add instance object event.
AMXD_INLINE void amxd_object_emit_changed(amxd_object_t *object, amxc_var_t *params)
Emit an object changed event.
AMXD_INLINE void amxd_object_emit_del_inst(amxd_object_t *instance)
Emit a delete instance object event.
amxd_object_t amxd_status_t amxd_status_t char * amxd_object_get_path(const amxd_object_t *object, const uint32_t flags)
Get the full path of the object.
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_object_t * amxd_object_get_instance(const amxd_object_t *object, const char *name, uint32_t index)
Get an instance of the template object.
bool amxd_object_has_mib(amxd_object_t *object, const char *mib_name)
Checks if a mib has been added to a data model object.
amxd_status_t amxd_object_add_mib(amxd_object_t *const object, const char *mib_name)
Adds a mib to an object.
amxd_param_t * amxd_object_get_param_def(const amxd_object_t *const object, const char *name)
Gets a parameter definition from an object.
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.
amxd_status_t amxd_path_setf(amxd_path_t *path, bool add_dot, const char *obj_path,...) __attribute__((format(printf
Sets or replaces the path contained in the amxd_path_t structure.
amxd_status_t amxd_trans_new(amxd_trans_t **trans)
Allocates a transaction object on the heap and initializes it.
amxd_status_t amxd_trans_add_action(amxd_trans_t *const trans, const amxd_action_t reason, const amxc_var_t *data)
Adds an action to a transaction.
void amxd_trans_dump(const amxd_trans_t *const trans, const int fd, const bool reverse)
Dumps the transaction to a file descriptor.
amxd_status_t amxd_trans_set_attr(amxd_trans_t *trans, amxd_tattr_id_t attr, bool enable)
Set the transaction attributes.
void amxd_trans_clean(amxd_trans_t *const trans)
Cleans the transaction object.
amxd_status_t amxd_trans_apply(amxd_trans_t *const trans, amxd_dm_t *const dm)
Applies all previously added actions.
amxd_status_t amxd_trans_add_inst(amxd_trans_t *const trans, const uint32_t index, const char *name)
Adds an instance add action to a transaction.
void amxd_trans_delete(amxd_trans_t **trans)
Frees the memory previously allocated for a transaction object.
amxd_status_t amxd_trans_del_inst(amxd_trans_t *const trans, const uint32_t index, const char *name)
Adds an instance delete action to a transaction.
amxd_status_t amxd_trans_select_object(amxd_trans_t *const trans, const amxd_object_t *const object)
Selects an object using an object pointer.
amxd_status_t amxd_trans_set_param(amxd_trans_t *trans, const char *param_name, amxc_var_t *const value)
Adds a set value action to a transaction.
enum _amxd_tattr_id amxd_tattr_id_t
Transaction attributes.
amxd_status_t amxd_trans_init(amxd_trans_t *const trans)
Initializes a transaction object.
static amxd_status_t status