Source File modules/ud/ud_serial.c

    1    | /***************************************
    2    |
    3    |   Functions for handling serials
    4    |
    5    |   Status: NOT REVUED, NOT TESTED
    6    |
    7    |  Author(s):       Andrei Robachevsky
    8    |
    9    |   ******************/ /******************
    10   |   Modification History:
    11   |         andrei (08/02/2000) Created.
    12   |   ******************/ /******************
    13   |   Copyright (c) 2000                              RIPE NCC
    14   |
    15   |   All Rights Reserved
    16   |
    17   |   Permission to use, copy, modify, and distribute this software and its
    18   |   documentation for any purpose and without fee is hereby granted,
    19   |   provided that the above copyright notice appear in all copies and that
    20   |   both that copyright notice and this permission notice appear in
    21   |   supporting documentation, and that the name of the author not be
    22   |   used in advertising or publicity pertaining to distribution of the
    23   |   software without specific, written prior permission.
    24   |
    25   |   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
    26   |   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
    27   |   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
    28   |   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
    29   |   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    30   |   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    31   |  ***************************************/
    32   | #include "ud.h"
    33   | #include "ud_int.h"
    34   |
    35   | /************************************************************
    36   | * create_serial()                                           *
    37   | *                                                           *
    38   | * Creates a serial record for given transaction             *
    39   | * For updates creates 2 serial records (DEL+ADD)            *
    40   | *                                                           *
    41   | * Important fields of transaction are:                      *
    42   | * tr->action        TR_CREATE/TR_UPDATE/TR_DELETE           *
    43   | * tr->object_id     should be filled in                     *
    44   | * tr->sequence_id   should be set to current                *
    45   | *                                                           *
    46   | * Returns:                                                  *
    47   | *  currnt serial number.                                    *
    48   | *  -1 in case of an error                                   *
    49   | *                                                           *
    50   | *************************************************************/
    51   |
    52   | long create_serial(Transaction_t *tr)
    53   | {
    54   | GString *query;
    55   | long current_serial=0;
    56   | int sql_err;
    57   | int operation;
    58   |
    59   |    if ((query = g_string_sized_new(STR_XL)) == NULL){
    60   |       fprintf(stderr, "E: cannot allocate gstring\n");
    61   |       tr->succeeded=0;
    62   |       tr->error |= ERROR_U_MEM;
    63   |       return(ERROR_U_MEM);
    64   |    }
    65   |
    66   | /* fprintf(stderr, "creating serial\n"); */
    67   |   /* if the transaction failed store it in transaction table */
    68   |   if(tr->succeeded==0){
    69   |     if(ACT_DELETE(tr->action))operation=OP_DEL; else operation=OP_ADD;
    70   |
    71   |     g_string_sprintf(query, "INSERT serials SET "
    72   |                    "object_id=0, sequence_id=0, "
    73   | 		   "atlast=2, "
    74   | 		   "operation=%d ", operation);
    75   |
    76   |     sql_err = SQ_execute_query(tr->sql_connection, query->str, (SQ_result_set_t **)NULL);
    77   |     if (sql_err) {
    78   |         fprintf(stderr, "E: <create_serial>: cannot insert %s\n", query->str);
    79   |         current_serial=-1;
    80   |     }
    81   |     else {
    82   |        current_serial=mysql_insert_id(tr->sql_connection);
    83   |        g_string_sprintf(query, "INSERT transaction SET "
    84   |                    "serial_id=%ld, "
    85   | 		   "object='%s' ", current_serial, tr->object->object->str);
    86   |        /* make a record in transaction table */
    87   |        sql_err = SQ_execute_query(tr->sql_connection, query->str, (SQ_result_set_t **)NULL);
    88   |        if (sql_err) {
    89   |          fprintf(stderr, "E: <create_serial>: cannot save transactiom %s\n", query->str);
    90   |          current_serial=-1;
    91   |        }
    92   |     }
    93   |     g_string_free(query, TRUE);
    94   |     return(current_serial);
    95   |   }
    96   |
    97   |
    98   |   /* if the transaction has succeeded */
    99   |
    100  |   /* If this is an update or delete */
    101  |   if(!ACT_CREATE(tr->action)) {
    102  |     /* set the atlast field of the latest record for this object to 0 */
    103  |     /* because it is moved to history */
    104  |     g_string_sprintf(query, "UPDATE serials SET atlast=0 "
    105  |                    "WHERE object_id=%ld "
    106  |                    "AND sequence_id=%ld ", tr->object_id, tr->sequence_id-1);
    107  |
    108  |     sql_err = SQ_execute_query(tr->sql_connection, query->str, (SQ_result_set_t **)NULL);
    109  |     if (sql_err) { // we can have empty updates, but not errors
    110  |         fprintf(stderr, "E: <create_serial>: cannot update %s\n", query->str);
    111  |         current_serial=-1;
    112  |     }
    113  |   }
    114  |   /* if this a DEL */
    115  |   if(ACT_DELETE(tr->action)) {
    116  |     /* generate DEL serial */
    117  |     g_string_sprintf(query, "INSERT serials SET "
    118  |                    "object_id=%ld, "
    119  |                    "sequence_id=%ld, "
    120  |                    "atlast=0, "
    121  |                    "operation=%d ", tr->object_id, tr->sequence_id-1, OP_DEL);
    122  |
    123  |     sql_err = SQ_execute_query(tr->sql_connection, query->str, (SQ_result_set_t **)NULL);
    124  |     if (sql_err) {
    125  |         fprintf(stderr, "E: <create_serial>: cannot insert %s\n",query->str);
    126  |         current_serial=-1;
    127  |     }
    128  |
    129  |     if(current_serial!=-1)current_serial=mysql_insert_id(tr->sql_connection);
    130  |
    131  |   }
    132  |   else { /* otherwise this is an ADD */
    133  |
    134  |    /* now insert creation serial */
    135  |    g_string_sprintf(query, "INSERT serials SET "
    136  |                   "object_id=%ld, "
    137  |                   "sequence_id=%ld, "
    138  |                   "atlast=1, "
    139  |                   "operation=%d ", tr->object_id, tr->sequence_id, OP_ADD);
    140  |
    141  |    sql_err = SQ_execute_query(tr->sql_connection, query->str, (SQ_result_set_t **)NULL);
    142  |    if (sql_err) {
    143  |         fprintf(stderr, "E: <create_serial>: cannot insert %s\n",query->str);
    144  |         current_serial=-1;
    145  |    }
    146  |
    147  |    if(current_serial!=-1)current_serial=mysql_insert_id(tr->sql_connection);
    148  |   }
    149  |
    150  | g_string_free(query, TRUE);
    151  | return(current_serial);
    152  | }
    153  |