fis-gtm/sr_port/mupip_set_jnlfile_aux.c

171 lines
5.9 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 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_fcntl.h"
#include "gtm_unistd.h"
#include <errno.h>
#include "gtm_stdio.h"
#include "gtm_string.h"
#include "gtm_strings.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsblk.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "cli.h"
#include "iosp.h"
#include "jnl.h"
#include "mupip_set.h"
#include "mupint.h"
#include "eintr_wrappers.h"
#include "util.h"
#include "mu_rndwn_file.h"
#include "gtm_file_stat.h"
#include "mu_gv_cur_reg_init.h"
#include "gtmmsg.h"
GBLREF gd_region *gv_cur_region;
GBLREF boolean_t need_no_standalone;
error_def(ERR_FILEEXISTS);
error_def(ERR_FILEPARSE);
error_def(ERR_JNLFILNOTCHG);
error_def(ERR_JNLFNF);
error_def(ERR_MUSTANDALONE);
error_def(ERR_PREVJNLLINKSET);
uint4 mupip_set_jnlfile_aux(jnl_file_header *header, char *jnl_fname)
{
unsigned short buf_len;
unsigned int full_buf_len, prev_buf_len, jnl_fn_len;
uint4 ustatus;
char buf[JNL_NAME_SIZE], full_buf[JNL_NAME_SIZE], prev_buf[JNL_NAME_SIZE];
char jnl_fn[JNL_NAME_SIZE];
mstr jnlfile, jnldef;
buf_len = SIZEOF(buf);
/* check for standalone */
need_no_standalone = cli_present("BYPASS");
if (!need_no_standalone)
{
mu_gv_cur_reg_init();
memcpy((char *)gv_cur_region->dyn.addr->fname, header->data_file_name, header->data_file_name_length);
gv_cur_region->dyn.addr->fname_len = header->data_file_name_length;
if (!STANDALONE(gv_cur_region))
{
gtm_putmsg(VARLSTCNT(4) ERR_MUSTANDALONE, 2, DB_LEN_STR(gv_cur_region));
return((uint4)ERR_JNLFILNOTCHG);
}
}
if (CLI_PRESENT == cli_present("PREVJNLFILE"))
{
if (!cli_get_str("PREVJNLFILE", buf, &buf_len))
{
util_out_print("Error : cannot get value for !AD",
TRUE, LEN_AND_LIT("PREVJNLFILE"));
return((uint4)ERR_JNLFILNOTCHG);
}
if (!get_full_path(STR_AND_LEN(buf), full_buf, &full_buf_len, SIZEOF(full_buf), &ustatus))
{
gtm_putmsg(VARLSTCNT(5) ERR_FILEPARSE, 2, LEN_AND_STR(buf), ustatus);
return((uint4)ERR_JNLFILNOTCHG);
}
if (!get_full_path(STR_AND_LEN(jnl_fname), jnl_fn, &jnl_fn_len, SIZEOF(jnl_fn), &ustatus))
{
gtm_putmsg(VARLSTCNT(5) ERR_FILEPARSE, 2, LEN_AND_STR(jnl_fname), ustatus);
return((uint4)ERR_JNLFILNOTCHG);
}
jnlfile.addr = full_buf;
jnlfile.len = full_buf_len;
jnldef.addr = JNL_EXT_DEF;
jnldef.len = SIZEOF(JNL_EXT_DEF) - 1;
if (FILE_PRESENT != gtm_file_stat(&jnlfile, &jnldef, NULL, FALSE, &ustatus))
gtm_putmsg(VARLSTCNT(5) ERR_JNLFNF, 2, buf_len, buf, ustatus);
if (jnl_fn_len == full_buf_len && (0 == memcmp(jnl_fn, full_buf, jnl_fn_len)))
{
util_out_print("Error : PREVJNLFILE !AD cannot link to itself", TRUE, jnl_fn_len, jnl_fn);
return((uint4)ERR_JNLFILNOTCHG);
}
prev_buf_len = header->prev_jnl_file_name_length;
if (header->prev_jnl_file_name_length != 0)
memcpy(prev_buf, header->prev_jnl_file_name, prev_buf_len);
else
{
prev_buf_len = SIZEOF("NULL") - 1;
memcpy(prev_buf, "NULL", prev_buf_len);
}
header->prev_jnl_file_name_length = full_buf_len;
memcpy(header->prev_jnl_file_name, full_buf, full_buf_len);
gtm_putmsg(VARLSTCNT(6) ERR_PREVJNLLINKSET, 4, prev_buf_len, prev_buf, header->prev_jnl_file_name_length,
header->prev_jnl_file_name);
send_msg(VARLSTCNT(6) ERR_PREVJNLLINKSET, 4, prev_buf_len, prev_buf, header->prev_jnl_file_name_length,
header->prev_jnl_file_name);
} else if (CLI_NEGATED == cli_present("PREVJNLFILE"))
{
util_out_print("prev_jnl_file name changed from !AD to NULL", TRUE,
header->prev_jnl_file_name_length, header->prev_jnl_file_name);
memset(header->prev_jnl_file_name, 0, header->prev_jnl_file_name_length);
header->prev_jnl_file_name_length = (unsigned short)0;
}
if (CLI_PRESENT == cli_present("DBFILENAME"))
{
if (!cli_get_str("DBFILENAME", buf, &buf_len))
{
util_out_print("Error : cannot get value for !AD",
TRUE, LEN_AND_LIT("DBFILENAME"));
return((uint4)ERR_JNLFILNOTCHG);
}
if (!get_full_path(STR_AND_LEN(buf), full_buf, &full_buf_len, JNL_NAME_SIZE, &ustatus))
{
gtm_putmsg(VARLSTCNT(5) ERR_FILEPARSE, 2, LEN_AND_STR(buf), ustatus);
return((uint4)ERR_JNLFILNOTCHG);
}
if ((header->data_file_name_length == full_buf_len) &&
(memcmp(full_buf, header->data_file_name, header->data_file_name_length) == 0))
{
util_out_print("Current generation Database !AD can not be changed _ Use mupip set journal option", TRUE,
header->data_file_name_length, header->data_file_name);
return((uint4)ERR_JNLFILNOTCHG);
}
prev_buf_len = header->data_file_name_length;
memcpy(prev_buf, header->data_file_name, prev_buf_len);
memcpy(header->data_file_name, full_buf, full_buf_len);
header->data_file_name_length = full_buf_len;
header->data_file_name[full_buf_len] = '\0'; /* null terminate string just in case somebody cares */
util_out_print("data_file_name changed from !AD to !AD", TRUE,
prev_buf_len, prev_buf, header->data_file_name_length, header->data_file_name);
}
if (CLI_PRESENT == cli_present("REPL_STATE"))
{
if (!cli_get_str("REPL_STATE", buf, &buf_len))
{
util_out_print("Error : cannot get value for qualifier REPL_STATE", TRUE);
return((uint4)ERR_JNLFILNOTCHG);
}
if (0 == STRCASECMP("ON", buf))
header->repl_state = repl_open;
else if (0 == STRCASECMP("OFF", buf))
header->repl_state = repl_closed;
else
{
util_out_print("Need either ON or OFF as REPL_STATE values.", TRUE);
return((uint4)ERR_JNLFILNOTCHG);
}
util_out_print("repl state changed to !AD", TRUE, buf_len, buf);
}
return SS_NORMAL;
}