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 |