modules/pm/pm_serials.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- PM_get_minmax_serial
- atlast
- getop
- PM_get_serial_object
#include <stdio.h>
#include "ud_int.h"
#include "protocol_mirror.h"
/************************************************************
* PM_get_minmax_serial() *
* *
* Returns the min or max serial number. *
* *
* Returns: *
* min (max=0) or max (max=1) serial number *
* -1 in case of an error *
* *
* Note: *
* min serial= MIN(serial_id)+1 *
* MIN(serial_id) represents legacy RIPE.CURRENSERIAL *
* of the snapshot *
* *
*************************************************************/
long PM_get_minmax_serial(SQ_connection_t *sql_connection, int max)
/* [<][>][^][v][top][bottom][index][help] */
{
static char query[STR_M];
SQ_result_set_t *sql_result;
SQ_row_t *sql_row;
char *sql_str;
long current_serial;
char *minmax;
int sql_err;
if(max==1)minmax="max"; else minmax="min";
sprintf(query, "SELECT %s(serial_id) FROM serials ", minmax);
//fprintf(stderr, "D:<get_field_str>:query: %s\n", query);
sql_err = SQ_execute_query(sql_connection, query, &sql_result);
if(sql_err) {
fprintf(stderr,"ERROR: %s\n", SQ_error(sql_connection));
return(-1);
}
if ((sql_row = SQ_row_next(sql_result)) != NULL) {
sql_str = SQ_get_column_string(sql_result, sql_row, 0);
/* We must process all the rows of the result,*/
/* otherwise we'll have them as part of the next qry */
while ( (sql_row = SQ_row_next(sql_result)) != NULL) {
fprintf(stderr, "E:<get_field_str> error : Dupl PK[%s]\n", query);
if(sql_str)free(sql_str); sql_str=NULL;
}
}
else sql_str=NULL;
if(sql_result){ SQ_free_result(sql_result); sql_result=NULL; }
if(sql_str) {
current_serial = atol(sql_str);
if(max!=1)current_serial++;
free(sql_str);
}
else current_serial=-1;
return(current_serial);
}
/************************************************************
* int atlast(long serial_number)
* -1 - sql error
*
***********************************************************/
static int atlast(SQ_connection_t *sql_connection, long serial_number)
/* [<][>][^][v][top][bottom][index][help] */
{
char *sql_str;
char str_id[STR_S];
int atlast=-1;
sprintf(str_id, "%ld", serial_number);
sql_str= get_field_str(sql_connection, "atlast", "serials", "serial_id", str_id, NULL);
if(sql_str) {
atlast = atoi(sql_str);
free(sql_str);
}
return(atlast);
}
/************************************************************
* int getop(long serial_number)
* -1 - sql error
*
* **********************************************************/
static int getop(SQ_connection_t *sql_connection, long serial_number)
/* [<][>][^][v][top][bottom][index][help] */
{
char *sql_str;
char str_id[STR_S];
int op=-1;
sprintf(str_id, "%ld", serial_number);
sql_str= get_field_str(sql_connection, "operation", "serials", "serial_id", str_id, NULL);
if(sql_str) {
op = atoi(sql_str);
free(sql_str);
}
return(op);
}
/************************************************************
* char *PM_get_serial_object() *
* *
* Returns text block corresponding to the requested serial *
* *
* Returns: *
* operation (ADD/DEL) and text object *
* NULL in case of an error *
* *
* Note: *
* returned string should be freed by the caller *
* *
*************************************************************/
char *PM_get_serial_object(SQ_connection_t *sql_connection, long serial_number, int *operation)
/* [<][>][^][v][top][bottom][index][help] */
{
char *table;
SQ_result_set_t * sql_result;
SQ_row_t *sql_row;
char *sql_str;
static char query[STR_M];
int sql_err;
switch(atlast(sql_connection, serial_number)){
case 0: table="history";
break;
case 1: table="last";
break;
default: return(NULL);
}
sprintf(query, "SELECT %s.object FROM %s, serials "
"WHERE serials.serial_id=%ld "
"AND serials.object_id=%s.object_id "
"AND serials.sequence_id=%s.sequence_id ", table, table, serial_number, table, table);
sql_err = SQ_execute_query(sql_connection, query, &sql_result);
if(sql_err) {
fprintf(stderr,"ERROR: %s\n", SQ_error(sql_connection));
return(NULL);
}
if ((sql_row = SQ_row_next(sql_result)) != NULL) {
sql_str = SQ_get_column_string(sql_result, sql_row, 0);
/* We must process all the rows of the result,*/
/* otherwise we'll have them as part of the next qry */
while ( (sql_row = SQ_row_next(sql_result)) != NULL) {
fprintf(stderr, "E:<get_field_str> error : Dupl PK[%s]\n", query);
if(sql_str)free(sql_str); sql_str=NULL;
}
}
else sql_str=NULL;
if(sql_result){ SQ_free_result(sql_result); sql_result=NULL; }
*operation=getop(sql_connection, serial_number);
return(sql_str);
}