]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - fres/contract/fres_transaction.c
134eeeb1b14f986aee314f81cdf3577041388f23
[frescor/frsh.git] / fres / contract / fres_transaction.c
1 /**
2  * @file   fres_transaction.c
3  * @author Michal Sojka <sojkam1@fel.cvut.cz>
4  * @date   Mon Jun 21 16:34:00 2010
5  * 
6  * @brief  Distributed transaction manipulation
7  */
8
9 #include <fres_transaction.h>
10
11 /** 
12  * Allocates new transaction.
13  * 
14  * @return Pointer to the newly allocated transaction or NULL in case
15  * of error.
16  */
17 fres_transaction_t*
18 fres_transaction_new()
19 {
20         fres_transaction_t *t;
21
22         t = malloc(sizeof(*t));
23         if (!t)
24                 goto err;
25         memset(t, 0, sizeof(*t));
26         CORBA_sequence_set_release(&t->contracts, CORBA_TRUE);
27         return t;
28 err:
29         return NULL;
30 }
31
32 void
33 fres_transaction_destroy(fres_transaction_t *t)
34 {
35         if (t) {
36                 forb_sequence_free_buf(&t->contracts, fres_contract_ptr_destroy);
37                 free(t->name);
38                 free(t);
39         }
40 }
41
42 fres_transaction_t *
43 fres_transaction_duplicate(fres_transaction_t *src)
44 {
45         fres_transaction_t *dst;
46         int i;
47
48         if (!src)
49                 goto err;
50         dst = malloc(sizeof(*dst));
51         /* Copy all static mambers */
52         memcpy(dst, src, sizeof(*dst));
53         /* And now the dynamic ones */
54         if (src->name)
55                 dst->name = strdup(src->name);
56         forb_sequence_alloc_buf(&dst->contracts,
57                                 fres_transaction_num_contracts(src));
58         for (i = 0; i < fres_transaction_num_contracts(src); i++) {
59                 struct fres_contract *c;
60                 c = fres_transaction_get_contract(src, i);
61                 fres_transaction_add_contract(dst, fres_contract_duplicate(c));
62         }
63         return dst;
64 err:
65         return NULL;
66 }
67
68 int
69 fres_transaction_add_contract(fres_transaction_t *t,
70                               struct fres_contract *c)
71 {
72         void *ptr;
73         unsigned num = forb_sequence_length(&t->contracts);
74         ptr = forb_sequence_ensure_allocated(&t->contracts, num+1);
75         if (!ptr)
76                 goto err;
77         forb_sequence_elem(&t->contracts, num) = c;
78         forb_sequence_length(&t->contracts)++;
79         return forb_sequence_length(&t->contracts);
80 err:
81         return -1;
82 }