libamxd  6.4.1
Data Model Manager
amxd_transaction.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 
55 #if !defined(__AMXD_TRANSACTION_H__)
56 #define __AMXD_TRANSACTION_H__
57 
58 #ifdef __cplusplus
59 extern "C"
60 {
61 #endif
62 
63 #include <amxd/amxd_types.h>
64 
102 typedef enum _amxd_tattr_id {
108 
109 typedef struct _amxd_trans_attr {
110  uint32_t read_only : 1; // can change read-only parameters
112 
113 typedef struct _amxd_trans_action {
114  amxc_llist_it_t it;
116  amxc_var_t data;
118 
119 typedef struct _amxd_transaction {
120  amxc_llist_t actions; // list of actions to do when transaction is applied
121  amxc_llist_t validate; // objects or object trees that needs validation
122  amxc_llist_t garbage; // list of objects that need to be destroyed when transaction is done
123  amxd_object_t* current; // current selected object
124  amxd_trans_attr_t attr; // transaction attributes
125  amxd_dm_access_t access; // transaction access
126  amxc_var_t retvals; // list of return values of actions
127  amxd_status_t status; // transaction status code
128  int fail_index; // index of failed action
130 
144 #define amxd_trans_set_value(type, trans, name, value) \
145  amxd_trans_set_ ## type(trans, name, value)
146 
165 
178 void amxd_trans_clean(amxd_trans_t* const trans);
179 
197 
212 void amxd_trans_delete(amxd_trans_t** trans);
213 
250  amxd_tattr_id_t attr,
251  bool enable);
252 
278  const amxd_action_t reason,
279  const amxc_var_t* data);
280 
306  const char* path,
307  ...) __attribute__ ((format(printf, 2, 3)));
308 
325  const amxd_object_t* const object);
326 
346  const char* param_name,
347  amxc_var_t* const value);
348 
372  const uint32_t index,
373  const char* name);
374 
405  const uint32_t index,
406  const char* name);
407 
409  const char* mib_name);
410 
434  amxd_dm_t* const dm);
435 
450 void amxd_trans_dump(const amxd_trans_t* const trans,
451  const int fd,
452  const bool reverse);
453 
454 // helper functions
455 static inline
457  const char* name,
458  const char* value) {
460  amxc_var_t new_value;
461 
462  amxc_var_init(&new_value);
463  amxc_var_set(cstring_t, &new_value, value);
464  status = amxd_trans_set_param(trans, name, &new_value);
465 
466  amxc_var_clean(&new_value);
467  return status;
468 }
469 
470 static inline
472  const char* name,
473  const char* value) {
475  amxc_var_t new_value;
476 
477  amxc_var_init(&new_value);
478  amxc_var_set(csv_string_t, &new_value, value);
479  status = amxd_trans_set_param(trans, name, &new_value);
480 
481  amxc_var_clean(&new_value);
482  return status;
483 }
484 
485 static inline
487  const char* name,
488  const char* value) {
490  amxc_var_t new_value;
491 
492  amxc_var_init(&new_value);
493  amxc_var_set(ssv_string_t, &new_value, value);
494  status = amxd_trans_set_param(trans, name, &new_value);
495 
496  amxc_var_clean(&new_value);
497  return status;
498 }
499 
500 static inline
502  const char* name,
503  bool value) {
505  amxc_var_t new_value;
506 
507  amxc_var_init(&new_value);
508  amxc_var_set(bool, &new_value, value);
509  status = amxd_trans_set_param(trans, name, &new_value);
510 
511  amxc_var_clean(&new_value);
512  return status;
513 }
514 
515 static inline
517  const char* name,
518  int8_t value) {
520  amxc_var_t new_value;
521 
522  amxc_var_init(&new_value);
523  amxc_var_set(int8_t, &new_value, value);
524  status = amxd_trans_set_param(trans, name, &new_value);
525 
526  amxc_var_clean(&new_value);
527  return status;
528 }
529 
530 static inline
532  const char* name,
533  uint8_t value) {
535  amxc_var_t new_value;
536 
537  amxc_var_init(&new_value);
538  amxc_var_set(uint8_t, &new_value, value);
539  status = amxd_trans_set_param(trans, name, &new_value);
540 
541  amxc_var_clean(&new_value);
542  return status;
543 }
544 
545 static inline
547  const char* name,
548  int16_t value) {
550  amxc_var_t new_value;
551 
552  amxc_var_init(&new_value);
553  amxc_var_set(int16_t, &new_value, value);
554  status = amxd_trans_set_param(trans, name, &new_value);
555 
556  amxc_var_clean(&new_value);
557  return status;
558 }
559 
560 static inline
562  const char* name,
563  uint16_t value) {
565  amxc_var_t new_value;
566 
567  amxc_var_init(&new_value);
568  amxc_var_set(uint16_t, &new_value, value);
569  status = amxd_trans_set_param(trans, name, &new_value);
570 
571  amxc_var_clean(&new_value);
572  return status;
573 }
574 
575 static inline
577  const char* name,
578  int32_t value) {
580  amxc_var_t new_value;
581 
582  amxc_var_init(&new_value);
583  amxc_var_set(int32_t, &new_value, value);
584  status = amxd_trans_set_param(trans, name, &new_value);
585 
586  amxc_var_clean(&new_value);
587  return status;
588 }
589 
590 static inline
592  const char* name,
593  uint32_t value) {
595  amxc_var_t new_value;
596 
597  amxc_var_init(&new_value);
598  amxc_var_set(uint32_t, &new_value, value);
599  status = amxd_trans_set_param(trans, name, &new_value);
600 
601  amxc_var_clean(&new_value);
602  return status;
603 }
604 
605 static inline
607  const char* name,
608  int64_t value) {
610  amxc_var_t new_value;
611 
612  amxc_var_init(&new_value);
613  amxc_var_set(int64_t, &new_value, value);
614  status = amxd_trans_set_param(trans, name, &new_value);
615 
616  amxc_var_clean(&new_value);
617  return status;
618 }
619 
620 static inline
622  const char* name,
623  uint64_t value) {
625  amxc_var_t new_value;
626 
627  amxc_var_init(&new_value);
628  amxc_var_set(uint64_t, &new_value, value);
629  status = amxd_trans_set_param(trans, name, &new_value);
630 
631  amxc_var_clean(&new_value);
632  return status;
633 }
634 
635 static inline
637  const char* name,
638  double value) {
640  amxc_var_t new_value;
641 
642  amxc_var_init(&new_value);
643  amxc_var_set(double, &new_value, value);
644  status = amxd_trans_set_param(trans, name, &new_value);
645 
646  amxc_var_clean(&new_value);
647  return status;
648 }
649 
650 static inline
652  const char* name,
653  amxc_ts_t* value) {
655  amxc_var_t new_value;
656 
657  amxc_var_init(&new_value);
658  amxc_var_set(amxc_ts_t, &new_value, value);
659  status = amxd_trans_set_param(trans, name, &new_value);
660 
661  amxc_var_clean(&new_value);
662  return status;
663 }
664 
665 #ifdef __cplusplus
666 }
667 #endif
668 
669 #endif // __AMXD_TRANSACTION_H__
670 
671 
struct _amxd_transaction amxd_trans_t
static amxd_status_t amxd_trans_set_int16_t(amxd_trans_t *const trans, const char *name, int16_t value)
static amxd_status_t amxd_trans_set_double(amxd_trans_t *const trans, const char *name, double value)
struct _amxd_trans_action amxd_trans_action_t
static amxd_status_t amxd_trans_set_uint32_t(amxd_trans_t *const trans, const char *name, uint32_t value)
static amxd_status_t amxd_trans_set_uint64_t(amxd_trans_t *const trans, const char *name, uint64_t value)
struct _amxd_trans_attr amxd_trans_attr_t
static amxd_status_t amxd_trans_set_int32_t(amxd_trans_t *const trans, const char *name, int32_t value)
static amxd_status_t amxd_trans_set_cstring_t(amxd_trans_t *const trans, const char *name, const char *value)
static amxd_status_t amxd_trans_set_amxc_ts_t(amxd_trans_t *const trans, const char *name, amxc_ts_t *value)
static amxd_status_t amxd_trans_set_uint8_t(amxd_trans_t *const trans, const char *name, uint8_t value)
amxd_status_t amxd_trans_add_mib(amxd_trans_t *const trans, const char *mib_name)
static amxd_status_t amxd_trans_set_bool(amxd_trans_t *const trans, const char *name, bool value)
static amxd_status_t amxd_trans_set_int8_t(amxd_trans_t *const trans, const char *name, int8_t value)
static amxd_status_t amxd_trans_set_int64_t(amxd_trans_t *const trans, const char *name, int64_t value)
static amxd_status_t amxd_trans_set_csv_string_t(amxd_trans_t *const trans, const char *name, const char *value)
static amxd_status_t amxd_trans_set_uint16_t(amxd_trans_t *const trans, const char *name, uint16_t value)
static amxd_status_t amxd_trans_set_ssv_string_t(amxd_trans_t *const trans, const char *name, const char *value)
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_unknown_error
Definition: amxd_types.h:79
enum _amxd_dm_access amxd_dm_access_t
Access level.
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.
_amxd_tattr_id
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_pathf(amxd_trans_t *const trans, const char *path,...) __attribute__((format(printf
Selects an object using a absolute or relative path.
amxd_status_t amxd_status_t amxd_trans_select_object(amxd_trans_t *trans, const amxd_object_t *const object)
Selects an object using an object pointer.
amxd_status_t amxd_trans_set_param(amxd_trans_t *const 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.
@ amxd_tattr_change_prot
@ amxd_tattr_change_ro
@ amxd_tattr_change_priv
@ amxd_tattr_change_pub
amxc_llist_it_t it
amxd_action_t action
amxd_object_t * current
amxc_llist_t validate
amxd_dm_access_t access
amxc_llist_t actions
amxc_llist_t garbage
amxd_status_t status
amxd_trans_attr_t attr
static amxd_dm_t dm
static amxd_status_t status