modules/pm/pm_serials.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. PM_get_minmax_serial
  2. atlast
  3. getop
  4. PM_get_serial_object

   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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
 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)
     /* [<][>][^][v][top][bottom][index][help] */
 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 }

/* [<][>][^][v][top][bottom][index][help] */