2012-02-05 11:35:58 -05:00
|
|
|
/****************************************************************
|
|
|
|
* *
|
2012-03-24 14:06:46 -04:00
|
|
|
* Copyright 2002, 2012 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_stdio.h"
|
|
|
|
#include "gtm_string.h"
|
|
|
|
#include "cli.h"
|
|
|
|
#include "cli_parse.h"
|
|
|
|
#include "cli_disallow.h"
|
|
|
|
#include "mupip_cmd_disallow.h"
|
|
|
|
|
|
|
|
GBLREF char *cli_err_str_ptr;
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_backup(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = (d_c_cli_present("TRANSACTION") || d_c_cli_present("SINCE"))
|
|
|
|
&& !(d_c_cli_present("INCREMENTAL") || d_c_cli_present("BYTESTREAM"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("INCREMENTAL") || d_c_cli_present("BYTESTREAM"))
|
|
|
|
&& (d_c_cli_present("COMPREHENSIVE") || d_c_cli_present("DATABASE"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("TRANSACTION") && d_c_cli_present("SINCE");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("BKUPDBJNL.DISABLE") && d_c_cli_present("BKUPDBJNL.OFF");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("REPLICATION.OFF");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("REPLICATION.ON") && d_c_cli_negated("NEWJNLFILES"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_freeze(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = !d_c_cli_present("ON") && !d_c_cli_present("OFF");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("RECORD") && !d_c_cli_present("ON");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("OVERRIDE") && !d_c_cli_present("OFF");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("ON") && d_c_cli_present("OFF");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_integ(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = d_c_cli_present("BRIEF") && d_c_cli_present("FULL");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("FILE") && d_c_cli_present("REGION");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("TN_RESET") && (d_c_cli_present("FAST")
|
|
|
|
|| d_c_cli_present("BLOCK")
|
|
|
|
|| d_c_cli_present("SUBSCRIPT")
|
|
|
|
|| d_c_cli_present("REGION"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* -ONLINE and -FILE/-TN_RESET is incompatible as the former requires shared memory and the latter requires
|
|
|
|
* standalone access
|
|
|
|
*/
|
|
|
|
disallow_return_value = d_c_cli_present("ONLINE") && (d_c_cli_present("TN_RESET")
|
|
|
|
|| d_c_cli_present("FILE"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_journal(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = !(d_c_cli_present("RECOVER")
|
|
|
|
|| d_c_cli_present("VERIFY")
|
|
|
|
|| d_c_cli_present("SHOW")
|
|
|
|
|| d_c_cli_present("EXTRACT")
|
|
|
|
|| d_c_cli_present("ROLLBACK"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("RECOVER") && d_c_cli_present("ROLLBACK");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = !(d_c_cli_present("FORWARD") || d_c_cli_present("BACKWARD"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("FORWARD") && d_c_cli_present("BACKWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("SINCE") && d_c_cli_present("FORWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("LOOKBACK_LIMIT") && d_c_cli_present("FORWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("REDIRECT") && !d_c_cli_present("RECOVER");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("CHECKTN") && d_c_cli_present("BACKWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("RESYNC") && d_c_cli_present("FETCHRESYNC");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("RESYNC") || d_c_cli_present("FETCHRESYNC"))
|
|
|
|
&& !d_c_cli_present("ROLLBACK");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = d_c_cli_present("RSYNC_STRM") && !d_c_cli_present("RESYNC");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-02-05 11:35:58 -05:00
|
|
|
disallow_return_value = d_c_cli_present("LOSTTRANS") && !(d_c_cli_present("RECOVER")
|
|
|
|
|| d_c_cli_present("ROLLBACK")
|
|
|
|
|| d_c_cli_present("EXTRACT"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("BROKENTRANS") && !(d_c_cli_present("RECOVER")
|
|
|
|
|| d_c_cli_present("ROLLBACK")
|
|
|
|
|| d_c_cli_present("EXTRACT"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("FORWARD") && d_c_cli_present("ROLLBACK");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("FULL") && (d_c_cli_present("RECOVER") || d_c_cli_present("ROLLBACK"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("DETAIL") && !d_c_cli_present("EXTRACT");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("AFTER") && !d_c_cli_present("FORWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("AFTER") && (d_c_cli_present("RECOVER") || d_c_cli_present("ROLLBACK"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("SINCE") && !d_c_cli_present("BACKWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("LOOKBACK_LIMIT") && !d_c_cli_present("BACKWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("LOOKBACK_LIMIT") && !(d_c_cli_present("VERIFY")
|
|
|
|
|| d_c_cli_present("RECOVER")
|
|
|
|
|| d_c_cli_present("EXTRACT")
|
|
|
|
|| d_c_cli_present("SHOW"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("APPLY_AFTER_IMAGE") && !(d_c_cli_present("ROLLBACK")
|
|
|
|
|| d_c_cli_present("RECOVER"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("REDIRECT") && !d_c_cli_present("RECOVER");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("REDIRECT") && !d_c_cli_present("FORWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("BACKWARD") && d_c_cli_negated("CHAIN");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("CHECKTN") && d_c_cli_present("BACKWARD");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("ROLLBACK") && (d_c_cli_present("AFTER")
|
|
|
|
|| d_c_cli_present("BEFORE")
|
|
|
|
|| d_c_cli_present("SINCE")
|
|
|
|
|| d_c_cli_present("LOOKBACK_LIMIT"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("GLOBAL")
|
|
|
|
|| d_c_cli_present("USER")
|
|
|
|
|| d_c_cli_present("ID")
|
|
|
|
|| d_c_cli_present("TRANSACTION")) && (d_c_cli_present("RECOVER")
|
|
|
|
|| d_c_cli_present("ROLLBACK")
|
|
|
|
|| d_c_cli_present("VERIFY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = (d_c_cli_present("ONLINE") && !d_c_cli_present("ROLLBACK"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-02-05 11:35:58 -05:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_reorg(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = (d_c_cli_present("SELECT")
|
|
|
|
|| d_c_cli_present("EXCLUDE")
|
|
|
|
|| d_c_cli_present("FILL_FACTOR")
|
|
|
|
|| d_c_cli_present("INDEX_FILL_FACTOR")
|
|
|
|
|| d_c_cli_present("RESUME")
|
2012-03-24 14:06:46 -04:00
|
|
|
|| d_c_cli_present("USER_DEFINED_REORG")
|
|
|
|
|| d_c_cli_present("TRUNCATE")) && (d_c_cli_present("UPGRADE")
|
|
|
|
|| d_c_cli_present("DOWNGRADE"));
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = d_c_cli_present("UPGRADE") && d_c_cli_present("DOWNGRADE");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("UPGRADE") || d_c_cli_present("DOWNGRADE")) && !d_c_cli_present("REGION");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = (d_c_cli_present("SAFEJNL")
|
2012-02-05 11:35:58 -05:00
|
|
|
|| d_c_cli_negated("SAFEJNL")
|
|
|
|
|| d_c_cli_present("STARTBLK")
|
|
|
|
|| d_c_cli_present("STOPBLK")) && !(d_c_cli_present("UPGRADE")
|
|
|
|
|| d_c_cli_present("DOWNGRADE"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_replicate(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
boolean_t p1, p2, p3, p4, p5, p6;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
p1 = d_c_cli_present("EDITINSTANCE");
|
|
|
|
p2 = d_c_cli_present("INSTANCE_CREATE");
|
|
|
|
p3 = d_c_cli_present("RECEIVER");
|
|
|
|
p4 = d_c_cli_present("SOURCE");
|
|
|
|
p5 = d_c_cli_present("UPDATEPROC");
|
|
|
|
p6 = d_c_cli_present("UPDHELPER");
|
|
|
|
|
|
|
|
/* any MUPIP REPLIC command should contain at LEAST one of the above qualifiers */
|
|
|
|
disallow_return_value = !(p1 || p2 || p3 || p4 || p5 || p6);
|
|
|
|
CLI_DIS_CHECK; /* Note CLI_DIS_CHECK_N_RESET is not used as we want to reuse the computed error string (cli_err_str_ptr)
|
|
|
|
* for the next check as well in case it fails. Note that this can be done only if both checks use
|
|
|
|
* exactly the same set of qualifiers (which is TRUE in this case). */
|
|
|
|
|
|
|
|
/* any MUPIP REPLIC command should contain at MOST one of the above qualifiers */
|
|
|
|
disallow_return_value = cli_check_any2(VARLSTCNT(6) p1, p2, p3, p4, p5, p6);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_replic_editinst(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
|
2012-03-24 14:06:46 -04:00
|
|
|
/* any MUPIP REPLIC -EDITINSTANCE command should contain one of CHANGE or SHOW or NAME */
|
|
|
|
disallow_return_value = !(d_c_cli_present("CHANGE") || d_c_cli_present("SHOW") || d_c_cli_present("NAME"));
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* CHANGE and SHOW are mutually exclusive */
|
|
|
|
disallow_return_value = (d_c_cli_present("CHANGE") && d_c_cli_present("SHOW"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
/* CHANGE and NAME are mutually exclusive */
|
|
|
|
disallow_return_value = (d_c_cli_present("CHANGE") && d_c_cli_present("NAME"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* SHOW and NAME are mutually exclusive */
|
|
|
|
disallow_return_value = (d_c_cli_present("SHOW") && d_c_cli_present("NAME"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-02-05 11:35:58 -05:00
|
|
|
/* OFFSET, SIZE and VALUE is compatible only with CHANGE */
|
|
|
|
disallow_return_value = (!d_c_cli_present("CHANGE")
|
|
|
|
&& (d_c_cli_present("OFFSET") || d_c_cli_present("SIZE") || d_c_cli_present("VALUE")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* OFFSET and SIZE have to be present when CHANGE is specified */
|
|
|
|
disallow_return_value = (d_c_cli_present("CHANGE")
|
|
|
|
&& (!d_c_cli_present("OFFSET") || !d_c_cli_present("SIZE")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* DETAIL is compatible only with SHOW */
|
|
|
|
disallow_return_value = (!d_c_cli_present("SHOW") && d_c_cli_present("DETAIL"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_replic_receive(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
boolean_t p1, p2, p3, p4, p5, p6;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
|
|
|
|
p1 = d_c_cli_present("START");
|
|
|
|
p2 = d_c_cli_present("SHUTDOWN");
|
|
|
|
p3 = d_c_cli_present("CHECKHEALTH");
|
|
|
|
p4 = d_c_cli_present("STATSLOG");
|
|
|
|
p5 = d_c_cli_present("SHOWBACKLOG");
|
|
|
|
p6 = d_c_cli_present("CHANGELOG");
|
|
|
|
|
|
|
|
/* any MUPIP REPLIC -RECEIVE command should contain at LEAST one of the above qualifiers */
|
|
|
|
disallow_return_value = !(p1 || p2 || p3 || p4 || p5 || p6);
|
|
|
|
CLI_DIS_CHECK; /* Note CLI_DIS_CHECK_N_RESET is not used as we want to reuse the computed error string (cli_err_str_ptr)
|
|
|
|
* for the next check as well in case it fails. Note that this can be done only if both checks use
|
|
|
|
* exactly the same set of qualifiers (which is TRUE in this case). */
|
|
|
|
|
|
|
|
/* any MUPIP REPLIC -RECEIVE command should contain at MOST one of the above qualifiers */
|
|
|
|
disallow_return_value = cli_check_any2(VARLSTCNT(6) p1, p2, p3, p4, p5, p6);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
disallow_return_value = (d_c_cli_present("START")
|
|
|
|
&& !(d_c_cli_present("LISTENPORT") || d_c_cli_present("UPDATEONLY") || d_c_cli_present("HELPERS")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("START") && d_c_cli_present("LISTENPORT") && !d_c_cli_present("LOG"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = (!d_c_cli_present("START") && (d_c_cli_present("LISTENPORT")
|
|
|
|
|| d_c_cli_present("UPDATERESYNC")
|
|
|
|
|| d_c_cli_present("NORESYNC")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("UPDATERESYNC") && d_c_cli_present("NORESYNC"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = (!d_c_cli_present("UPDATERESYNC") && (d_c_cli_present("REUSE")
|
|
|
|
|| d_c_cli_present("RESUME")
|
|
|
|
|| d_c_cli_present("INITIALIZE")));
|
2012-03-24 14:06:46 -04:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = (d_c_cli_present("INITIALIZE") && d_c_cli_present("RESUME"));
|
2012-03-24 14:06:46 -04:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("REUSE") && d_c_cli_present("RESUME"));
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (!(d_c_cli_present("START") || d_c_cli_present("SHUTDOWN")) && d_c_cli_present("UPDATEONLY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (!(d_c_cli_present("START") || d_c_cli_present("SHUTDOWN") || d_c_cli_present("CHECKHEALTH"))
|
|
|
|
&& d_c_cli_present("HELPERS"));
|
|
|
|
disallow_return_value = (d_c_cli_present("LISTENPORT") && d_c_cli_present("UPDATEONLY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("UPDATEONLY") && d_c_cli_present("HELPERS"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("CHANGELOG") && !(d_c_cli_present("LOG") || d_c_cli_present("LOG_INTERVAL")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* BUFFSIZE, CMPSIZE or FILTER are supported only with START qualifier */
|
|
|
|
disallow_return_value = (!d_c_cli_present("START") && (d_c_cli_present("BUFFSIZE")
|
|
|
|
|| d_c_cli_present("CMPLVL")
|
|
|
|
|| d_c_cli_present("FILTER")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = (d_c_cli_present("AUTOROLLBACK") && !d_c_cli_present("LISTENPORT") && !d_c_cli_present("START"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2024-07-19 11:43:27 -04:00
|
|
|
/* LOG are not allowed with STATS qualifier */
|
|
|
|
disallow_return_value = (d_c_cli_present("STATSLOG") && d_c_cli_present("LOG"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-02-05 11:35:58 -05:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_replic_source(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
2024-07-19 11:43:27 -04:00
|
|
|
boolean_t p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13;
|
2012-02-05 11:35:58 -05:00
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
|
|
|
|
p1 = d_c_cli_present("START");
|
|
|
|
p2 = d_c_cli_present("SHUTDOWN");
|
|
|
|
p3 = d_c_cli_present("ACTIVATE");
|
|
|
|
p4 = d_c_cli_present("DEACTIVATE");
|
|
|
|
p5 = d_c_cli_present("CHECKHEALTH");
|
|
|
|
p6 = d_c_cli_present("STATSLOG");
|
|
|
|
p7 = d_c_cli_present("SHOWBACKLOG");
|
|
|
|
p8 = d_c_cli_present("CHANGELOG");
|
|
|
|
p9 = d_c_cli_present("STOPSOURCEFILTER");
|
|
|
|
p10 = d_c_cli_present("LOSTTNCOMPLETE");
|
|
|
|
p11 = d_c_cli_present("NEEDRESTART");
|
|
|
|
p12 = d_c_cli_present("JNLPOOL");
|
2024-07-19 11:43:27 -04:00
|
|
|
p13 = d_c_cli_present("FREEZE");
|
2012-02-05 11:35:58 -05:00
|
|
|
|
|
|
|
/* every source server command must have at least one of the above control qualifiers */
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = !(p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9 || p10 || p11 || p12 || p13);
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK; /* Note CLI_DIS_CHECK_N_RESET is not used as we want to reuse the computed error string (cli_err_str_ptr)
|
|
|
|
* for the next check as well in case it fails. Note that this can be done only if both checks use
|
|
|
|
* exactly the same set of qualifiers (which is TRUE in this case). */
|
|
|
|
|
|
|
|
/* every source server command cannot have any more than one of the above control qualifiers */
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = cli_check_any2(VARLSTCNT(11) p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
/* BUFFSIZE, CMPLVL, FILTER, PASSIVE are supported only with START qualifier */
|
|
|
|
disallow_return_value = (!d_c_cli_present("START")
|
|
|
|
&& (d_c_cli_present("BUFFSIZE")
|
|
|
|
|| d_c_cli_present("CMPLVL")
|
|
|
|
|| d_c_cli_present("FILTER")
|
|
|
|
|| d_c_cli_present("PASSIVE")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* CONNECTPARAMS, SECONDARY are supported only with START or ACTIVATE qualifiers */
|
|
|
|
disallow_return_value = (!d_c_cli_present("START") && !d_c_cli_present("ACTIVATE")
|
|
|
|
&& (d_c_cli_present("CONNECTPARAMS") || d_c_cli_present("SECONDARY")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2024-07-19 11:43:27 -04:00
|
|
|
/* LOG are not allowed with STATS qualifier */
|
|
|
|
disallow_return_value = (d_c_cli_present("STATSLOG") && d_c_cli_present("LOG"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* LOG are supported only with START, CHANGELOG, ACTIVATE qualifiers */
|
|
|
|
disallow_return_value = (!d_c_cli_present("START")
|
|
|
|
&& !d_c_cli_present("CHANGELOG")
|
|
|
|
&& !d_c_cli_present("ACTIVATE")
|
|
|
|
&& d_c_cli_present("LOG"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* LOG_INTERVAL are supported only with START, CHANGELOG, ACTIVATE, STATSLOG qualifiers */
|
2012-02-05 11:35:58 -05:00
|
|
|
disallow_return_value = (!d_c_cli_present("START")
|
|
|
|
&& !d_c_cli_present("CHANGELOG")
|
|
|
|
&& !d_c_cli_present("ACTIVATE")
|
|
|
|
&& !d_c_cli_present("STATSLOG")
|
2024-07-19 11:43:27 -04:00
|
|
|
&& d_c_cli_present("LOG_INTERVAL"));
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* TIMEOUT is supported only with SHUTDOWN qualifier */
|
|
|
|
disallow_return_value = (!d_c_cli_present("SHUTDOWN") && d_c_cli_present("TIMEOUT"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* One and only one of PASSIVE or SECONDARY must be specified with START */
|
|
|
|
disallow_return_value = (d_c_cli_present("START") && d_c_cli_present("PASSIVE") && d_c_cli_present("SECONDARY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("START") && !d_c_cli_present("PASSIVE") && !d_c_cli_present("SECONDARY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* LOG is a mandatory qualifier with START */
|
|
|
|
disallow_return_value = (d_c_cli_present("START") && !d_c_cli_present("LOG"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* SECONDARY is a mandatory qualifier with ACTIVATE */
|
|
|
|
disallow_return_value = (d_c_cli_present("ACTIVATE") && !d_c_cli_present("SECONDARY"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* One of LOG or LOG_INTERVAL needs to be specified with CHANGELOG */
|
|
|
|
disallow_return_value = (d_c_cli_present("CHANGELOG") && !d_c_cli_present("LOG") && !d_c_cli_present("LOG_INTERVAL"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-03-24 14:06:46 -04:00
|
|
|
/* ROOTPRIMARY (or UPDOK) and PROPAGATEPRIMARY (or UPDNOTOK) are mutually exclusive */
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = ((d_c_cli_present("ROOTPRIMARY") || d_c_cli_present("UPDOK"))
|
2012-03-24 14:06:46 -04:00
|
|
|
&& (d_c_cli_present("PROPAGATEPRIMARY") || d_c_cli_present("UPDNOTOK")));
|
2012-02-05 11:35:58 -05:00
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* ROOTPRIMARY and PROPAGATEPRIMARY are allowed only along with START, ACTIVATE or DEACTIVATE qualifiers */
|
2012-03-24 14:06:46 -04:00
|
|
|
disallow_return_value = ((d_c_cli_present("ROOTPRIMARY") || d_c_cli_present("PROPAGATEPRIMARY")
|
|
|
|
|| d_c_cli_present("UPDOK") || d_c_cli_present("UPDNOTOK"))
|
2012-02-05 11:35:58 -05:00
|
|
|
&& !(d_c_cli_present("START")
|
|
|
|
|| d_c_cli_present("ACTIVATE")
|
|
|
|
|| d_c_cli_present("DEACTIVATE")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* INSTSECONDARY is allowed with every control qualifier except LOSTTNCOMPLETE and JNLPOOL */
|
|
|
|
disallow_return_value = (d_c_cli_present("INSTSECONDARY")
|
|
|
|
&& (d_c_cli_present("LOSTTNCOMPLETE") || d_c_cli_present("JNLPOOL")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
/* DETAIL is compatible only with JNLPOOL */
|
|
|
|
disallow_return_value = (!d_c_cli_present("JNLPOOL") && d_c_cli_present("DETAIL"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_replic_updhelper(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
disallow_return_value = !(d_c_cli_present("READER") || d_c_cli_present("WRITER"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_rundown(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
disallow_return_value = d_c_cli_present("FILE") && d_c_cli_present("REGION");
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_set(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
boolean_t p1, p2, p3;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
|
|
|
|
p1 = d_c_cli_present("FILE");
|
|
|
|
p2 = d_c_cli_present("REGION");
|
|
|
|
p3 = d_c_cli_present("JNLFILE");
|
|
|
|
|
|
|
|
/* any MUPIP SET command should contain at LEAST one of the above qualifiers */
|
|
|
|
disallow_return_value = !(p1 || p2 || p3);
|
|
|
|
CLI_DIS_CHECK; /* Note CLI_DIS_CHECK_N_RESET is not used as we want to reuse the computed error string (cli_err_str_ptr)
|
|
|
|
* for the next check as well in case it fails. Note that this can be done only if both checks use
|
|
|
|
* exactly the same set of qualifiers (which is TRUE in this case). */
|
|
|
|
/* any MUPIP SET command should contain at MOST one of the above qualifiers */
|
|
|
|
disallow_return_value = cli_check_any2(VARLSTCNT(3) p1, p2, p3);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
disallow_return_value = (d_c_cli_present("JOURNAL.ON") && d_c_cli_present("JOURNAL.OFF"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("JOURNAL.DISABLE") &&
|
|
|
|
(d_c_cli_present("JOURNAL.ON") || d_c_cli_present("JOURNAL.OFF") ||
|
|
|
|
d_c_cli_present("JOURNAL.ENABLE") ||
|
|
|
|
d_c_cli_present("JOURNAL.BEFORE_IMAGES") || d_c_cli_negated("JOURNAL.BEFORE_IMAGES") ||
|
|
|
|
d_c_cli_present("JOURNAL.FILENAME") || d_c_cli_present("JOURNAL.ALLOCATION") ||
|
|
|
|
d_c_cli_present("JOURNAL.EXTENSION") || d_c_cli_present("JOURNAL.BUFFER_SIZE") ||
|
|
|
|
d_c_cli_present("JOURNAL.ALIGNSIZE") || d_c_cli_present("JOURNAL.EPOCH_INTERVAL") ||
|
|
|
|
d_c_cli_present("JOURNAL.AUTOSWITCHLIMIT")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (!(!d_c_cli_present("JOURNAL") || d_c_cli_present("DISABLE") || d_c_cli_present("OFF") ||
|
|
|
|
d_c_cli_present("JOURNAL.BEFORE_IMAGES") || d_c_cli_negated("JOURNAL.BEFORE_IMAGES")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("REPLICATION.ON") && d_c_cli_present("REPLICATION.OFF"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("REPLICATION.ON") && (d_c_cli_present("JOURNAL.OFF") ||
|
|
|
|
d_c_cli_present("JOURNAL.DISABLE") || d_c_cli_negated("JOURNAL")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("PREVJNLFILE") && !(d_c_cli_present("JNLFILE")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
disallow_return_value = (d_c_cli_present("VERSION") &&
|
|
|
|
(d_c_cli_present("ACCESS_METHOD")
|
|
|
|
|| d_c_cli_present("GLOBAL_BUFFERS")
|
|
|
|
|| d_c_cli_present("RESERVED_BYTES")
|
|
|
|
|| d_c_cli_present("FLUSH_TIME")
|
|
|
|
|| d_c_cli_present("LOCK_SPACE")
|
|
|
|
|| d_c_cli_present("DEFER_TIME")
|
|
|
|
|| d_c_cli_present("WAIT_DISK")
|
|
|
|
|| d_c_cli_present("PARTIAL_RECOV_BYPASS")));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2024-07-19 11:43:27 -04:00
|
|
|
disallow_return_value = (d_c_cli_present("INST_FREEZE_ON_ERROR") && p3);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
p1 = d_c_cli_present("KEY_SIZE");
|
|
|
|
p2 = d_c_cli_present("RECORD_SIZE");
|
|
|
|
p3 = d_c_cli_present("RESERVED_BYTES");
|
|
|
|
disallow_return_value = cli_check_any2(VARLSTCNT(3) p1, p2, p3);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
2012-02-05 11:35:58 -05:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean_t cli_disallow_mupip_trigger(void)
|
|
|
|
{
|
|
|
|
int disallow_return_value = 0;
|
|
|
|
|
|
|
|
*cli_err_str_ptr = 0;
|
|
|
|
|
|
|
|
/* any MUPIP TRIGGER command has to have either SELECT or TRIGGERFILE */
|
|
|
|
disallow_return_value = !(d_c_cli_present("SELECT") || d_c_cli_present("TRIGGERFILE"));
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
return FALSE;
|
|
|
|
}
|
2024-07-19 11:43:27 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Disallows multiple heuristics, both region and filename, and invalid matching of heuristic parameter with the heuristic.
|
|
|
|
*/
|
|
|
|
boolean_t cli_disallow_mupip_size(void)
|
|
|
|
{
|
|
|
|
boolean_t disallow_return_value = FALSE;
|
|
|
|
int4 heur_cnt = 0;
|
|
|
|
|
|
|
|
heur_cnt += (d_c_cli_present("HEURISTIC.ARSAMPLE") ? 1 : 0);
|
|
|
|
heur_cnt += (d_c_cli_present("HEURISTIC.IMPSAMPLE") ? 1 : 0);
|
|
|
|
heur_cnt += (d_c_cli_present("HEURISTIC.SCAN") ? 1 : 0);
|
|
|
|
disallow_return_value = heur_cnt > 1;
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
disallow_return_value = ! (
|
|
|
|
/* SAMPLES is param for AR and IMP. So: SAMPLES => (AR || IMP) */
|
|
|
|
(d_c_cli_present("HEURISTIC.ARSAMPLE") || d_c_cli_present("HEURISTIC.IMPSAMPLE") ||
|
|
|
|
!d_c_cli_present("HEURISTIC.SAMPLES"))
|
|
|
|
&&
|
|
|
|
/* LEVEL is param for SCAN So: LEVEL => SCAN */
|
|
|
|
(d_c_cli_present("HEURISTIC.SCAN") || !d_c_cli_present("HEURISTIC.LEVEL"))
|
|
|
|
);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
disallow_return_value = ! (
|
|
|
|
/* SEED is param for AR and IMP. So: SAMPLES => (AR || IMP) */
|
|
|
|
(d_c_cli_present("HEURISTIC.ARSAMPLE") || d_c_cli_present("HEURISTIC.IMPSAMPLE") ||
|
|
|
|
!d_c_cli_present("HEURISTIC.SEED"))
|
|
|
|
);
|
|
|
|
CLI_DIS_CHECK_N_RESET;
|
|
|
|
|
|
|
|
return disallow_return_value;
|
|
|
|
}
|