169 lines
5.5 KiB
C
169 lines
5.5 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2006, 2009 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_stdio.h"
|
|
|
|
#include "cli.h"
|
|
#include "util.h"
|
|
#include "repl_instance.h"
|
|
#include "gdsroot.h"
|
|
#include "gdsbt.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h" /* for JNL_WHOLE_FROM_SHORT_TIME */
|
|
#include "buddy_list.h" /* needed for muprec.h */
|
|
#include "hashtab_int4.h" /* needed for muprec.h */
|
|
#include "hashtab_int8.h" /* needed for muprec.h */
|
|
#include "hashtab_mname.h" /* needed for muprec.h */
|
|
#include "muprec.h"
|
|
#include "repl_msg.h"
|
|
#include "gtmsource.h"
|
|
#include "repl_inst_dump.h"
|
|
|
|
GBLREF boolean_t in_repl_inst_edit; /* used by an assert in repl_inst_read/repl_inst_write */
|
|
GBLREF boolean_t print_offset; /* set to TRUE if -DETAIL is specified */
|
|
GBLREF uint4 section_offset; /* Used by PRINT_OFFSET_PREFIX macro in repl_inst_dump.c */
|
|
|
|
void mupcli_get_offset_size_value(uint4 *offset, uint4 *size, gtm_uint64_t *value, boolean_t *value_present)
|
|
{
|
|
error_def(ERR_MUPCLIERR);
|
|
error_def(ERR_SIZENOTVALID8);
|
|
|
|
if (!cli_get_hex("OFFSET", offset))
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
if (!cli_get_hex("SIZE", size))
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
if (!((SIZEOF(char) == *size) || (SIZEOF(short) == *size) || (SIZEOF(int4) == *size) || (SIZEOF(gtm_int64_t) == *size)))
|
|
rts_error(VARLSTCNT(1) ERR_SIZENOTVALID8);
|
|
if (0 > (int4)*size)
|
|
{
|
|
util_out_print("Error: SIZE specified cannot be negative", TRUE);
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
}
|
|
if (0 != (*offset % *size))
|
|
{
|
|
util_out_print("Error: OFFSET [0x!XL] should be a multiple of Size [!UL]", TRUE, *offset, *size);
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
}
|
|
if (CLI_PRESENT == cli_present("VALUE"))
|
|
{
|
|
*value_present = TRUE;
|
|
if (!cli_get_hex64("VALUE", value))
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
} else
|
|
*value_present = FALSE;
|
|
}
|
|
|
|
void mupcli_edit_offset_size_value(sm_uc_ptr_t buff, uint4 offset, uint4 size, gtm_uint64_t value, boolean_t value_present)
|
|
{
|
|
char temp_str[256], temp_str1[256];
|
|
gtm_uint64_t old_value;
|
|
|
|
memset(temp_str, 0, 256);
|
|
memset(temp_str1, 0, 256);
|
|
if (SIZEOF(char) == size)
|
|
{
|
|
SPRINTF(temp_str, "!UB [0x!XB]");
|
|
old_value = *(sm_uc_ptr_t)buff;
|
|
}
|
|
else if (SIZEOF(short) == size)
|
|
{
|
|
SPRINTF(temp_str, "!UW [0x!XW]");
|
|
old_value = *(sm_ushort_ptr_t)buff;
|
|
}
|
|
else if (SIZEOF(int4) == size)
|
|
{
|
|
SPRINTF(temp_str, "!UL [0x!XL]");
|
|
old_value = *(sm_uint_ptr_t)buff;
|
|
}
|
|
else if (SIZEOF(gtm_int64_t) == size)
|
|
{
|
|
SPRINTF(temp_str, "!@UQ [0x!@XQ]");
|
|
old_value = *(qw_num_ptr_t)buff;
|
|
}
|
|
if (value_present)
|
|
{
|
|
if (SIZEOF(char) == size)
|
|
*(sm_uc_ptr_t)buff = (unsigned char)value;
|
|
else if (SIZEOF(short) == size)
|
|
*(sm_ushort_ptr_t)buff = (unsigned short)value;
|
|
else if (SIZEOF(int4) == size)
|
|
*(sm_uint_ptr_t)buff = (unsigned int)value;
|
|
else if (SIZEOF(gtm_int64_t) == size)
|
|
*(qw_num_ptr_t)buff = value;
|
|
} else
|
|
value = old_value;
|
|
SPRINTF(temp_str1, "Offset !UL [0x!XL] : Old Value = %s : New Value = %s : Size = !UB [0x!XB]",
|
|
temp_str, temp_str);
|
|
if (SIZEOF(int4) >= size)
|
|
util_out_print(temp_str1, TRUE, offset, offset, (uint4)old_value, (uint4)old_value,
|
|
(uint4)value, (uint4)value, size, size);
|
|
else
|
|
util_out_print(temp_str1, TRUE, offset, offset, &old_value, &old_value,
|
|
&value, &value, size, size);
|
|
}
|
|
|
|
/* Description:
|
|
* Edits or displays the contents of a replication instance file.
|
|
* Parameters:
|
|
None
|
|
* Return Value:
|
|
None
|
|
*/
|
|
void repl_inst_edit(void)
|
|
{
|
|
unsigned short inst_fn_len;
|
|
char inst_fn[MAX_FN_LEN + 1], buff_unaligned[REPL_INST_HDR_SIZE + GTMSRC_LCL_SIZE + 8];
|
|
char *buff;
|
|
repl_inst_hdr_ptr_t repl_instance;
|
|
gtmsrc_lcl_ptr_t gtmsrclcl_ptr;
|
|
uint4 offset, size;
|
|
gtm_uint64_t value;
|
|
boolean_t value_present;
|
|
|
|
error_def(ERR_MUPCLIERR);
|
|
|
|
in_repl_inst_edit = TRUE;
|
|
inst_fn_len = MAX_FN_LEN;
|
|
if (!cli_get_str("INSTFILE", inst_fn, &inst_fn_len) || (0 == inst_fn_len))
|
|
rts_error(VARLSTCNT(1) ERR_MUPCLIERR);
|
|
inst_fn[inst_fn_len] = '\0';
|
|
buff = &buff_unaligned[0];
|
|
buff = (char *)ROUND_UP2((INTPTR_T)buff, 8);
|
|
if (CLI_PRESENT == cli_present("SHOW"))
|
|
{
|
|
print_offset = (CLI_PRESENT == cli_present("DETAIL"));
|
|
repl_inst_read(inst_fn, (off_t)0, (sm_uc_ptr_t)buff, REPL_INST_HDR_SIZE + GTMSRC_LCL_SIZE);
|
|
util_out_print("GTM-I-MUREPLSHOW, SHOW output for replication instance file !AD", TRUE, inst_fn_len, inst_fn);
|
|
repl_instance = (repl_inst_hdr_ptr_t)&buff[0];
|
|
section_offset = 0;
|
|
repl_inst_dump_filehdr(repl_instance);
|
|
section_offset = REPL_INST_HDR_SIZE;
|
|
repl_inst_dump_gtmsrclcl((gtmsrc_lcl_ptr_t)&buff[REPL_INST_HDR_SIZE]);
|
|
section_offset = REPL_INST_TRIPLE_OFFSET;
|
|
repl_inst_dump_triplehist(inst_fn, repl_instance->num_triples);
|
|
}
|
|
if (CLI_PRESENT == cli_present("CHANGE"))
|
|
{
|
|
mupcli_get_offset_size_value(&offset, &size, &value, &value_present);
|
|
assert(size <= REPL_INST_HDR_SIZE + GTMSRC_LCL_SIZE);
|
|
repl_inst_read(inst_fn, (off_t)offset, (sm_uc_ptr_t)buff, size);
|
|
mupcli_edit_offset_size_value((sm_uc_ptr_t)buff, offset, size, value, value_present);
|
|
repl_inst_write(inst_fn, (off_t)offset, (sm_uc_ptr_t)buff, size);
|
|
}
|
|
in_repl_inst_edit = FALSE;
|
|
}
|