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 |