139 lines
4.7 KiB
C
139 lines
4.7 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2010 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_stat.h"
|
|
#include "gtm_string.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsblk.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "iosp.h"
|
|
#include "jnl.h"
|
|
#include "mupip_set.h"
|
|
#include "cli.h"
|
|
#include "util.h"
|
|
#include "gtmmsg.h"
|
|
|
|
GBLREF gd_region *gv_cur_region;
|
|
GBLREF char *jnl_state_lit[];
|
|
GBLREF char *repl_state_lit[];
|
|
|
|
uint4 mupip_set_journal_newstate(set_jnl_options *jnl_options, jnl_create_info *jnl_info, mu_set_rlist *rptr)
|
|
{
|
|
enum jnl_state_codes jnl_curr_state;
|
|
enum repl_state_codes repl_curr_state;
|
|
boolean_t current_image;
|
|
enum db_acc_method acc_meth;
|
|
|
|
error_def(ERR_REPLNOBEFORE);
|
|
error_def(ERR_REPLJNLCNFLCT);
|
|
error_def(ERR_JNLDISABLE);
|
|
error_def(ERR_MMBEFOREJNL);
|
|
error_def(ERR_MMNOBFORRPL);
|
|
|
|
jnl_curr_state = (enum jnl_state_codes)rptr->sd->jnl_state;
|
|
repl_curr_state = (enum repl_state_codes)rptr->sd->repl_state;
|
|
acc_meth = rptr->sd->acc_meth;
|
|
current_image = rptr->sd->jnl_before_image;
|
|
if (CLI_ABSENT == jnl_options->cli_journal)
|
|
rptr->jnl_new_state = jnl_curr_state;
|
|
else if ((CLI_NEGATED == jnl_options->cli_journal) || (CLI_NEGATED == jnl_options->cli_enable))
|
|
rptr->jnl_new_state = jnl_notallowed; /* DISABLE specified */
|
|
else if ((jnl_notallowed != jnl_curr_state) || (CLI_PRESENT == jnl_options->cli_enable))
|
|
{ /* journaling is already ENABLED or ENABLE is explicitly specified */
|
|
if (CLI_NEGATED == jnl_options->cli_on) /* OFF specified */
|
|
rptr->jnl_new_state = jnl_closed;
|
|
else if (repl_curr_state == repl_was_open && CLI_PRESENT != jnl_options->cli_replic_on)
|
|
{ /* Journaling was turned OFF by jnl_file_lost(). Do not allow turning journaling ON without also
|
|
turning replication ON */
|
|
gtm_putmsg(VARLSTCNT(10) ERR_REPLJNLCNFLCT, 8, LEN_AND_STR(jnl_state_lit[jnl_open]),
|
|
DB_LEN_STR(gv_cur_region), LEN_AND_STR(repl_state_lit[repl_closed]),
|
|
LEN_AND_STR(jnl_state_lit[jnl_open]));
|
|
return EXIT_WRN;
|
|
}
|
|
else /* ON explicitly specified or present by default */
|
|
rptr->jnl_new_state = jnl_open;
|
|
} else /* jnl_notallowed == jnl_curr_state && CLI_ABSENT == jnl_options->cli_enable */
|
|
{
|
|
if (CLI_PRESENT != jnl_options->cli_replic_on)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(4) ERR_JNLDISABLE, 2, DB_LEN_STR(gv_cur_region));
|
|
return EXIT_WRN;
|
|
} else
|
|
rptr->jnl_new_state = jnl_open; /* turn journaling on for REPLICATION=ON */
|
|
}
|
|
VMS_ONLY(rptr->before_images = (jnl_options->image_type_specified ? jnl_info->before_images : current_image);)
|
|
UNIX_ONLY( /* If turning replic ON, don't set BEFORE images with MM -- leave it unchanged */
|
|
rptr->before_images = (jnl_options->image_type_specified
|
|
? jnl_info->before_images
|
|
: (((CLI_PRESENT == jnl_options->cli_replic_on) && (repl_open != repl_curr_state)
|
|
&& (dba_bg == acc_meth))
|
|
? TRUE
|
|
: current_image));
|
|
)
|
|
if (rptr->before_images && (dba_mm == acc_meth))
|
|
{
|
|
gtm_putmsg(VARLSTCNT(4) ERR_MMBEFOREJNL, 2, DB_LEN_STR(gv_cur_region));
|
|
return EXIT_WRN;
|
|
}
|
|
if (CLI_PRESENT == jnl_options->cli_replic_on) /* replic="ON" */
|
|
{
|
|
assert((CLI_ABSENT == jnl_options->cli_journal)
|
|
|| (!((CLI_NEGATED == jnl_options->cli_enable) || (CLI_NEGATED == jnl_options->cli_on))
|
|
|| (jnl_open == rptr->jnl_new_state)));
|
|
rptr->repl_new_state = repl_open;
|
|
rptr->jnl_new_state = jnl_open;
|
|
VMS_ONLY(
|
|
assert((CLI_ABSENT == jnl_options->cli_journal)
|
|
|| (!jnl_options->image_type_specified || rptr->before_images));
|
|
if (dba_mm == acc_meth)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(4) ERR_MMNOBFORRPL, 2, DB_LEN_STR(gv_cur_region));
|
|
return EXIT_WRN;
|
|
}
|
|
rptr->before_images = TRUE;
|
|
)
|
|
} else if (CLI_NEGATED == jnl_options->cli_replic_on) /* replic="OFF" */
|
|
rptr->repl_new_state = repl_closed;
|
|
else
|
|
{
|
|
if (repl_open == repl_curr_state)
|
|
{
|
|
if (CLI_ABSENT != jnl_options->cli_journal)
|
|
{
|
|
VMS_ONLY(
|
|
if (jnl_options->image_type_specified && !rptr->before_images)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(4) ERR_REPLNOBEFORE, 2, DB_LEN_STR(gv_cur_region));
|
|
return EXIT_WRN;
|
|
}
|
|
)
|
|
if (jnl_open != rptr->jnl_new_state)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(10) ERR_REPLJNLCNFLCT, 8,
|
|
LEN_AND_LIT("OFF/DISABLED"),
|
|
DB_LEN_STR(gv_cur_region),
|
|
LEN_AND_STR(repl_state_lit[repl_open]),
|
|
LEN_AND_LIT("OFF/DISABLED"));
|
|
return EXIT_WRN;
|
|
}
|
|
}
|
|
}
|
|
rptr->repl_new_state = repl_curr_state;
|
|
}
|
|
return EXIT_NRM;
|
|
}
|