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 |