fis-gtm/sr_port/jfh_from_jnl_info.c

101 lines
3.8 KiB
C

/****************************************************************
* *
* Copyright 2003, 2011 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gtm_time.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "jnl.h"
#ifdef GTM_CRYPT
#include "gtmcrypt.h"
#endif
GBLREF jnl_process_vector *prc_vec;
GBLREF jnl_gbls_t jgbl;
#ifdef UNIX
GBLREF int4 strm_index;
#endif
void jfh_from_jnl_info(jnl_create_info *info, jnl_file_header *header)
{
int idx;
trans_num db_tn;
/**** We will write journal file header, epoch and eof in order ****/
/* Write the file header */
memset((char *)header, 0, JNL_HDR_LEN); /* note: In Unix, this means we 0-fill 2K REAL_JNL_HDR_LEN + 62K padding */
memcpy(header->label, JNL_LABEL_TEXT, STR_LIT_LEN(JNL_LABEL_TEXT));
header->is_little_endian = GTM_IS_LITTLE_ENDIAN;
assert(NULL != prc_vec);
JNL_WHOLE_FROM_SHORT_TIME(prc_vec->jpv_time, jgbl.gbl_jrec_time);
memcpy(&header->who_created, (unsigned char*)prc_vec, SIZEOF(jnl_process_vector));
memcpy(&header->who_opened, (unsigned char*)prc_vec, SIZEOF(jnl_process_vector));
/* EPOCHs are written unconditionally in Unix while they are written only for BEFORE_IMAGE in VMS */
if (JNL_HAS_EPOCH(info))
header->end_of_data = JNL_HDR_LEN + PINI_RECLEN + EPOCH_RECLEN + PFIN_RECLEN;
else
header->end_of_data = JNL_HDR_LEN + PINI_RECLEN + PFIN_RECLEN;
header->max_jrec_len = info->max_jrec_len;
header->bov_timestamp = jgbl.gbl_jrec_time;
header->eov_timestamp = jgbl.gbl_jrec_time;
db_tn = info->csd->trans_hist.curr_tn;
header->bov_tn = db_tn;
header->eov_tn = db_tn;
header->before_images = info->before_images;
/* Note that in case of MUPIP JOURNAL -ROLLBACK, we need to set header->repl_state to repl_open although replication
* is currently not ON in the database. This is so future ROLLBACKs know this journal is replication enabled.
*/
header->repl_state = jgbl.mur_rollback ? repl_open : info->repl_state;
header->data_file_name_length = info->fn_len;
memcpy(header->data_file_name, info->fn, info->fn_len);
header->data_file_name[info->fn_len] = '\0';
header->alignsize = info->alignsize;
header->autoswitchlimit = info->autoswitchlimit;
header->epoch_interval = info->epoch_interval;
header->start_seqno = info->reg_seqno;
header->end_seqno = info->reg_seqno;
header->prev_jnl_file_name_length = info->prev_jnl_len; ;
memcpy(header->prev_jnl_file_name, info->prev_jnl, info->prev_jnl_len);
header->prev_jnl_file_name[info->prev_jnl_len] = '\0';
assert(JNL_ALLOC_MIN <= info->alloc);
header->jnl_alq = info->alloc;
header->virtual_size = info->alloc;
header->jnl_deq = info->extend;
header->checksum = info->checksum;
GTMCRYPT_ONLY(
GTMCRYPT_COPY_HASH(info, header);
)
# ifdef UNIX
if (INVALID_SUPPL_STRM != strm_index)
{
assert(MAX_SUPPL_STRMS == ARRAYSIZE(header->strm_start_seqno));
for (idx = 0; idx < MAX_SUPPL_STRMS; idx++)
header->strm_start_seqno[idx] = info->csd->strm_reg_seqno[idx];
if (jgbl.forw_phase_recovery)
{ /* If MUPIP JOURNAL -ROLLBACK, might need to do additional processing. See macro definition for comments */
MUR_ADJUST_STRM_REG_SEQNO_IF_NEEDED(info->csd, header->strm_start_seqno);
}
for (idx = 0; idx < MAX_SUPPL_STRMS; idx++)
header->strm_end_seqno[idx] = header->strm_start_seqno[idx];
} else
{
memset(&header->strm_start_seqno[0], 0, SIZEOF(header->strm_start_seqno));
memset(&header->strm_end_seqno[0], 0, SIZEOF(header->strm_end_seqno));
}
# endif
}