1 | /*************************************** 2 | $Revision: 1.8 $ 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(void *data, void *ptr) 37 | { 38 | Attribute_t *attr = data; 39 | 40 | free(attr->value); 41 | free(attr); 42 | } 43 | 44 | 45 | Attribute_t *attribute_upd(Attribute_t *attr, int newtype, char *newvalue) 46 | { 47 | attr->type=newtype; 48 | free(attr->value); 49 | attr->value=g_strdup(newvalue); 50 | return(attr); 51 | } 52 | 53 | Attribute_t *attribute_new1(int type, const char *value) 54 | { 55 | char *n; 56 | Attribute_t *attr = NULL; 57 | 58 | attr = (Attribute_t *)calloc(1, sizeof(Attribute_t)+1); 59 | attr->type = type; 60 | attr->value = g_strdup(value); 61 | /* Remove the tailing \n */ 62 | n = index(attr->value, '\n'); 63 | if (n != NULL) { 64 | *n = '\0'; 65 | } 66 | /* Strip the whitespace */ 67 | g_strstrip(attr->value); 68 | return(attr); 69 | 70 | } 71 | 72 | Attribute_t *attribute_new(const char *line) { 73 | Attribute_t *attr = NULL; 74 | int type; 75 | char *colon; 76 | gchar *token; 77 | 78 | 79 | colon = index(line, ':'); 80 | if (colon != NULL) { 81 | if (line[0] =='*') { 82 | token = g_strndup(line+1, 2); 83 | type = DF_attribute_code2type(token); 84 | } 85 | else { 86 | token = g_strndup(line, (colon - line)); 87 | type = DF_attribute_name2type(token); 88 | } 89 | if(token)free(token); 90 | 91 | colon+=2; 92 | if (type >= 0) { 93 | attr=attribute_new1(type, colon); 94 | } 95 | else { 96 | /* fprintf(stderr, "ERROR: Bad attribute: %s\n", token);*/ 97 | } 98 | } 99 | else { 100 | /* fprintf(stderr, "ERROR: Not an attribute: %s\n", line);*/ 101 | } 102 | return attr; 103 | } /* attribute_new() */ 104 | 105 | 106 | void object_free(Object_t *obj) { 107 | if (obj) { 108 | g_slist_foreach(obj->attributes, attribute_free, NULL); 109 | g_slist_free(obj->attributes); 110 | g_string_free(obj->object, TRUE); 111 | free(obj); 112 | } 113 | } /* object_free() */ 114 | 115 | Object_t *object_new(const char *line) { 116 | Object_t *obj = NULL; 117 | 118 | int type; 119 | char *colon; 120 | gchar *token; 121 | 122 | colon = index(line, ':'); 123 | if (colon != NULL) { 124 | if (line[0] =='*') { 125 | token = g_strndup(line+1, 2); 126 | type = DF_class_code2type(token); 127 | } 128 | else { 129 | token = g_strndup(line, (colon - line)); 130 | type = DF_class_name2type(token); 131 | } 132 | if(token)free(token); 133 | 134 | if (type >= 0) { 135 | obj = (Object_t *)calloc(1, sizeof(Object_t)+1); 136 | obj->attributes = NULL; 137 | obj->object = g_string_sized_new(STR_XXXL); 138 | obj->type = type; 139 | } 140 | else { 141 | /* fprintf(stderr, "ERROR: Object has an invalid class: %s\n");*/ 142 | } 143 | } 144 | else { 145 | /* fprintf(stderr, "ERROR: No colon found in line: %s\n", line);*/ 146 | } 147 | 148 | return obj; 149 | } /* object_new() */ 150 | 151 | 152 | 153 | 154 | /************************************************************ 155 | *void transaction_free(Transaction_t *tr) 156 | * 157 | * **********************************************************/ 158 | void transaction_free(Transaction_t *tr) { 159 | if(tr) { 160 | g_string_free(tr->error_script, TRUE); 161 | /* free nic_handle_t structure used for NHR stuff */ 162 | if(tr->nh)free_nh(tr->nh); 163 | if(tr->save)free(tr->save); 164 | free(tr); 165 | } 166 | } /* transaction_free() */ 167 | 168 | /************************************************************ 169 | *Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) 170 | * 171 | * **********************************************************/ 172 | Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) { 173 | Transaction_t *tr = (Transaction_t *)calloc(1, sizeof(Transaction_t)); 174 | 175 | if (tr != NULL) { 176 | tr->sql_connection = sql_connection; 177 | tr->class_type = class_type; 178 | tr->thread_upd=TR_UPDATE; 179 | tr->thread_ins=TR_INSERT; 180 | tr->object_id = 0; /* Just in case*/ 181 | tr->succeeded = 1; 182 | tr->error=0; 183 | tr->error_script = g_string_sized_new(STR_XL); 184 | tr->dummy = 0; /* By default do not create dummies except for sets*/ 185 | tr->ndummy=0; 186 | tr->action=100; 187 | tr->load_pass=0; /* by default*/ 188 | tr->sequence_id=1; /* we start from 1*/ 189 | tr->save=NULL; 190 | tr->nh=NULL; 191 | tr->packptr=NULL; 192 | } 193 | return tr; 194 | } /* transaction_new() */