1 | /*************************************** 2 | $Revision: 1.19 $ 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,2001,2002 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 | 34 | #include "rip.h" 35 | 36 | /************************************************************ 37 | * void transaction_free() * 38 | * * 39 | * Frees memory allocated for a transaction * 40 | * * 41 | ************************************************************/ 42 | 43 | void transaction_free(Transaction_t *tr) { 44 | if(tr) { 45 | g_string_free(tr->error_script, TRUE); 46 | g_string_free(tr->K, TRUE); 47 | /* free nic_handle_t structure used for NHR stuff */ 48 | if(tr->nh)free_nh(tr->nh); 49 | if(tr->save){ 50 | UT_free(tr->save); 51 | } 52 | if(tr->packptr)UT_free(tr->packptr); 53 | 54 | if(tr->query)g_string_free(tr->query, TRUE); 55 | if(tr->object)rpsl_object_delete(tr->object); 56 | UT_free(tr->object_txt); 57 | 58 | UT_free(tr); 59 | } 60 | } /* transaction_free() */ 61 | 62 | /************************************************************ 63 | * Transaction_t *transaction_new() * 64 | * * 65 | * Creates a transaction * 66 | * * 67 | ************************************************************/ 68 | Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) { 69 | Transaction_t *tr = (Transaction_t *)UT_calloc(1, sizeof(Transaction_t)); 70 | 71 | tr->sql_connection = sql_connection; 72 | tr->class_type = class_type; 73 | tr->thread_upd=TR_UPDATE; 74 | tr->thread_ins=TR_INSERT; 75 | tr->succeeded = 1; 76 | tr->error_script = g_string_sized_new(STR_XL); 77 | tr->K = g_string_sized_new(STR_L); 78 | tr->sequence_id=1; /* we start from 1*/ 79 | tr->packptr=UT_calloc(1, sizeof(rp_upd_pack_t)); 80 | tr->query = g_string_sized_new(STR_XL); 81 | 82 | /* check memory allocations */ 83 | if((tr->error_script == NULL) || (tr->K == NULL) || (tr->query == NULL)) { 84 | ER_perror(FAC_UD, UD_MEM, "cannot allocate gstring\n"); 85 | die; 86 | } 87 | 88 | 89 | return tr; 90 | } /* transaction_new() */ 91 | /************************************************************ 92 | * int UD_ack() * 93 | * 94 | * Sends an acknowledgement to DBupdate and receives a reply * * 95 | * * 96 | * Return codes: * 97 | * * 98 | * 0 - OK 99 | * -1 - 100 | ************************************************************/ 101 | int UD_ack(Transaction_t* tr) 102 | { 103 | GString *g_buff; 104 | int res, error; 105 | 106 | /* if we are not in update/server mode - no ack is needed - just return */ 107 | if(IS_STANDALONE(tr->mode)) return(0); 108 | if(!IS_UPDATE(tr->mode)) return(0); 109 | 110 | if ((g_buff = g_string_sized_new(STR_L)) == NULL){ 111 | ER_perror(FAC_UD, UD_MEM, "cannot allocate gstring\n"); 112 | die; 113 | } 114 | 115 | if(tr->succeeded==0) { /* update failed */ 116 | error = tr->error; 117 | } 118 | else error = 0; 119 | 120 | g_string_sprintf(g_buff, "%%ERROR %d\n%s\n", error, (tr->error_script)->str); 121 | res = SK_puts(tr->socket, g_buff->str, NULL); 122 | g_string_free(g_buff, TRUE); 123 | /* close the connection */ 124 | /* Let DBupdate close the connection */ 125 | /* close(tr->socket); */ 126 | return(res); 127 | } 128 |