1 | #include <stdio.h>
2 | #include "ud_int.h"
3 | #include "protocol_mirror.h"
4 |
5 |
6 |
7 | /************************************************************
8 | * PM_get_minmax_serial() *
9 | * *
10 | * Returns the min or max serial number. *
11 | * *
12 | * Returns: *
13 | * min (max=0) or max (max=1) serial number *
14 | * -1 in case of an error *
15 | * *
16 | * Note: *
17 | * min serial= MIN(serial_id)+1 *
18 | * MIN(serial_id) represents legacy RIPE.CURRENSERIAL *
19 | * of the snapshot *
20 | * *
21 | *************************************************************/
22 | long PM_get_minmax_serial(SQ_connection_t *sql_connection, int max)
23 | {
24 | static char query[STR_M];
25 | SQ_result_set_t *sql_result;
26 | SQ_row_t *sql_row;
27 | char *sql_str;
28 | long current_serial;
29 | char *minmax;
30 | int sql_err;
31 |
32 | if(max==1)minmax="max"; else minmax="min";
33 |
34 | sprintf(query, "SELECT %s(serial_id) FROM serials ", minmax);
35 |
36 | //fprintf(stderr, "D:<get_field_str>:query: %s\n", query);
37 | sql_err = SQ_execute_query(sql_connection, query, &sql_result);
38 |
39 | if(sql_err) {
40 | fprintf(stderr,"ERROR: %s\n", SQ_error(sql_connection));
41 | return(-1);
42 | }
43 |
44 |
45 | if ((sql_row = SQ_row_next(sql_result)) != NULL) {
46 | sql_str = SQ_get_column_string(sql_result, sql_row, 0);
47 |
48 | /* We must process all the rows of the result,*/
49 | /* otherwise we'll have them as part of the next qry */
50 | while ( (sql_row = SQ_row_next(sql_result)) != NULL) {
51 | fprintf(stderr, "E:<get_field_str> error : Dupl PK[%s]\n", query);
52 | if(sql_str)free(sql_str); sql_str=NULL;
53 | }
54 | }
55 | else sql_str=NULL;
56 |
57 | if(sql_result){ SQ_free_result(sql_result); sql_result=NULL; }
58 |
59 | if(sql_str) {
60 | current_serial = atol(sql_str);
61 | if(max!=1)current_serial++;
62 | free(sql_str);
63 | }
64 | else current_serial=-1;
65 |
66 | return(current_serial);
67 |
68 | }
69 |
70 | /************************************************************
71 | * int atlast(long serial_number)
72 | * -1 - sql error
73 | *
74 | ***********************************************************/
75 |
76 | static int atlast(SQ_connection_t *sql_connection, long serial_number)
77 | {
78 | char *sql_str;
79 | char str_id[STR_S];
80 | int atlast=-1;
81 |
82 |
83 | sprintf(str_id, "%ld", serial_number);
84 | sql_str= get_field_str(sql_connection, "atlast", "serials", "serial_id", str_id, NULL);
85 | if(sql_str) {
86 | atlast = atoi(sql_str);
87 | free(sql_str);
88 | }
89 |
90 | return(atlast);
91 |
92 | }
93 |
94 |
95 | /************************************************************
96 | * int getop(long serial_number)
97 | * -1 - sql error
98 | *
99 | * **********************************************************/
100 |
101 | static int getop(SQ_connection_t *sql_connection, long serial_number)
102 | {
103 | char *sql_str;
104 | char str_id[STR_S];
105 | int op=-1;
106 |
107 |
108 | sprintf(str_id, "%ld", serial_number);
109 | sql_str= get_field_str(sql_connection, "operation", "serials", "serial_id", str_id, NULL);
110 | if(sql_str) {
111 | op = atoi(sql_str);
112 | free(sql_str);
113 | }
114 |
115 | return(op);
116 |
117 | }
118 |
119 |
120 | /************************************************************
121 | * char *PM_get_serial_object() *
122 | * *
123 | * Returns text block corresponding to the requested serial *
124 | * *
125 | * Returns: *
126 | * operation (ADD/DEL) and text object *
127 | * NULL in case of an error *
128 | * *
129 | * Note: *
130 | * returned string should be freed by the caller *
131 | * *
132 | *************************************************************/
133 | char *PM_get_serial_object(SQ_connection_t *sql_connection, long serial_number, int *operation)
134 | {
135 | char *table;
136 | SQ_result_set_t * sql_result;
137 | SQ_row_t *sql_row;
138 | char *sql_str;
139 | static char query[STR_M];
140 | int sql_err;
141 |
142 | switch(atlast(sql_connection, serial_number)){
143 |
144 | case 0: table="history";
145 | break;
146 | case 1: table="last";
147 | break;
148 | default: return(NULL);
149 |
150 | }
151 |
152 | sprintf(query, "SELECT %s.object FROM %s, serials "
153 | "WHERE serials.serial_id=%ld "
154 | "AND serials.object_id=%s.object_id "
155 | "AND serials.sequence_id=%s.sequence_id ", table, table, serial_number, table, table);
156 |
157 |
158 | sql_err = SQ_execute_query(sql_connection, query, &sql_result);
159 |
160 | if(sql_err) {
161 | fprintf(stderr,"ERROR: %s\n", SQ_error(sql_connection));
162 | return(NULL);
163 | }
164 |
165 |
166 | if ((sql_row = SQ_row_next(sql_result)) != NULL) {
167 | sql_str = SQ_get_column_string(sql_result, sql_row, 0);
168 |
169 | /* We must process all the rows of the result,*/
170 | /* otherwise we'll have them as part of the next qry */
171 | while ( (sql_row = SQ_row_next(sql_result)) != NULL) {
172 | fprintf(stderr, "E:<get_field_str> error : Dupl PK[%s]\n", query);
173 | if(sql_str)free(sql_str); sql_str=NULL;
174 | }
175 | }
176 | else sql_str=NULL;
177 |
178 | if(sql_result){ SQ_free_result(sql_result); sql_result=NULL; }
179 |
180 | *operation=getop(sql_connection, serial_number);
181 |
182 | return(sql_str);
183 |
184 | }