1 | /***************************************
2 | $Revision: 1.1 $
3 |
4 | Semi-internal header file for UD module
5 |
6 | Status: NOT REVUED, NOT TESTED
7 |
8 | Author(s): Andrei Robachevsky
9 |
10 | ******************/ /******************
11 | Modification History:
12 | andrei (17/01/2000) Created.
13 | ******************/ /******************
14 | Copyright (c) 2000 RIPE NCC
15 |
16 | All Rights Reserved
17 |
18 | Permission to use, copy, modify, and distribute this software and its
19 | documentation for any purpose and without fee is hereby granted,
20 | provided that the above copyright notice appear in all copies and that
21 | both that copyright notice and this permission notice appear in
22 | supporting documentation, and that the name of the author not be
23 | used in advertising or publicity pertaining to distribution of the
24 | software without specific, written prior permission.
25 |
26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 | ***************************************/
33 | #ifndef _UD_TR_H
34 | #define _UD_TR_H
35 |
36 |
37 | #include "ud_int.h"
38 |
39 | /*
40 |
41 | SQL Tables used to keep records needed for crash recovery
42 |
43 | CREATE TABLE transaction_rec (
44 | 0 transaction_id int(11) DEFAULT '0' NOT NULL auto_increment,
45 | 1 object_id int(10) unsigned DEFAULT '0' NOT NULL,
46 | 2 sequence_id int(10) unsigned DEFAULT '1' NOT NULL,
47 | 3 serial_id int(10) unsigned DEFAULT '1' NOT NULL,
48 | 4 object_type tinyint(3) unsigned DEFAULT '0' NOT NULL,
49 | 5 save varchar(256) DEFAULT '' NOT NULL,
50 | 6 error_script blob DEFAULT '' NOT NULL,
51 | 7 mode tinyint(4) unsigned DEFAULT '0' NOT NULL,
52 | 8 succeeded tinyint(4) unsigned DEFAULT '0' NOT NULL,
53 | 9 action tinyint(4) unsigned DEFAULT '0' NOT NULL,
54 | 10 status tinyint(10) unsigned DEFAULT '0' NOT NULL,
55 | 11 clean tinyint(3) DEFAULT '0' NOT NULL,
56 | PRIMARY KEY (transaction_id)
57 | );
58 |
59 | CREATE TABLE dummy_rec (
60 | transaction_id int(11) DEFAULT '0' NOT NULL,
61 | object_id int(10) unsigned DEFAULT '0' NOT NULL,
62 | PRIMARY KEY (transaction_id, object_id)
63 | );
64 | */
65 |
66 | #define DUMMY_OBJECT_ID 1
67 |
68 |
69 | #define tr_get_object_id(result, row) tr_get_long(result, row, 1)
70 | #define tr_get_sequence_id(result, row) tr_get_long(result, row, 2)
71 | #define tr_get_serial_id(result, row) tr_get_long(result, row, 3)
72 | #define tr_get_class_type(result, row) (C_Type_t)tr_get_int(result, row, 4)
73 | #define tr_get_save(result, row) tr_get_str(result, row, 5)
74 | #define tr_get_escript(result, row) tr_get_str(result, row, 6)
75 | #define tr_get_mode(result, row) tr_get_int(result, row, 7)
76 | #define tr_get_success(result, row) tr_get_int(result, row, 8)
77 | #define tr_get_action(result, row) tr_get_int(result, row, 9)
78 | #define tr_get_status(result, row) tr_get_int(result, row, 10)
79 | #define tr_get_clean(result, row) tr_get_int(result, row, 11)
80 |
81 |
82 | #define TR_update_status(tr) TR_update_record(tr, TF_STATUS)
83 | #define TR_update_save(tr) TR_update_record(tr, TF_STATUS)
84 | #define TR_update_dummy(tr) TR_update_record(tr, TF_DUMMY)
85 | #define TR_update_escript(tr) TR_update_record(tr, TF_ESCRIPT)
86 | #define TR_update_id(tr) TR_update_record(tr, TF_ID)
87 | #define TR_mark_clean(tr) TR_update_record(tr, TF_CLEAN)
88 |
89 |
90 |
91 |
92 |
93 |
94 | /* Transaction Status & CheckPoints
95 | 76543210
96 | 21NRC
97 | */
98 |
99 | #define TCP_UNCLEAN 0x0000
100 | #define TCP_CLEAN 0x0100
101 | #define TCP_ROLLBACK 0x0200
102 | #define TCP_COMMIT_NH 0x0400
103 | #define TCP_ROLLBACK_NH TCP_COMMIT_NH
104 | #define TCP_COMMIT_I 0x0800
105 | #define TCP_ROLLBACKED TCP_COMMIT_I
106 | #define TCP_COMMIT_II 0x1000
107 | #define TCP_DELETE 0x2000
108 | #define TCP_CREATE_S 0x4000
109 |
110 | #define TS_CLEAN(a) ((a)&TCP_CLEAN)
111 | #define TS_ROLLBACK(a) ((a)&TCP_ROLLBACK)
112 | #define TS_ROLLBACKED(a) ((a)&TCP_ROLLBACKED)
113 | #define TS_COMMITTED_NH(a) ((a)&TCP_COMMIT_NH)
114 | #define TS_ROLLBACKED_NH(a) ((a)&TCP_ROLLBACK_NH)
115 | #define TS_COMMITTED_I(a) ((a)&TCP_COMMIT_I)
116 | #define TS_COMMITTED_II(a) ((a)&TCP_COMMIT_II)
117 | #define TS_DELETED(a) ((a)&TCP_DELETE)
118 | #define TS_CREATED_S(a) ((a)&TCP_CREATE_S)
119 |
120 | #define TR_ACTION(a) ((a)&0x00FF)
121 | #define TR_STATUS(a) ((a)>>8)
122 |
123 | /* some useful macros for checkpointing (CP)*/
124 |
125 | #define CP_ROLLBACK(a) (a)=(TR_ACTION(a) + TCP_ROLLBACK)
126 | #define CP_COMMIT(a) (a)= TR_ACTION(a)
127 | #define CP_ROLLBACK_PASSED(a) ((a)|=TCP_ROLLBACKED)
128 | #define CP_DELETE_PASSED(a) ((a)|=TCP_DELETE)
129 | #define CP_COMMIT_NH_PASSED(a) ((a)|=TCP_COMMIT_NH)
130 | #define CP_ROLLBACK_NH_PASSED(a) ((a)|=TCP_ROLLBACK_NH)
131 | #define CP_COMMIT_I_PASSED(a) ((a)|=TCP_COMMIT_I)
132 | #define CP_COMMIT_II_PASSED(a) ((a)|=TCP_COMMIT_II)
133 | #define CP_CREATE_S_PASSED(a) ((a)|=TCP_CREATE_S)
134 | #define CP_CLEAN(a) ((a)|=TCP_CLEAN)
135 |
136 |
137 | /* Transaction record fields */
138 | enum {
139 | TF_STATUS=1,
140 | TF_CLEAN,
141 | TF_DUMMY,
142 | TF_SAVE,
143 | TF_ESCRIPT,
144 | TF_ID
145 | };
146 |
147 | /* for crash recovery we need to handle only the transaction that failed */
148 | #define TR_LAST (-1)
149 |
150 | long TR_create_record(Transaction_t *tr);
151 | long TR_update_record(Transaction_t *tr, int field);
152 | Transaction_t *TR_get_record(SQ_connection_t *sql_connection, long transaction_id);
153 | void TR_delete_record(Transaction_t *tr);
154 | int TR_recover(SQ_connection_t *sql_connection);
155 | int TR_check(SQ_connection_t *sql_connection, long transaction_id, int sockfd);
156 | SQ_result_set_t *tr_get_sql_record(SQ_connection_t *sql_connection, long transaction_id);
157 | long tr_get_long(SQ_result_set_t *result, SQ_row_t *row, int col);
158 | int tr_get_int(SQ_result_set_t *result, SQ_row_t *row, int col);
159 | char *tr_get_str(SQ_result_set_t *result, SQ_row_t *row, int col);
160 | int tr_get_dummies(Transaction_t *tr);
161 |
162 |
163 | #endif /* _UD_TR_H */
164 |
165 |
166 |