ISC_STATUS API_ROUTINE gds__receive(ISC_STATUS * status_vector, FB_API_HANDLE* req_handle, SSHORT msg_type, SSHORT msg_length, void *msg, SSHORT req_level) { return isc_receive(status_vector, req_handle, msg_type, msg_length, (SCHAR*) msg, req_level); }
void MET_disable_wal(ISC_STATUS* user_status, isc_db_handle handle) { struct isc_23_struct { short isc_24; /* isc_utility */ } isc_23; struct isc_21_struct { short isc_22; /* isc_utility */ } isc_21; struct isc_19_struct { short isc_20; /* isc_utility */ } isc_19; FB_API_HANDLE request = 0; AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = handle)) return; /*START_TRANSACTION*/ { { isc_start_transaction (isc_status, (FB_API_HANDLE*) &gds_trans, (short) 1, &DB, (short) 0, (char*) 0); }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } /*FOR(REQUEST_HANDLE request) X IN RDB$LOG_FILES*/ { if (!request) isc_compile_request (NULL, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &request, (short) sizeof(isc_18), (char*) isc_18); isc_start_request (NULL, (FB_API_HANDLE*) &request, (FB_API_HANDLE*) &gds_trans, (short) 0); while (1) { isc_receive (NULL, (FB_API_HANDLE*) &request, (short) 0, (short) 2, &isc_19, (short) 0); if (!isc_19.isc_20) break; /*ERASE X;*/ isc_send (NULL, (FB_API_HANDLE*) &request, (short) 1, (short) 2, &isc_21, (short) 0); /*END_FOR*/ isc_send (NULL, (FB_API_HANDLE*) &request, (short) 2, (short) 2, &isc_23, (short) 0); } } /*COMMIT*/ { isc_commit_transaction (isc_status, (FB_API_HANDLE*) &gds_trans);; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } }
static USHORT get_capabilities(ISC_STATUS* user_status) { struct isc_4_struct { short isc_5; /* isc_utility */ } isc_4; struct isc_1_struct { char isc_2 [32]; /* RDB$FIELD_NAME */ char isc_3 [32]; /* RDB$RELATION_NAME */ } isc_1; USHORT capabilities = CAP_none; AliceGlobals* tdgbl = AliceGlobals::getSpecific(); // Look for desired fields in system relations FB_API_HANDLE req = 0; for (const rfr_tab_t* rel_field_table = rfr_table; rel_field_table->relation; rel_field_table++) { /*FOR(REQUEST_HANDLE req) x IN DB.RDB$RELATION_FIELDS WITH x.RDB$RELATION_NAME = rel_field_table->relation AND x.RDB$FIELD_NAME = rel_field_table->field*/ { if (!req) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &req, (short) sizeof(isc_0), (char*) isc_0); isc_vtov ((const char*) rel_field_table->field, (char*) isc_1.isc_2, 32); isc_vtov ((const char*) rel_field_table->relation, (char*) isc_1.isc_3, 32); if (req) isc_start_and_send (isc_status, (FB_API_HANDLE*) &req, (FB_API_HANDLE*) &gds_trans, (short) 0, (short) 64, &isc_1, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &req, (short) 1, (short) 2, &isc_4, (short) 0); if (!isc_4.isc_5 || isc_status [1]) break; capabilities |= rel_field_table->bit_mask; /*END_FOR*/ } }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } } isc_release_request(gds_status, &req); if (gds_status[1]) { return_error(user_status); } return capabilities; }
EXPORT RM_ENTRY(rmc_receive) { ClearParamPool(); ISC_STATUS *stat = AllocStatusPool(); isc_receive(stat, (isc_req_handle *)arg_vector[1].a_address, (short)*CobolToShort(&arg_vector[2]), (short)*CobolToShort(&arg_vector[3]), (void *)arg_vector[4].a_address, (short)*CobolToShort(&arg_vector[5])); StatusToCobol(&arg_vector[0], stat); return (0); }
tdr* MET_get_transaction(ISC_STATUS* user_status, isc_db_handle handle, SLONG id) { struct isc_9_struct { ISC_QUAD isc_10; /* RDB$TRANSACTION_DESCRIPTION */ short isc_11; /* isc_utility */ } isc_9; struct isc_7_struct { ISC_LONG isc_8; /* RDB$TRANSACTION_ID */ } isc_7; FB_API_HANDLE request = 0; tdr* trans = NULL; AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = handle)) return 0; /*START_TRANSACTION*/ { { isc_start_transaction (isc_status, (FB_API_HANDLE*) &gds_trans, (short) 1, &DB, (short) 0, (char*) 0); }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } const USHORT capabilities = get_capabilities(user_status); if (capabilities & CAP_transactions) { /*FOR(REQUEST_HANDLE request) TRA IN RDB$TRANSACTIONS WITH TRA.RDB$TRANSACTION_ID = id AND TRA.RDB$TRANSACTION_DESCRIPTION NOT MISSING*/ { if (!request) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &request, (short) sizeof(isc_6), (char*) isc_6); isc_7.isc_8 = id; if (request) isc_start_and_send (isc_status, (FB_API_HANDLE*) &request, (FB_API_HANDLE*) &gds_trans, (short) 0, (short) 4, &isc_7, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &request, (short) 1, (short) 10, &isc_9, (short) 0); if (!isc_9.isc_11 || isc_status [1]) break; trans = get_description(&/*TRA.RDB$TRANSACTION_DESCRIPTION*/ isc_9.isc_10); /*END_FOR*/ } }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } isc_release_request(gds_status, &request); if (gds_status[1]) { return_error(user_status); } } /*ROLLBACK*/ { isc_rollback_transaction (isc_status, (FB_API_HANDLE*) &gds_trans);; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } if (trans) trans->tdr_db_caps = capabilities; return trans; }
void MET_get_state(ISC_STATUS* user_status, tdr* trans) { struct isc_15_struct { short isc_16; /* isc_utility */ short isc_17; /* RDB$TRANSACTION_STATE */ } isc_15; struct isc_13_struct { ISC_LONG isc_14; /* RDB$TRANSACTION_ID */ } isc_13; FB_API_HANDLE request = 0; AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = trans->tdr_db_handle) || !(trans->tdr_db_caps & CAP_transactions)) { trans->tdr_state = TRA_unknown; return; } /*START_TRANSACTION*/ { { isc_start_transaction (isc_status, (FB_API_HANDLE*) &gds_trans, (short) 1, &DB, (short) 0, (char*) 0); }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } /*FOR(REQUEST_HANDLE request) TRA IN RDB$TRANSACTIONS WITH TRA.RDB$TRANSACTION_ID = trans->tdr_id*/ { if (!request) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &request, (short) sizeof(isc_12), (char*) isc_12); isc_13.isc_14 = trans->tdr_id; if (request) isc_start_and_send (isc_status, (FB_API_HANDLE*) &request, (FB_API_HANDLE*) &gds_trans, (short) 0, (short) 4, &isc_13, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &request, (short) 1, (short) 4, &isc_15, (short) 0); if (!isc_15.isc_16 || isc_status [1]) break; trans->tdr_state = /*TRA.RDB$TRANSACTION_STATE*/ isc_15.isc_17; /*END_FOR*/ } }; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } isc_release_request(gds_status, &request); if (gds_status[1]) { return_error(user_status); } /*ROLLBACK*/ { isc_rollback_transaction (isc_status, (FB_API_HANDLE*) &gds_trans);; /*ON_ERROR*/ if (isc_status [1]) { return_error(user_status); /*END_ERROR;*/ } } }
void detectRuntimeODS() { struct isc_4_struct { short isc_5; /* isc_utility */ } isc_4; struct isc_1_struct { char isc_2 [32]; /* RDB$FIELD_NAME */ char isc_3 [32]; /* RDB$RELATION_NAME */ } isc_1; struct isc_9_struct { short isc_10; /* isc_utility */ } isc_9; struct isc_7_struct { char isc_8 [32]; /* RDB$RELATION_NAME */ } isc_7; struct isc_12_struct { short isc_13; /* isc_utility */ } isc_12; /************************************** * * d e t e c t R u n t i m e O D S * ************************************** * * Functional description * Find the ODS version number of the database. * Use system_flag to avoid any possibility of ambiguity (someone using the rdb$ prefix). * **************************************/ BurpGlobals* tdgbl = BurpGlobals::getSpecific(); tdgbl->runtimeODS = 0; // Detect very old server before IB4 just in case to exit gracefully. // select count(*) from rdb$relation_fields // where rdb$relation_name in ('RDB$RELATIONS', 'RDB$RELATION_FIELDS') // and rdb$field_name = 'RDB$SYSTEM_FLAG'; int count = 0; isc_req_handle req_handle = 0; /*FOR (REQUEST_HANDLE req_handle) RFR IN RDB$RELATION_FIELDS WITH (RFR.RDB$RELATION_NAME = 'RDB$RELATIONS' OR RFR.RDB$RELATION_NAME = 'RDB$RELATION_FIELDS') AND RFR.RDB$FIELD_NAME = 'RDB$SYSTEM_FLAG'*/ { if (!req_handle) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &req_handle, (short) sizeof(isc_11), (char*) isc_11); if (req_handle) isc_start_request (isc_status, (FB_API_HANDLE*) &req_handle, (FB_API_HANDLE*) &gds_trans, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &req_handle, (short) 0, (short) 2, &isc_12, (short) 0); if (!isc_12.isc_13 || isc_status [1]) break; ++count; /*END_FOR;*/ } }; /*ON_ERROR*/ if (isc_status [1]) { general_on_error(); /*END_ERROR;*/ } } MISC_release_request_silent(req_handle); if (count != 2) return; isc_req_handle req_handle2 = 0; for (const rel_field_t* rel = relations; rel->relation; ++rel) { /*FOR (REQUEST_HANDLE req_handle2) FIRST 1 X IN RDB$RELATIONS WITH X.RDB$RELATION_NAME = rel->relation AND X.RDB$SYSTEM_FLAG = 1*/ { if (!req_handle2) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &req_handle2, (short) sizeof(isc_6), (char*) isc_6); isc_vtov ((const char*) rel->relation, (char*) isc_7.isc_8, 32); if (req_handle2) isc_start_and_send (isc_status, (FB_API_HANDLE*) &req_handle2, (FB_API_HANDLE*) &gds_trans, (short) 0, (short) 32, &isc_7, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &req_handle2, (short) 1, (short) 2, &isc_9, (short) 0); if (!isc_9.isc_10 || isc_status [1]) break; if (tdgbl->runtimeODS < rel->ods_version) tdgbl->runtimeODS = rel->ods_version; /*END_FOR;*/ } }; /*ON_ERROR*/ if (isc_status [1]) { general_on_error(); /*END_ERROR;*/ } } } MISC_release_request_silent(req_handle2); if (tdgbl->runtimeODS < DB_VERSION_DDL8) return; isc_req_handle req_handle3 = 0; for (const rel_field_t* rf = rel_fields; rf->relation; ++rf) { /*FOR (REQUEST_HANDLE req_handle3) FIRST 1 X2 IN RDB$RELATION_FIELDS WITH X2.RDB$RELATION_NAME = rf->relation AND X2.RDB$FIELD_NAME = rf->field AND X2.RDB$SYSTEM_FLAG = 1*/ { if (!req_handle3) isc_compile_request (isc_status, (FB_API_HANDLE*) &DB, (FB_API_HANDLE*) &req_handle3, (short) sizeof(isc_0), (char*) isc_0); isc_vtov ((const char*) rf->field, (char*) isc_1.isc_2, 32); isc_vtov ((const char*) rf->relation, (char*) isc_1.isc_3, 32); if (req_handle3) isc_start_and_send (isc_status, (FB_API_HANDLE*) &req_handle3, (FB_API_HANDLE*) &gds_trans, (short) 0, (short) 64, &isc_1, (short) 0); if (!isc_status [1]) { while (1) { isc_receive (isc_status, (FB_API_HANDLE*) &req_handle3, (short) 1, (short) 2, &isc_4, (short) 0); if (!isc_4.isc_5 || isc_status [1]) break; if (tdgbl->runtimeODS < rf->ods_version) tdgbl->runtimeODS = rf->ods_version; /*END_FOR;*/ } }; /*ON_ERROR*/ if (isc_status [1]) { general_on_error(); /*END_ERROR;*/ } } } MISC_release_request_silent(req_handle3); }