1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-12 10:04:14 +02:00

Convert option values in commands to StringId.

Convert most of the remaining options that benefit from being StringIds. Since all the command modules can include config.h directly it makes sense to auto-generate these values instead of manually creating an enum for each one.

For the time being StringIds are not being auto-generated because the StringId code does not exist in Perl. However, the *_Z zero-terminated constants for each allowed option value are now auto-generated.
This commit is contained in:
David Steele 2021-05-11 17:24:30 -04:00 committed by GitHub
parent 87ba2ca253
commit 5464ac83d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 233 additions and 68 deletions

View File

@ -32,6 +32,7 @@ use constant BLDLCL_CONSTANT_OPTION_GROUP => '02-const
use constant BLDLCL_CONSTANT_OPTION_GROUP_TOTAL => 'CFG_OPTION_GROUP_TOTAL';
use constant BLDLCL_CONSTANT_OPTION => '03-constantOption';
use constant BLDLCL_CONSTANT_OPTION_TOTAL => 'CFG_OPTION_TOTAL';
use constant BLDLCL_CONSTANT_OPTION_VALUE => '04-constantOptionValue';
use constant BLDLCL_DATA_COMMAND_CONSTANT => '01-commandConstant';
use constant BLDLCL_DATA_COMMAND => '02-command';
@ -66,6 +67,10 @@ my $rhBuild =
{
&BLD_SUMMARY => 'Option',
},
&BLDLCL_CONSTANT_OPTION_VALUE =>
{
&BLD_SUMMARY => 'Option value',
},
},
&BLD_ENUM =>
@ -258,6 +263,66 @@ sub buildConfig
$rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_OPTION}{&BLD_CONSTANT}
{&BLDLCL_CONSTANT_OPTION_TOTAL}{&BLD_CONSTANT_VALUE} = $iOptionTotal;
# Build option value constants
#-------------------------------------------------------------------------------------------------------------------------------
my $rhLastConstant = undef;
foreach my $strOption (sort(keys(%{$rhConfigDefine})))
{
my $rhOption = $rhConfigDefine->{$strOption};
# Only output allowed values for string options
if ($rhOption->{&CFGDEF_TYPE} eq CFGDEF_TYPE_STRING)
{
# Add LF to last option value list so they are not all jumbled together
if (defined($rhLastConstant))
{
$rhLastConstant->{&BLD_CONSTANT_VALUE} .= "\n";
$rhLastConstant = undef;
}
# Add allowed values for the option, if any
my $rhValueHash = {};
if (defined($rhOption->{&CFGDEF_ALLOW_LIST}))
{
foreach my $strValue (sort(@{$rhOption->{&CFGDEF_ALLOW_LIST}}))
{
$rhValueHash->{$strValue} = true;
}
}
# Add allowed values for the option commands, if any
foreach my $strCommand (sort(keys(%{$rhOption->{&CFGDEF_COMMAND}})))
{
my $rhOptionCommand = $rhOption->{&CFGDEF_COMMAND}{$strCommand};
if (defined($rhOptionCommand->{&CFGDEF_ALLOW_LIST}))
{
foreach my $strValue (sort(@{$rhOptionCommand->{&CFGDEF_ALLOW_LIST}}))
{
$rhValueHash->{$strValue} = true;
}
}
}
# Output list of allowed values
foreach my $strValue (sort(keys(%{$rhValueHash})))
{
my $strOptionValueConst = 'CFGOPTVAL_' . uc($strOption) . '_' . uc($strValue) . '_Z';
$strOptionValueConst =~ s/\-/_/g;
$rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_OPTION_VALUE}{&BLD_CONSTANT}
{$strOptionValueConst}{&BLD_CONSTANT_VALUE} = "\"${strValue}\"";
# Save last constant so an LF can be added later, if needed
$rhLastConstant =
$rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_OPTION_VALUE}{&BLD_CONSTANT}
{$strOptionValueConst};
}
}
}
return $rhBuild;
}

View File

@ -102,6 +102,9 @@
<commit subject="Convert BackupType enum to StringId.">
<github-pull-request id="1385"/>
</commit>
<commit subject="Convert option values in commands to StringId.">
<github-pull-request id="1388"/>
</commit>
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>

View File

@ -911,8 +911,8 @@ cmdExpire(void)
const Storage *storageRepo = storageRepoIdx(repoIdx);
InfoBackup *infoBackup = NULL;
bool timeBasedFullRetention = strEqZ(
cfgOptionIdxStr(cfgOptRepoRetentionFullType, repoIdx), CFGOPTVAL_TMP_REPO_RETENTION_FULL_TYPE_TIME);
bool timeBasedFullRetention =
cfgOptionIdxStrId(cfgOptRepoRetentionFullType, repoIdx) == CFGOPTVAL_REPO_RETENTION_FULL_TYPE_TIME;
TRY_BEGIN()
{

View File

@ -29,8 +29,6 @@ Info Command
/***********************************************************************************************************************************
Constants
***********************************************************************************************************************************/
STRING_STATIC(CFGOPTVAL_INFO_OUTPUT_TEXT_STR, "text");
// Naming convention: <sectionname>_KEY_<keyname>_VAR. If the key exists in multiple sections, then <sectionname>_ is omitted.
VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MIN_VAR, "min");
VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MAX_VAR, "max");
@ -1207,8 +1205,8 @@ infoRender(void)
// Since the --set option depends on the --stanza option, the parser will error before this if the backup label is
// specified but a stanza is not
if (backupLabel != NULL && !strEq(cfgOptionStr(cfgOptOutput), CFGOPTVAL_INFO_OUTPUT_TEXT_STR))
THROW(ConfigError, "option '" CFGOPT_SET "' is currently only valid for text output");
if (backupLabel != NULL && cfgOptionStrId(cfgOptOutput) != CFGOPTVAL_OUTPUT_TEXT)
THROW(ConfigError, "option '" CFGOPT_SET "' is currently only valid for " CFGOPTVAL_OUTPUT_TEXT_Z " output");
// Initialize the repo index
unsigned int repoIdxMin = 0;
@ -1387,7 +1385,7 @@ infoRender(void)
infoList = stanzaInfoList(stanzaRepoList, backupLabel, repoIdxMin, repoIdxMax);
// Format text output
if (strEq(cfgOptionStr(cfgOptOutput), CFGOPTVAL_INFO_OUTPUT_TEXT_STR))
if (cfgOptionStrId(cfgOptOutput) == CFGOPTVAL_OUTPUT_TEXT)
{
// Process any stanza directories
if (!varLstEmpty(infoList))
@ -1519,7 +1517,10 @@ infoRender(void)
}
// Format json output
else
{
ASSERT(cfgOptionStrId(cfgOptOutput) == CFGOPTVAL_OUTPUT_JSON);
resultStr = jsonFromVar(varNewVarLst(infoList));
}
MEM_CONTEXT_PRIOR_BEGIN()
{

View File

@ -107,12 +107,18 @@ storageListRender(IoWrite *write)
// Get sort order
SortOrder sortOrder = sortOrderAsc;
if (strEqZ(cfgOptionStr(cfgOptSort), "desc"))
sortOrder = sortOrderDesc;
else if (!strEqZ(cfgOptionStr(cfgOptSort), "asc"))
switch (cfgOptionStrId(cfgOptSort))
{
ASSERT(strEqZ(cfgOptionStr(cfgOptSort), "none"));
sortOrder = sortOrderNone;
case CFGOPTVAL_SORT_DESC:
sortOrder = sortOrderDesc;
break;
case CFGOPTVAL_SORT_NONE:
sortOrder = sortOrderNone;
break;
default:
ASSERT(cfgOptionStrId(cfgOptSort) == CFGOPTVAL_SORT_ASC);
}
// Get path
@ -124,7 +130,7 @@ storageListRender(IoWrite *write)
THROW(ParamInvalidError, "only one path may be specified");
// Get options
bool json = strEqZ(cfgOptionStr(cfgOptOutput), "json") ? true : false;
bool json = cfgOptionStrId(cfgOptOutput) == CFGOPTVAL_OUTPUT_JSON ? true : false;
const String *expression = cfgOptionStrNull(cfgOptFilter);
RegExp *regExp = expression == NULL ? NULL : regExpNew(expression);

View File

@ -40,10 +40,6 @@ Recovery constants
#define RECOVERY_TARGET_XID "recovery_target_xid"
#define RECOVERY_TARGET_ACTION "recovery_target_action"
#define RECOVERY_TARGET_ACTION_PAUSE "pause"
STRING_STATIC(RECOVERY_TARGET_ACTION_PAUSE_STR, RECOVERY_TARGET_ACTION_PAUSE);
#define RECOVERY_TARGET_ACTION_SHUTDOWN "shutdown"
STRING_STATIC(RECOVERY_TARGET_ACTION_SHUTDOWN_STR, RECOVERY_TARGET_ACTION_SHUTDOWN);
#define RECOVERY_TARGET_INCLUSIVE "recovery_target_inclusive"
#define RECOVERY_TARGET_TIMELINE "recovery_target_timeline"
@ -51,23 +47,7 @@ Recovery constants
#define STANDBY_MODE "standby_mode"
STRING_STATIC(STANDBY_MODE_STR, STANDBY_MODE);
#define RECOVERY_TYPE_DEFAULT "default"
STRING_STATIC(RECOVERY_TYPE_DEFAULT_STR, RECOVERY_TYPE_DEFAULT);
#define RECOVERY_TYPE_IMMEDIATE "immediate"
STRING_STATIC(RECOVERY_TYPE_IMMEDIATE_STR, RECOVERY_TYPE_IMMEDIATE);
#define RECOVERY_TYPE_NONE "none"
STRING_STATIC(RECOVERY_TYPE_NONE_STR, RECOVERY_TYPE_NONE);
#define RECOVERY_TYPE_PRESERVE "preserve"
STRING_STATIC(RECOVERY_TYPE_PRESERVE_STR, RECOVERY_TYPE_PRESERVE);
#define RECOVERY_TYPE_STANDBY "standby"
STRING_STATIC(RECOVERY_TYPE_STANDBY_STR, RECOVERY_TYPE_STANDBY);
#define RECOVERY_TYPE_TIME "time"
STRING_STATIC(RECOVERY_TYPE_TIME_STR, RECOVERY_TYPE_TIME);
#define ARCHIVE_MODE "archive_mode"
#define ARCHIVE_MODE_OFF "off"
STRING_STATIC(ARCHIVE_MODE_OFF_STR, ARCHIVE_MODE_OFF);
STRING_STATIC(ARCHIVE_MODE_PRESERVE_STR, "preserve");
/***********************************************************************************************************************************
Validate restore path
@ -270,7 +250,7 @@ restoreBackupSet(void)
// set that satisfies the time condition, else we will use the backup provided
if (cfgOptionSource(cfgOptSet) == cfgSourceDefault)
{
if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_TIME_STR))
if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_TIME)
timeTargetEpoch = getEpoch(cfgOptionStr(cfgOptTarget));
}
else
@ -1023,7 +1003,7 @@ restoreCleanBuild(Manifest *manifest)
strLstAdd(cleanData->fileIgnore, BACKUP_MANIFEST_FILE_STR);
// Also ignore recovery files when recovery type = preserve
if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_PRESERVE_STR))
if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_PRESERVE)
{
// If recovery GUCs then three files must be preserved
if (manifestData(manifest)->pgVersion >= PG_VERSION_RECOVERY_GUC)
@ -1119,8 +1099,7 @@ restoreCleanBuild(Manifest *manifest)
}
// Skip postgresql.auto.conf if preserve is set and the PostgreSQL version supports recovery GUCs
if (manifestData(manifest)->pgVersion >= PG_VERSION_RECOVERY_GUC &&
strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_PRESERVE_STR) &&
if (manifestData(manifest)->pgVersion >= PG_VERSION_RECOVERY_GUC && cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_PRESERVE &&
manifestFileFindDefault(manifest, STRDEF(MANIFEST_TARGET_PGDATA "/" PG_FILE_POSTGRESQLAUTOCONF), NULL) != NULL)
{
LOG_DETAIL_FMT("skip '" PG_FILE_POSTGRESQLAUTOCONF "' -- recovery type is preserve");
@ -1513,9 +1492,7 @@ restoreRecoveryOption(unsigned int pgVersion)
}
// If archive-mode is not preserve
const String *archiveMode = cfgOptionStr(cfgOptArchiveMode);
if (!strEq(archiveMode, ARCHIVE_MODE_PRESERVE_STR))
if (cfgOptionStrId(cfgOptArchiveMode) != CFGOPTVAL_ARCHIVE_MODE_PRESERVE)
{
if (pgVersion < PG_VERSION_12)
{
@ -1526,10 +1503,10 @@ restoreRecoveryOption(unsigned int pgVersion)
}
// The only other valid option is off
ASSERT(strEq(archiveMode, ARCHIVE_MODE_OFF_STR));
ASSERT(cfgOptionStrId(cfgOptArchiveMode) == CFGOPTVAL_ARCHIVE_MODE_OFF);
// If archive-mode=off then set archive_mode=off
kvPut(result, VARSTRDEF(ARCHIVE_MODE), VARSTR(ARCHIVE_MODE_OFF_STR));
kvPut(result, VARSTRDEF(ARCHIVE_MODE), VARSTRDEF(CFGOPTVAL_ARCHIVE_MODE_OFF_Z));
}
// Write restore_command
@ -1559,19 +1536,19 @@ restoreRecoveryOption(unsigned int pgVersion)
}
// If recovery type is immediate
if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_IMMEDIATE_STR))
if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_IMMEDIATE)
{
kvPut(result, VARSTRZ(RECOVERY_TARGET), VARSTRZ(RECOVERY_TYPE_IMMEDIATE));
kvPut(result, VARSTRZ(RECOVERY_TARGET), VARSTRZ(CFGOPTVAL_TYPE_IMMEDIATE_Z));
}
// Else recovery type is standby
else if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_STANDBY_STR))
else if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_STANDBY)
{
// Write standby_mode for PostgreSQL versions that support it
if (pgVersion < PG_VERSION_RECOVERY_GUC)
kvPut(result, VARSTR(STANDBY_MODE_STR), VARSTRDEF("on"));
}
// Else recovery type is not default so write target options
else if (!strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_DEFAULT_STR))
else if (cfgOptionStrId(cfgOptType) != CFGOPTVAL_TYPE_DEFAULT)
{
// Write the recovery target
kvPut(
@ -1586,24 +1563,24 @@ restoreRecoveryOption(unsigned int pgVersion)
// Write pause_at_recovery_target/recovery_target_action
if (cfgOptionTest(cfgOptTargetAction))
{
const String *targetAction = cfgOptionStr(cfgOptTargetAction);
StringId targetAction = cfgOptionStrId(cfgOptTargetAction);
if (!strEq(targetAction, RECOVERY_TARGET_ACTION_PAUSE_STR))
if (targetAction != CFGOPTVAL_TARGET_ACTION_PAUSE)
{
// Write recovery_target on supported PostgreSQL versions
if (pgVersion >= PG_VERSION_RECOVERY_TARGET_ACTION)
{
kvPut(result, VARSTRZ(RECOVERY_TARGET_ACTION), VARSTR(targetAction));
kvPut(result, VARSTRZ(RECOVERY_TARGET_ACTION), VARSTR(strIdToStr(targetAction)));
}
// Write pause_at_recovery_target on supported PostgreSQL versions
else if (pgVersion >= PG_VERSION_RECOVERY_TARGET_PAUSE)
{
// Shutdown action is not supported with pause_at_recovery_target setting
if (strEq(targetAction, RECOVERY_TARGET_ACTION_SHUTDOWN_STR))
if (targetAction == CFGOPTVAL_TARGET_ACTION_SHUTDOWN)
{
THROW_FMT(
OptionInvalidError,
CFGOPT_TARGET_ACTION "=" RECOVERY_TARGET_ACTION_SHUTDOWN " is only available in PostgreSQL >= %s",
CFGOPT_TARGET_ACTION "=" CFGOPTVAL_TARGET_ACTION_SHUTDOWN_Z " is only available in PostgreSQL >= %s",
strZ(pgVersionToStr(PG_VERSION_RECOVERY_TARGET_ACTION)));
}
@ -1679,7 +1656,7 @@ restoreRecoveryWriteConf(const Manifest *manifest, unsigned int pgVersion, const
FUNCTION_LOG_END();
// Only write recovery.conf if recovery type != none
if (!strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_NONE_STR))
if (cfgOptionStrId(cfgOptType) != CFGOPTVAL_TYPE_NONE)
{
LOG_INFO_FMT("write %s", strZ(storagePathP(storagePg(), PG_FILE_RECOVERYCONF_STR)));
@ -1751,7 +1728,7 @@ restoreRecoveryWriteAutoConf(unsigned int pgVersion, const String *restoreLabel)
}
// If settings will be appended then format the file so a blank line will be between old and new settings
if (!strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_NONE_STR))
if (cfgOptionStrId(cfgOptType) != CFGOPTVAL_TYPE_NONE)
{
strTrim(content);
strCatZ(content, "\n\n");
@ -1759,7 +1736,7 @@ restoreRecoveryWriteAutoConf(unsigned int pgVersion, const String *restoreLabel)
}
// If recovery was requested then write the recovery options
if (!strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_NONE_STR))
if (cfgOptionStrId(cfgOptType) != CFGOPTVAL_TYPE_NONE)
{
// If the user specified standby_mode as a recovery option then error. It's tempting to just set type=standby in this
// case but since config parsing has already happened the target options could be in an invalid state.
@ -1781,7 +1758,7 @@ restoreRecoveryWriteAutoConf(unsigned int pgVersion, const String *restoreLabel)
THROW_FMT(
OptionInvalidError,
"'" STANDBY_MODE "' setting is not valid for " PG_NAME " >= %s\n"
"HINT: use --" CFGOPT_TYPE "=" RECOVERY_TYPE_STANDBY " instead of --" CFGOPT_RECOVERY_OPTION "="
"HINT: use --" CFGOPT_TYPE "=" CFGOPTVAL_TYPE_STANDBY_Z " instead of --" CFGOPT_RECOVERY_OPTION "="
STANDBY_MODE "=on.",
strZ(pgVersionToStr(PG_VERSION_RECOVERY_GUC)));
}
@ -1806,7 +1783,7 @@ restoreRecoveryWriteAutoConf(unsigned int pgVersion, const String *restoreLabel)
BUFSTR(content));
// The standby.signal file is required for standby mode
if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_STANDBY_STR))
if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_STANDBY)
{
storagePutP(
storageNewWriteP(
@ -1842,7 +1819,7 @@ restoreRecoveryWrite(const Manifest *manifest)
MEM_CONTEXT_TEMP_BEGIN()
{
// If recovery type is preserve then leave recovery file as it is
if (strEq(cfgOptionStr(cfgOptType), RECOVERY_TYPE_PRESERVE_STR))
if (cfgOptionStrId(cfgOptType) == CFGOPTVAL_TYPE_PRESERVE)
{
// Determine which file recovery setttings will be written to
const String *recoveryFile = pgVersion >= PG_VERSION_RECOVERY_GUC ?
@ -1851,7 +1828,7 @@ restoreRecoveryWrite(const Manifest *manifest)
if (!storageExistsP(storagePg(), recoveryFile))
{
LOG_WARN_FMT(
"recovery type is " RECOVERY_TYPE_PRESERVE " but recovery file does not exist at '%s'",
"recovery type is " CFGOPTVAL_TYPE_PRESERVE_Z " but recovery file does not exist at '%s'",
strZ(storagePathP(storagePg(), recoveryFile)));
}
}

View File

@ -139,6 +139,96 @@ Option constants
#define CFG_OPTION_TOTAL 130
/***********************************************************************************************************************************
Option value constants
***********************************************************************************************************************************/
#define CFGOPTVAL_ARCHIVE_MODE_OFF_Z "off"
#define CFGOPTVAL_ARCHIVE_MODE_PRESERVE_Z "preserve"
#define CFGOPTVAL_COMPRESS_TYPE_BZ2_Z "bz2"
#define CFGOPTVAL_COMPRESS_TYPE_GZ_Z "gz"
#define CFGOPTVAL_COMPRESS_TYPE_LZ4_Z "lz4"
#define CFGOPTVAL_COMPRESS_TYPE_NONE_Z "none"
#define CFGOPTVAL_COMPRESS_TYPE_ZST_Z "zst"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_DEBUG_Z "debug"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_DETAIL_Z "detail"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_ERROR_Z "error"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_INFO_Z "info"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_OFF_Z "off"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_TRACE_Z "trace"
#define CFGOPTVAL_LOG_LEVEL_CONSOLE_WARN_Z "warn"
#define CFGOPTVAL_LOG_LEVEL_FILE_DEBUG_Z "debug"
#define CFGOPTVAL_LOG_LEVEL_FILE_DETAIL_Z "detail"
#define CFGOPTVAL_LOG_LEVEL_FILE_ERROR_Z "error"
#define CFGOPTVAL_LOG_LEVEL_FILE_INFO_Z "info"
#define CFGOPTVAL_LOG_LEVEL_FILE_OFF_Z "off"
#define CFGOPTVAL_LOG_LEVEL_FILE_TRACE_Z "trace"
#define CFGOPTVAL_LOG_LEVEL_FILE_WARN_Z "warn"
#define CFGOPTVAL_LOG_LEVEL_STDERR_DEBUG_Z "debug"
#define CFGOPTVAL_LOG_LEVEL_STDERR_DETAIL_Z "detail"
#define CFGOPTVAL_LOG_LEVEL_STDERR_ERROR_Z "error"
#define CFGOPTVAL_LOG_LEVEL_STDERR_INFO_Z "info"
#define CFGOPTVAL_LOG_LEVEL_STDERR_OFF_Z "off"
#define CFGOPTVAL_LOG_LEVEL_STDERR_TRACE_Z "trace"
#define CFGOPTVAL_LOG_LEVEL_STDERR_WARN_Z "warn"
#define CFGOPTVAL_OUTPUT_JSON_Z "json"
#define CFGOPTVAL_OUTPUT_TEXT_Z "text"
#define CFGOPTVAL_REMOTE_TYPE_PG_Z "pg"
#define CFGOPTVAL_REMOTE_TYPE_REPO_Z "repo"
#define CFGOPTVAL_REPO_AZURE_KEY_TYPE_SAS_Z "sas"
#define CFGOPTVAL_REPO_AZURE_KEY_TYPE_SHARED_Z "shared"
#define CFGOPTVAL_REPO_CIPHER_TYPE_AES_256_CBC_Z "aes-256-cbc"
#define CFGOPTVAL_REPO_CIPHER_TYPE_NONE_Z "none"
#define CFGOPTVAL_REPO_GCS_KEY_TYPE_SERVICE_Z "service"
#define CFGOPTVAL_REPO_GCS_KEY_TYPE_TOKEN_Z "token"
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_DIFF_Z "diff"
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_FULL_Z "full"
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_INCR_Z "incr"
#define CFGOPTVAL_REPO_RETENTION_FULL_TYPE_COUNT_Z "count"
#define CFGOPTVAL_REPO_RETENTION_FULL_TYPE_TIME_Z "time"
#define CFGOPTVAL_REPO_S3_KEY_TYPE_AUTO_Z "auto"
#define CFGOPTVAL_REPO_S3_KEY_TYPE_SHARED_Z "shared"
#define CFGOPTVAL_REPO_S3_URI_STYLE_HOST_Z "host"
#define CFGOPTVAL_REPO_S3_URI_STYLE_PATH_Z "path"
#define CFGOPTVAL_REPO_TYPE_AZURE_Z "azure"
#define CFGOPTVAL_REPO_TYPE_CIFS_Z "cifs"
#define CFGOPTVAL_REPO_TYPE_GCS_Z "gcs"
#define CFGOPTVAL_REPO_TYPE_POSIX_Z "posix"
#define CFGOPTVAL_REPO_TYPE_S3_Z "s3"
#define CFGOPTVAL_SORT_ASC_Z "asc"
#define CFGOPTVAL_SORT_DESC_Z "desc"
#define CFGOPTVAL_SORT_NONE_Z "none"
#define CFGOPTVAL_TARGET_ACTION_PAUSE_Z "pause"
#define CFGOPTVAL_TARGET_ACTION_PROMOTE_Z "promote"
#define CFGOPTVAL_TARGET_ACTION_SHUTDOWN_Z "shutdown"
#define CFGOPTVAL_TYPE_DEFAULT_Z "default"
#define CFGOPTVAL_TYPE_DIFF_Z "diff"
#define CFGOPTVAL_TYPE_FULL_Z "full"
#define CFGOPTVAL_TYPE_IMMEDIATE_Z "immediate"
#define CFGOPTVAL_TYPE_INCR_Z "incr"
#define CFGOPTVAL_TYPE_NAME_Z "name"
#define CFGOPTVAL_TYPE_NONE_Z "none"
#define CFGOPTVAL_TYPE_PRESERVE_Z "preserve"
#define CFGOPTVAL_TYPE_STANDBY_Z "standby"
#define CFGOPTVAL_TYPE_TIME_Z "time"
#define CFGOPTVAL_TYPE_XID_Z "xid"
/***********************************************************************************************************************************
Command enum
***********************************************************************************************************************************/

View File

@ -43,12 +43,37 @@ typedef enum
#define CFG_COMMAND_ROLE_TOTAL 4
/***********************************************************************************************************************************
Constants
Constants for configuration option values
Constants for configuration options.
??? These should be generated automatically but for now just put them here so they are easy to find when it is time to replace them
with the auto-generated values. Note that the _Z variants of these constants are auto-generated.
***********************************************************************************************************************************/
#define CFGOPTVAL_TMP_REPO_RETENTION_FULL_TYPE_COUNT "count"
#define CFGOPTVAL_TMP_REPO_RETENTION_FULL_TYPE_TIME "time"
#define CFGOPTVAL_ARCHIVE_MODE_OFF STRID5("off", 0x18cf0)
#define CFGOPTVAL_ARCHIVE_MODE_PRESERVE STRID5("preserve", 0x2da45996500)
#define CFGOPTVAL_OUTPUT_TEXT STRID5("text", 0xa60b40)
#define CFGOPTVAL_OUTPUT_JSON STRID5("json", 0x73e6a0)
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_DIFF STRID5("diff", 0x319240)
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_FULL STRID5("full", 0x632a60)
#define CFGOPTVAL_REPO_RETENTION_ARCHIVE_TYPE_INCR STRID5("incr", 0x90dc90)
#define CFGOPTVAL_REPO_RETENTION_FULL_TYPE_COUNT STRID5("count", 0x14755e30)
#define CFGOPTVAL_REPO_RETENTION_FULL_TYPE_TIME STRID5("time", 0x2b5340)
#define CFGOPTVAL_TARGET_ACTION_PAUSE STRID5("pause", 0x59d4300)
#define CFGOPTVAL_TARGET_ACTION_SHUTDOWN STRID5("shutdown", 0x75de4a55130)
#define CFGOPTVAL_SORT_ASC STRID5("asc", 0xe610)
#define CFGOPTVAL_SORT_DESC STRID5("desc", 0x1cca40)
#define CFGOPTVAL_SORT_NONE STRID5("none", 0x2b9ee0)
#define CFGOPTVAL_TYPE_DEFAULT STRID5("default", 0x5195098a40)
#define CFGOPTVAL_TYPE_IMMEDIATE STRID5("immediate", 0x5a05242b5a90)
#define CFGOPTVAL_TYPE_NONE STRID5("none", 0x2b9ee0)
#define CFGOPTVAL_TYPE_PRESERVE STRID5("preserve", 0x2da45996500)
#define CFGOPTVAL_TYPE_STANDBY STRID5("standby", 0x6444706930)
#define CFGOPTVAL_TYPE_TIME STRID5("time", 0x2b5340)
/***********************************************************************************************************************************
Command Functions

View File

@ -215,9 +215,8 @@ cfgLoadUpdateOption(void)
{
case backupTypeFull:
{
if (strEqZ(
cfgOptionIdxStr(cfgOptRepoRetentionFullType, optionIdx),
CFGOPTVAL_TMP_REPO_RETENTION_FULL_TYPE_COUNT) &&
if (cfgOptionIdxStrId(cfgOptRepoRetentionFullType, optionIdx) ==
CFGOPTVAL_REPO_RETENTION_FULL_TYPE_COUNT &&
cfgOptionIdxTest(cfgOptRepoRetentionFull, optionIdx))
{
cfgOptionIdxSet(cfgOptRepoRetentionArchive, optionIdx, cfgSourceDefault,
@ -261,11 +260,10 @@ cfgLoadUpdateOption(void)
if (archiveRetentionType == backupTypeDiff && !cfgOptionIdxTest(cfgOptRepoRetentionDiff, optionIdx))
{
LOG_WARN_FMT(
"option '%s' is not set for '%s=%s'\n"
"option '%s' is not set for '%s=" CFGOPTVAL_TYPE_DIFF_Z "'\n"
"HINT: to retain differential backups indefinitely (without warning), set option '%s' to the maximum.",
cfgOptionIdxName(cfgOptRepoRetentionDiff, optionIdx),
cfgOptionIdxName(cfgOptRepoRetentionArchiveType, optionIdx),
strZ(strIdToStr(backupTypeDiff)),
cfgOptionIdxName(cfgOptRepoRetentionDiff, optionIdx));
}
}

View File

@ -2239,7 +2239,7 @@ testRun(void)
strLstAddZ(argList, "--" CFGOPT_STANZA "=test1");
hrnCfgArgRaw(argList, cfgOptRepoPath, repoPath);
hrnCfgArgRaw(argList, cfgOptPgPath, pgPath);
strLstAddZ(argList, "--" CFGOPT_TYPE "=" RECOVERY_TYPE_PRESERVE);
hrnCfgArgRawStrId(argList, cfgOptType, CFGOPTVAL_TYPE_PRESERVE);
strLstAddZ(argList, "--" CFGOPT_SET "=20161219-212741F");
strLstAddZ(argList, "--" CFGOPT_FORCE);
harnessCfgLoad(cfgCmdRestore, argList);