2012-02-05 11:35:58 -05:00
|
|
|
/****************************************************************
|
|
|
|
* *
|
2012-03-24 14:06:46 -04:00
|
|
|
* Copyright 2003, 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. *
|
|
|
|
* *
|
|
|
|
****************************************************************/
|
|
|
|
|
|
|
|
#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;
|
2012-03-24 14:06:46 -04:00
|
|
|
#ifdef UNIX
|
|
|
|
GBLREF int4 strm_index;
|
|
|
|
#endif
|
2012-02-05 11:35:58 -05:00
|
|
|
|
2012-03-24 14:06:46 -04:00
|
|
|
void jfh_from_jnl_info(jnl_create_info *info, jnl_file_header *header)
|
2012-02-05 11:35:58 -05:00
|
|
|
{
|
2012-03-24 14:06:46 -04:00
|
|
|
int idx;
|
2012-02-05 11:35:58 -05:00
|
|
|
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);
|
|
|
|
)
|
2012-03-24 14:06:46 -04:00
|
|
|
# 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
|
2012-02-05 11:35:58 -05:00
|
|
|
}
|