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 | static char query[STR_M];
55 | long current_serial=0;
56 | int sql_err;
57 |
58 | /* fprintf(stderr, "creating serial\n"); */
59 |
60 | if(!ACT_CREATE(tr->action)) {
61 | /* set the atlast field of the latest record for this object to 0 */
62 | /* because it is moved to history */
63 | sprintf(query, "UPDATE serials SET atlast=0 "
64 | "WHERE object_id=%ld "
65 | "AND sequence_id=%ld ", tr->object_id, tr->sequence_id-1);
66 |
67 | sql_err = SQ_execute_query(tr->sql_connection, query, (SQ_result_set_t **)NULL);
68 | if (sql_err) { // we can have empty updates, but not errors
69 | fprintf(stderr, "E: <create_serial>: cannot update %s\n", query);
70 | current_serial=-1;
71 | }
72 |
73 |
74 | /* generate DEL serial */
75 | sprintf(query, "INSERT serials SET "
76 | "object_id=%ld, "
77 | "sequence_id=%ld, "
78 | "atlast=0, "
79 | "operation=%d ", tr->object_id, tr->sequence_id-1, OP_DEL);
80 |
81 | sql_err = SQ_execute_query(tr->sql_connection, query, (SQ_result_set_t **)NULL);
82 | if (sql_err) {
83 | fprintf(stderr, "E: <create_serial>: cannot insert %s\n",query);
84 | current_serial=-1;
85 | }
86 |
87 | if(current_serial!=-1)current_serial=mysql_insert_id(tr->sql_connection);
88 |
89 | /* there is nothing more to do when OP_DEL */
90 | if(ACT_DELETE(tr->action)) return(current_serial);
91 | }
92 |
93 | /* now insert creation serial */
94 | sprintf(query, "INSERT serials SET "
95 | "object_id=%ld, "
96 | "sequence_id=%ld, "
97 | "atlast=1, "
98 | "operation=%d ", tr->object_id, tr->sequence_id, OP_ADD);
99 |
100 | sql_err = SQ_execute_query(tr->sql_connection, query, (SQ_result_set_t **)NULL);
101 | if (sql_err) {
102 | fprintf(stderr, "E: <create_serial>: cannot insert %s\n",query);
103 | current_serial=-1;
104 | }
105 |
106 | if(current_serial!=-1)current_serial=mysql_insert_id(tr->sql_connection);
107 |
108 | return(current_serial);
109 | }
110 |