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 | }