2012-02-05 11:35:58 -05:00
|
|
|
/****************************************************************
|
|
|
|
* *
|
2012-03-24 14:06:46 -04:00
|
|
|
* Copyright 2001, 2011 Fidelity Information Services, Inc *
|
2012-02-05 11:35:58 -05:00
|
|
|
* *
|
|
|
|
* 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 UPDPROC_INCLUDED
|
|
|
|
#define UPDPROC_INCLUDED
|
|
|
|
|
|
|
|
#define SKIP_REC 5
|
|
|
|
|
|
|
|
enum upd_bad_trans_type
|
|
|
|
{
|
|
|
|
upd_good_record = 0,
|
|
|
|
upd_bad_forwptr,
|
|
|
|
upd_bad_backptr,
|
|
|
|
upd_rec_not_replicated,
|
|
|
|
upd_bad_jnl_seqno,
|
|
|
|
upd_bad_mname_size,
|
|
|
|
upd_bad_key_size,
|
|
|
|
upd_bad_val_size,
|
|
|
|
upd_fence_bad_t_num,
|
|
|
|
upd_nofence_bad_tupd_num,
|
2012-03-24 14:06:46 -04:00
|
|
|
upd_bad_histinfo_len,
|
|
|
|
upd_bad_histinfo_start_seqno1,
|
|
|
|
upd_bad_histinfo_start_seqno2,
|
2012-02-05 11:35:58 -05:00
|
|
|
upd_fence_bad_ztworm_t_num,
|
|
|
|
upd_bad_key
|
|
|
|
};
|
|
|
|
|
|
|
|
#define UPD_GV_BIND_NAME(GD_HEADER, MNAME) GV_BIND_NAME_AND_ROOT_SEARCH(GD_HEADER, &MNAME)
|
|
|
|
|
|
|
|
#ifdef GTM_TRIGGER
|
|
|
|
#define UPD_GV_BIND_NAME_APPROPRIATE(GD_HEADER, MNAME, KEY, KEYLEN) \
|
|
|
|
{ \
|
|
|
|
char *tr_ptr; \
|
|
|
|
gv_namehead *hasht_tree; \
|
|
|
|
mstr gbl_name; \
|
|
|
|
int tr_len; \
|
|
|
|
mname_entry gvent; \
|
|
|
|
GBLREF boolean_t dollar_ztrigger_invoked; \
|
|
|
|
\
|
|
|
|
if (IS_MNAME_HASHT_GBLNAME(MNAME)) \
|
|
|
|
{ /* gbl is ^#t. In this case, do special processing. Look at the first subscript and \
|
|
|
|
* bind to the region mapped to by that global name (not ^#t). \
|
|
|
|
*/ \
|
|
|
|
tr_ptr = KEY; /* Skip to the first subscript */ \
|
|
|
|
tr_len = STRLEN(KEY); /* Only want length to first 0, not entire length */ \
|
|
|
|
assert(tr_len < KEYLEN); /* If ^#t, there has to be a subscript */ \
|
|
|
|
tr_ptr += tr_len; \
|
|
|
|
assert((KEY_DELIMITER == *tr_ptr) && ((char)STR_SUB_PREFIX == *(tr_ptr + 1))); \
|
|
|
|
tr_ptr += 2; /* Skip the 0x00 and 0xFF */ \
|
|
|
|
assert((HASHT_GBL_CHAR1 == *tr_ptr) || ('%' == *tr_ptr) || (ISALPHA_ASCII(*tr_ptr))); \
|
|
|
|
if (HASHT_GBL_CHAR1 != *tr_ptr) \
|
|
|
|
{ \
|
|
|
|
gbl_name.addr = tr_ptr; \
|
|
|
|
gbl_name.len = STRLEN(tr_ptr); \
|
|
|
|
GV_BIND_NAME_ONLY(GD_HEADER, &gbl_name); \
|
|
|
|
csa = cs_addrs; \
|
|
|
|
SETUP_TRIGGER_GLOBAL; \
|
|
|
|
gv_target = hasht_tree; \
|
|
|
|
if (!dollar_ztrigger_invoked) \
|
|
|
|
dollar_ztrigger_invoked = TRUE; \
|
|
|
|
csa->incr_db_trigger_cycle = TRUE; \
|
|
|
|
csa->db_dztrigger_cycle++; \
|
|
|
|
} else \
|
|
|
|
{ \
|
|
|
|
SWITCH_TO_DEFAULT_REGION; \
|
|
|
|
} \
|
|
|
|
INITIAL_HASHT_ROOT_SEARCH_IF_NEEDED; \
|
|
|
|
} else \
|
|
|
|
UPD_GV_BIND_NAME(GD_HEADER, MNAME); \
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#define UPD_GV_BIND_NAME_APPROPRIATE(GD_HEADER, MNAME, KEY, KEYLEN) UPD_GV_BIND_NAME(GD_HEADER, MNAME)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int updproc(void);
|
|
|
|
void updproc_actions(gld_dbname_list *gld_db_files);
|
|
|
|
int updproc_init(gld_dbname_list **gld_db_files , seq_num *start_jnl_seqno);
|
|
|
|
int upd_log_init(recvpool_user);
|
|
|
|
boolean_t updproc_open_files(gld_dbname_list **gld_db_files, seq_num *start_jnl_seqno);
|
|
|
|
void updproc_stop(boolean_t exit);
|
|
|
|
void updproc_sigstop(void);
|
|
|
|
void updproc_end(void);
|
|
|
|
void updhelper_init(recvpool_user);
|
|
|
|
int updhelper_reader(void);
|
|
|
|
boolean_t updproc_preread(void);
|
|
|
|
void updhelper_reader_end(void);
|
|
|
|
void updhelper_reader_sigstop(void);
|
|
|
|
int updhelper_writer(void);
|
|
|
|
void updhelper_writer_end(void);
|
|
|
|
void updhelper_writer_sigstop(void);
|
|
|
|
|
|
|
|
#endif /* UPDPROC_INCLUDED */
|