/**************************************************************** * * * Copyright 2001, 2013 Fidelity Information Services, Inc * * * * This source code contains the intellectual property * * of its copyright holder(s), and is made available * * under a license. If you do not know the terms of * * the license, please stop and do not read further. * * * ****************************************************************/ #ifndef __DSE_H__ #define __DSE_H__ error_def(ERR_DSEWCREINIT); #define PATCH_SAVE_SIZE 128 #define DSE_DMP_TIME_FMT "DD-MON-YEAR 24:60:SS" #define SPAN_START_BYTE 0x02 #define SPAN_BYTE_MAX 255 #define SPAN_BYTE_MIN 1 #define GET_CURR_TIME_IN_DOLLARH_AND_ZDATE(dollarh_mval, dollarh_buffer, zdate_mval, zdate_buffer) \ { /* gets current time in the mval "dollarh_mval" in dollarh format and in the mval "zdate_mval" in ZDATE format \ * the ZDATE format string used is DSE_DMP_TIME_FMT \ * the dollarh_buffer and zdate_buffer are buffers which the corresponding mvals use to store the actual time string \ */ \ GBLREF mval dse_dmp_time_fmt; \ GBLREF spdesc stringpool; \ LITREF mval literal_null; \ \ op_horolog(&dollarh_mval); /* returns $H value in stringpool */ \ assert(SIZEOF(dollarh_buffer) >= dollarh_mval.str.len); \ /* if op_fnzdate (called below) calls stp_gcol, dollarh_mval might get corrupt because it is not known to stp_gcol. \ * To prevent problems, copy from stringpool to local buffer */ \ memcpy(dollarh_buffer, dollarh_mval.str.addr, dollarh_mval.str.len); \ dollarh_mval.str.addr = (char *)dollarh_buffer; \ stringpool.free -= dollarh_mval.str.len; /* now that we've made a copy, we don't need dollarh_mval in stringpool */ \ op_fnzdate(&dollarh_mval, &dse_dmp_time_fmt, (mval *)&literal_null, (mval *)&literal_null, &zdate_mval); \ /* op_fnzdate() returns zdate formatted string in stringpool */ \ assert(SIZEOF(zdate_buffer) >= zdate_mval.str.len); \ /* copy over stringpool string into local buffer to ensure zdate_mval will not get corrupt */ \ memcpy(zdate_buffer, zdate_mval.str.addr, zdate_mval.str.len); \ zdate_mval.str.addr = (char *)zdate_buffer; \ stringpool.free -= zdate_mval.str.len; /* now that we've made a copy, we don't need zdate_mval in stringpool anymore */ \ } typedef struct { block_id blk; char *bp; gd_region *region; char *comment; short int ver; } save_strct; enum dse_fmt { CLOSED_FMT = 0, GLO_FMT, ZWR_FMT, OPEN_FMT }; /* Grab crit for dse* functions taking into account -nocrit if specified */ #define DSE_GRAB_CRIT_AS_APPROPRIATE(WAS_CRIT, WAS_HOLD_ONTO_CRIT, NOCRIT_PRESENT, CS_ADDRS, GV_CUR_REGION) \ { \ if (!WAS_CRIT) \ { \ if (NOCRIT_PRESENT) \ CS_ADDRS->now_crit = TRUE; \ else \ grab_crit(GV_CUR_REGION); \ WAS_HOLD_ONTO_CRIT = CS_ADDRS->hold_onto_crit; \ CS_ADDRS->hold_onto_crit = TRUE; \ } \ } /* Rel crit for dse* functions taking into account -nocrit if specified */ #define DSE_REL_CRIT_AS_APPROPRIATE(WAS_CRIT, WAS_HOLD_ONTO_CRIT, NOCRIT_PRESENT, CS_ADDRS, GV_CUR_REGION) \ { \ if (!WAS_CRIT) \ { \ assert(CS_ADDRS->hold_onto_crit); \ assert((TRUE == WAS_HOLD_ONTO_CRIT) || (FALSE == WAS_HOLD_ONTO_CRIT)); \ CS_ADDRS->hold_onto_crit = WAS_HOLD_ONTO_CRIT; \ if (NOCRIT_PRESENT) \ CS_ADDRS->now_crit = FALSE; \ else \ rel_crit(GV_CUR_REGION); \ } \ } #ifdef UNIX # define GET_CONFIRM(X, Y) \ { \ PRINTF("CONFIRMATION: "); \ FGETS((X), (Y), stdin, fgets_res); \ Y = strlen(X); \ } #else # define GET_CONFIRM(X, Y) \ { \ if(!cli_get_str("CONFIRMATION",(X),&(Y))) \ { \ rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) ERR_DSEWCINITCON); \ return; \ } \ } #endif #define GET_CONFIRM_AND_HANDLE_NEG_RESPONSE \ { \ int len; \ char confirm[256]; \ \ len = SIZEOF(confirm); \ GET_CONFIRM(confirm, len); \ if (confirm[0] != 'Y' && confirm[0] != 'y') \ { \ rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) ERR_DSEWCINITCON); \ return; \ } \ } #define DSE_WCREINIT(CS_ADDRS) \ { \ assert(CS_ADDRS->now_crit); \ if (CS_ADDRS->hdr->acc_meth == dba_bg) \ bt_refresh(CS_ADDRS, TRUE); \ db_csh_ref(CS_ADDRS, TRUE); \ send_msg_csa(CSA_ARG(CS_ADDRS) VARLSTCNT(4) ERR_DSEWCREINIT, 2, DB_LEN_STR(gv_cur_region)); \ } void dse_ctrlc_setup(void); int dse_data(char *dst, int *len); int dse_getki(char *dst, int *len, char *qual, int qual_len); int dse_is_blk_in(sm_uc_ptr_t rp, sm_uc_ptr_t r_top, short size); int dse_ksrch(block_id srch, block_id_ptr_t pp, int4 *off, char *targ_key, int targ_len); int dse_key_srch(block_id srch, block_id_ptr_t pp, int4 *off, char *targ_key, int targ_len); int dse_order(block_id srch, block_id_ptr_t pp, int4 *op, char *targ_key, short int targ_len, bool dir_data_blk); void dse_rmsb(void); void dse_ctrlc_handler(int sig); void dse_exhaus(int4 pp, int4 op); void dse_m_rest(block_id blk, unsigned char *bml_list, int4 bml_size, sm_vuint_ptr_t blks_ptr, bool in_dir_tree); void dse_rmrec(void); void dse_find_roots(block_id index); boolean_t dse_fdmp(sm_uc_ptr_t data, int len); boolean_t dse_fdmp_output(void *addr, int4 len); void dse_adrec(void); void dse_adstar(void); void dse_all(void); boolean_t dse_b_dmp(void); void dse_cache(void); void dse_chng_bhead(void); void dse_chng_fhead(void); void dse_chng_rhead(void); void dse_crit(void); void dse_dmp(void); void dse_eval(void); void dse_f_blk(void); void dse_f_free(void); void dse_f_key(void); void dse_f_reg(void); void dse_flush(void); int parse_dlr_char(char *src, char *top, char *dlr_subsc); void dse_help(void); void dse_version(void); void dse_integ(void); bool dse_is_blk_free (block_id blk, sm_int_ptr_t cycle, cache_rec_ptr_ptr_t cr); int4 dse_lm_blk_free(int4 blk, sm_uc_ptr_t base_addr); void dse_maps(void); void dse_open (void); void dse_close(void); void dse_over(void); void dse_page(void); boolean_t dse_r_dmp(void); void dse_range(void); void dse_rest(void); void dse_save(void); void dse_shift(void); void dse_wcreinit (void); sm_uc_ptr_t dump_record(sm_uc_ptr_t rp, block_id blk, sm_uc_ptr_t bp, sm_uc_ptr_t b_top); void dse_dmp_fhead (void); void dse_ctrlc_handler(int sig); void dse_remove(void); #endif