fis-gtm/sr_port/mupip_set_journal_parse.c

207 lines
6.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2008 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"
#if defined(VMS)
#include <climsgdef.h>
#include <math.h> /* needed for handling of epoch_interval (EPOCH_SECOND2SECOND macro uses ceil) */
#endif
#include "gtm_string.h" /* for memcpy() */
#include "gdsroot.h"
#include "gtm_stat.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 "cli.h"
#include "util.h"
#include "gtmmsg.h"
error_def(ERR_BFRQUALREQ);
error_def(ERR_FILEPARSE);
error_def(ERR_JNLALIGNSZCHG);
error_def(ERR_JNLBUFFTOOLG);
error_def(ERR_JNLINVALLOC);
error_def(ERR_JNLINVEXT);
error_def(ERR_JNLINVSWITCHLMT);
error_def(ERR_JNLMINALIGN);
#define get_cli_val(cli_val, positive_opt, negate_opt) \
{ \
cli_status1 = cli_present(positive_opt); \
cli_status2 = cli_present(negate_opt); \
assert(!(CLI_PRESENT == cli_status1 && CLI_PRESENT == cli_status2)); \
assert(!(CLI_NEGATED == cli_status1 && CLI_NEGATED == cli_status2)); \
if (CLI_PRESENT == cli_status1) \
cli_val = CLI_PRESENT; \
else if (CLI_PRESENT == cli_status2) \
cli_val = CLI_NEGATED; \
else \
cli_val = CLI_ABSENT; \
}
boolean_t mupip_set_journal_parse(set_jnl_options *jnl_options, jnl_create_info *jnl_info)
{
uint4 status, bits_of_alignsize = 0;
unsigned short temp_jnl_fn_len;
int4 alignsize;
int cli_status1, cli_status2;
/* Parsing for Journal/Replication state change */
cli_status1 = cli_present("JOURNAL");
jnl_options->cli_journal = (CLI_PRESENT != cli_status1 && CLI_NEGATED != cli_status1) ? CLI_ABSENT: cli_status1;
get_cli_val(jnl_options->cli_enable, "JOURNAL.ENABLE", "JOURNAL.DISABLE");
get_cli_val(jnl_options->cli_on, "JOURNAL.ON", "JOURNAL.OFF");
get_cli_val(jnl_options->cli_replic_on, "REPLICATION.ON", "REPLICATION.OFF");
if (CLI_PRESENT == (cli_status1 = cli_present("JOURNAL.BEFORE_IMAGES")))
{
jnl_options->image_type_specified = TRUE;
jnl_info->before_images = TRUE;
} else if (CLI_NEGATED == cli_status1)
{
VMS_ONLY(assert(CLI_PRESENT != jnl_options->cli_replic_on);)
jnl_options->image_type_specified = TRUE;
jnl_info->before_images = FALSE;
} else
{
jnl_options->image_type_specified = FALSE;
assert(!(CLI_PRESENT == jnl_options->cli_on ||
((CLI_PRESENT == jnl_options->cli_enable) && (CLI_ABSENT == jnl_options->cli_on))));
}
assert(JNL_ALLOC_MIN > DIVIDE_ROUND_UP(JNL_FILE_FIRST_RECORD, DISK_BLOCK_SIZE));
/* Parsing for other journal characteristics given in "JOURNAL" option */
if (jnl_options->allocation_specified = (CLI_PRESENT == cli_present("JOURNAL.ALLOCATION")))
{
if (!cli_get_int("JOURNAL.ALLOCATION", &jnl_info->alloc))
return FALSE;
if ((jnl_info->alloc < JNL_ALLOC_MIN) || (jnl_info->alloc > JNL_ALLOC_MAX))
{
gtm_putmsg(VARLSTCNT(5) ERR_JNLINVALLOC, 3, jnl_info->alloc, JNL_ALLOC_MIN, JNL_ALLOC_MAX);
return FALSE;
}
}
if (jnl_options->alignsize_specified = (CLI_PRESENT == cli_present("ALIGNSIZE")))
{
if (!cli_get_int("ALIGNSIZE", &alignsize))
return FALSE;
if (alignsize < JNL_MIN_ALIGNSIZE)
{
gtm_putmsg(VARLSTCNT(4) ERR_JNLMINALIGN, 2, alignsize, JNL_MIN_ALIGNSIZE);
return FALSE;
}
if (alignsize > JNL_MAX_ALIGNSIZE)
{
util_out_print("ALIGNSIZE cannot be greater than !UL", TRUE, JNL_MAX_ALIGNSIZE);
return FALSE;
}
LOG2_OF_INTEGER(alignsize, bits_of_alignsize);
if ((1 << bits_of_alignsize) != alignsize)
{
alignsize = 1 << bits_of_alignsize; /* This will make alignsize power of two */
gtm_putmsg(VARLSTCNT(3) ERR_JNLALIGNSZCHG, 1, alignsize);
}
jnl_info->alignsize = alignsize * DISK_BLOCK_SIZE;
}
if (jnl_options->autoswitchlimit_specified = (CLI_PRESENT == cli_present("AUTOSWITCHLIMIT")))
{
if (!cli_get_int("AUTOSWITCHLIMIT", &jnl_info->autoswitchlimit))
return FALSE;
if (JNL_AUTOSWITCHLIMIT_MIN > jnl_info->autoswitchlimit
|| JNL_ALLOC_MAX < jnl_info->autoswitchlimit)
{
gtm_putmsg(VARLSTCNT(5) ERR_JNLINVSWITCHLMT, 3, jnl_info->autoswitchlimit,
JNL_AUTOSWITCHLIMIT_MIN, JNL_ALLOC_MAX);
return FALSE;
}
}
if (jnl_options->buffer_size_specified = (CLI_PRESENT == cli_present("BUFFER_SIZE")))
{
if (!cli_get_int("BUFFER_SIZE", &jnl_info->buffer))
return FALSE;
if (jnl_info->buffer <= 0)
return FALSE;
if (jnl_info->buffer > JNL_BUFFER_MAX)
{
gtm_putmsg(VARLSTCNT(4) ERR_JNLBUFFTOOLG, 2, jnl_info->buffer, JNL_BUFFER_MAX);
return FALSE;
}
}
if (jnl_options->epoch_interval_specified = (CLI_PRESENT == cli_present("EPOCH_INTERVAL")))
{
if (!cli_get_int("EPOCH_INTERVAL", &jnl_info->epoch_interval))
return FALSE;
if (jnl_info->epoch_interval <= 0)
{
util_out_print("EPOCH_INTERVAL cannot be ZERO (or negative)", TRUE);
return FALSE;
}
if (jnl_info->epoch_interval > MAX_EPOCH_INTERVAL)
{
util_out_print("EPOCH_INTERVAL cannot be greater than !UL", TRUE, MAX_EPOCH_INTERVAL);
return FALSE;
}
jnl_info->epoch_interval = SECOND2EPOCH_SECOND(jnl_info->epoch_interval);
}
if (jnl_options->extension_specified = (CLI_PRESENT == cli_present("JOURNAL.EXTENSION")))
{
if (!cli_get_int("JOURNAL.EXTENSION", &jnl_info->extend))
return FALSE;
if (jnl_info->extend < 0)
{
util_out_print("EXTENSION_COUNT cannot be negative", TRUE);
return FALSE;
}
if (jnl_info->extend > JNL_EXTEND_MAX)
{
gtm_putmsg(VARLSTCNT(4) ERR_JNLINVEXT, 2, jnl_info->extend, JNL_EXTEND_MAX);
return FALSE;
}
}
temp_jnl_fn_len = jnl_info->jnl_len = MAX_FN_LEN + 1;
if (jnl_options->filename_specified = cli_get_str("FILENAME", (char *)jnl_info->jnl, &temp_jnl_fn_len))
jnl_info->jnl_len = temp_jnl_fn_len;
else
jnl_info->jnl_len = 0;
if ((CLI_PRESENT == (cli_status1 = cli_present(UNIX_ONLY("SYNC_IO") VMS_ONLY("CACHE")))) || (CLI_NEGATED == cli_status1))
{
jnl_options->sync_io_specified = TRUE;
jnl_options->sync_io = (UNIX_ONLY(CLI_PRESENT) VMS_ONLY(CLI_NEGATED) == cli_status1) ? TRUE: FALSE;
}
else
jnl_options->sync_io_specified = FALSE;
UNIX_ONLY(
if (jnl_options->yield_limit_specified = (CLI_PRESENT == cli_present("YIELD_LIMIT")))
{
if (!cli_get_int("YIELD_LIMIT", &jnl_options->yield_limit))
return FALSE;
if (jnl_options->yield_limit < MIN_YIELD_LIMIT)
{
util_out_print("YIELD_LIMIT cannot be less than !UL", TRUE, MIN_YIELD_LIMIT);
return FALSE;
}
if (jnl_options->yield_limit > MAX_YIELD_LIMIT)
{
util_out_print("YIELD_LIMIT cannot be greater than !UL", TRUE, MAX_YIELD_LIMIT);
return FALSE;
}
}
)
return TRUE;
}