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