modules/ud/ud_misc.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- attribute_free
- attribute_upd
- attribute_new1
- attribute_new
- object_free
- object_new
- transaction_free
- transaction_new
1 /***************************************
2 $Revision: 1.11 $
3
4 Miscellaneous functions to support UD
5
6 Status: NOT REVUED, NOT TESTED
7
8 Author(s): Chris Ottrey, Andrei Robachevsky
9
10 ******************/ /******************
11 Modification History:
12 andrei (17/01/2000) Created.
13 ******************/ /******************
14 Copyright (c) 2000 RIPE NCC
15
16 All Rights Reserved
17
18 Permission to use, copy, modify, and distribute this software and its
19 documentation for any purpose and without fee is hereby granted,
20 provided that the above copyright notice appear in all copies and that
21 both that copyright notice and this permission notice appear in
22 supporting documentation, and that the name of the author not be
23 used in advertising or publicity pertaining to distribution of the
24 software without specific, written prior permission.
25
26 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
27 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
28 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
29 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
30 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 ***************************************/
33 #include "ud.h"
34 #include "ud_int.h"
35 /************************************************************
36 * void attribute_free() *
37 * *
38 * Frees memory allocated for an attribute *
39 * *
40 ************************************************************/
41 void attribute_free(void *data, void *ptr)
/* [<][>][^][v][top][bottom][index][help] */
42 {
43 Attribute_t *attr = data;
44
45 free(attr->value);
46 free(attr);
47 }
48
49 /************************************************************
50 * Attribute_t *attribute_upd() *
51 * *
52 * Changes the value of an attribute *
53 * *
54 ************************************************************/
55 Attribute_t *attribute_upd(Attribute_t *attr, int newtype, char *newvalue)
/* [<][>][^][v][top][bottom][index][help] */
56 {
57 attr->type=newtype;
58 free(attr->value);
59 attr->value=g_strdup(newvalue);
60 return(attr);
61 }
62
63 /************************************************************
64 * Attribute_t *attribute_new1() *
65 * *
66 * Creates an attribute and fills the type and value *
67 * *
68 ************************************************************/
69 Attribute_t *attribute_new1(int type, const char *value)
/* [<][>][^][v][top][bottom][index][help] */
70 {
71 char *n;
72 Attribute_t *attr = NULL;
73
74 attr = (Attribute_t *)calloc(1, sizeof(Attribute_t)+1);
75 attr->type = type;
76
77 /* check for end-of-line comments */
78 n = index(value, '#');
79 /* if there is no comment check for trailing \n */
80 if(n == NULL) n = index(value, '\n');
81 /* now copy the clean value into the attribute */
82 if(n == NULL) attr->value = g_strdup(value);
83 else attr->value = g_strndup(value, (n - value));
84 /* Strip the whitespace */
85 g_strstrip(attr->value);
86 return(attr);
87
88 }
89 /************************************************************
90 * Attribute_t *attribute_new() *
91 * *
92 * Determines the type and value of an attribute and *
93 * creates it by calling attribute_new1() *
94 * *
95 ************************************************************/
96 Attribute_t *attribute_new(const char *line) {
/* [<][>][^][v][top][bottom][index][help] */
97 Attribute_t *attr = NULL;
98 int type;
99 char *colon;
100 gchar *token;
101
102
103 colon = index(line, ':');
104 if (colon != NULL) {
105 if (line[0] =='*') {
106 token = g_strndup(line+1, 2);
107 type = DF_attribute_code2type(token);
108 }
109 else {
110 token = g_strndup(line, (colon - line));
111 type = DF_attribute_name2type(token);
112 }
113 if(token)free(token);
114
115 colon+=2;
116 if (type >= 0) {
117 attr=attribute_new1(type, colon);
118 }
119 }
120 return attr;
121 } /* attribute_new() */
122
123 /************************************************************
124 * void object_free() *
125 * *
126 * Frees memory allocated for an object *
127 * *
128 ************************************************************/
129 void object_free(Object_t *obj) {
/* [<][>][^][v][top][bottom][index][help] */
130 if (obj) {
131 g_slist_foreach(obj->attributes, attribute_free, NULL);
132 g_slist_free(obj->attributes);
133 g_string_free(obj->object, TRUE);
134 free(obj);
135 }
136 } /* object_free() */
137
138 /************************************************************
139 * Object_t *object_new() *
140 * *
141 * Determines the class type and creates an object *
142 * *
143 ************************************************************/
144 Object_t *object_new(const char *line) {
/* [<][>][^][v][top][bottom][index][help] */
145 Object_t *obj = NULL;
146
147 int type;
148 char *colon;
149 gchar *token=NULL;
150
151 colon = index(line, ':');
152 if (colon != NULL) {
153 if (line[0] =='*') {
154 token = g_strndup(line+1, 2);
155 type = DF_class_code2type(token);
156 }
157 else {
158 token = g_strndup(line, (colon - line));
159 type = DF_class_name2type(token);
160 }
161 if(token)free(token);
162
163 if (type >= 0) {
164 obj = (Object_t *)calloc(1, sizeof(Object_t)+1);
165 obj->attributes = NULL;
166 obj->object = g_string_sized_new(STR_XXXL);
167 obj->type = type;
168 }
169 }
170 return obj;
171 } /* object_new() */
172
173
174 /************************************************************
175 * void transaction_free() *
176 * *
177 * Frees memory allocated for a transaction *
178 * *
179 ************************************************************/
180
181 void transaction_free(Transaction_t *tr) {
/* [<][>][^][v][top][bottom][index][help] */
182 if(tr) {
183 g_string_free(tr->error_script, TRUE);
184 /* free nic_handle_t structure used for NHR stuff */
185 if(tr->nh)free_nh(tr->nh);
186 if(tr->save)free(tr->save);
187 if(tr->packptr)free(tr->packptr);
188 free(tr);
189 }
190 } /* transaction_free() */
191
192 /************************************************************
193 * Transaction_t *transaction_new() *
194 * *
195 * Creates a transaction *
196 * *
197 ************************************************************/
198 Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) {
/* [<][>][^][v][top][bottom][index][help] */
199 Transaction_t *tr = (Transaction_t *)calloc(1, sizeof(Transaction_t));
200
201 if (tr != NULL) {
202 tr->sql_connection = sql_connection;
203 tr->class_type = class_type;
204 tr->thread_upd=TR_UPDATE;
205 tr->thread_ins=TR_INSERT;
206 tr->object_id = 0; /* Just in case*/
207 tr->succeeded = 1;
208 tr->error=0;
209 tr->error_script = g_string_sized_new(STR_XL);
210 tr->dummy = 0; /* By default do not create dummies except for sets*/
211 tr->ndummy=0;
212 tr->action=100;
213 tr->load_pass=0; /* by default*/
214 tr->sequence_id=1; /* we start from 1*/
215 tr->save=NULL;
216 tr->nh=NULL;
217 tr->packptr=calloc(1, sizeof(rp_upd_pack_t));
218
219 }
220 return tr;
221 } /* transaction_new() */