| 1069 | // |
| 1070 | |
| 1071 | void PAR_reserving( USHORT flags, bool parse_sql) |
| 1072 | { |
| 1073 | gpre_dbb* database; |
| 1074 | |
| 1075 | while (true) |
| 1076 | { |
| 1077 | // find a relation name, or maybe a list of them |
| 1078 | |
| 1079 | if (!parse_sql && terminator()) |
| 1080 | break; |
| 1081 | |
| 1082 | do { |
| 1083 | gpre_rel* relation = EXP_relation(); |
| 1084 | if (!relation) |
| 1085 | CPR_s_error("relation name"); |
| 1086 | database = relation->rel_database; |
| 1087 | rrl* lock_block = (rrl*) MSC_alloc(RRL_LEN); |
| 1088 | lock_block->rrl_next = database->dbb_rrls; |
| 1089 | lock_block->rrl_relation = relation; |
| 1090 | database->dbb_rrls = lock_block; |
| 1091 | } while (MSC_match(KW_COMMA)); |
| 1092 | |
| 1093 | // get the lock level and mode and apply them to all the |
| 1094 | // relations in the list |
| 1095 | |
| 1096 | MSC_match(KW_FOR); |
| 1097 | USHORT lock_level = (flags & TRA_con) ? isc_tpb_protected : isc_tpb_shared; |
| 1098 | USHORT lock_mode = isc_tpb_lock_read; |
| 1099 | |
| 1100 | if (MSC_match(KW_PROTECTED)) |
| 1101 | lock_level = isc_tpb_protected; |
| 1102 | else if (MSC_match(KW_EXCLUSIVE)) |
| 1103 | lock_level = isc_tpb_exclusive; |
| 1104 | else if (MSC_match(KW_SHARED)) |
| 1105 | lock_level = isc_tpb_shared; |
| 1106 | |
| 1107 | if (MSC_match(KW_WRITE)) |
| 1108 | { |
| 1109 | if (flags & TRA_ro) |
| 1110 | CPR_error("write lock requested for a read_only transaction"); |
| 1111 | lock_mode = isc_tpb_lock_write; |
| 1112 | } |
| 1113 | else |
| 1114 | MSC_match(KW_READ); |
| 1115 | |
| 1116 | for (database = gpreGlob.isc_databases; database; database = database->dbb_next) |
| 1117 | { |
| 1118 | for (rrl* lock_block = database->dbb_rrls; lock_block; lock_block = lock_block->rrl_next) |
| 1119 | { |
| 1120 | if (!lock_block->rrl_lock_level) |
| 1121 | { |
| 1122 | fb_assert(lock_level <= MAX_UCHAR); |
| 1123 | fb_assert(lock_mode <= MAX_UCHAR); |
| 1124 | lock_block->rrl_lock_level = (UCHAR) lock_level; |
| 1125 | lock_block->rrl_lock_mode = (UCHAR) lock_mode; |
| 1126 | } |
| 1127 | } |
| 1128 | } |
no test coverage detected