1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-04-17 11:46:39 +02:00

Remove generated config.auto.c file.

This file duplicated the command list that already exists in parse.auto.c.

Combine the data from config.auto.c into parse.auto.c and adjust the interface functions as needed. Quite a few were able to be moved to parse.c as static.
This commit is contained in:
David Steele 2021-07-29 14:40:30 -04:00
parent e32f9e146b
commit b47a07b8b9
23 changed files with 285 additions and 536 deletions

View File

@ -558,7 +558,7 @@ run 8/1 ------------- L2285 no current backups
## Adding an Option
Options can be added to a command or multiple commands. Options can be configuration file only, command-line only or valid for both. Once an option is successfully added, `config.auto.*`, `define.auto.*` and `parse.auto.*` files will automatically be generated by the build system.
Options can be added to a command or multiple commands. Options can be configuration file only, command-line only or valid for both. Once an option is successfully added, the `config.auto.h` and `parse.auto.c` files will automatically be generated by the build system.
To add an option, two files need be to be modified:

View File

@ -620,7 +620,7 @@ run 8/1 ------------- L2285 no current backups
<section id="option">
<title>Adding an Option</title>
<p>Options can be added to a command or multiple commands. Options can be configuration file only, command-line only or valid for both. Once an option is successfully added, <file>config.auto.*</file>, <file>define.auto.*</file> and <file>parse.auto.*</file> files will automatically be generated by the build system.</p>
<p>Options can be added to a command or multiple commands. Options can be configuration file only, command-line only or valid for both. Once an option is successfully added, the <file>config.auto.h</file> and <file>parse.auto.c</file> files will automatically be generated by the build system.</p>
<p>To add an option, two files need be to be modified:</p>
<list>

View File

@ -216,7 +216,7 @@ SRCS_BUILD_CONFIG = \
OBJS_BUILD_CONFIG = $(patsubst %.c,$(BUILDDIR)/%.o,$(SRCS_BUILD) $(SRCS_BUILD_CONFIG))
build-config: $(OBJS_BUILD_CONFIG) build/config/config.yaml config/config.auto.h config/config.auto.c config/parse.auto.c
build-config: $(OBJS_BUILD_CONFIG) build/config/config.yaml config/config.auto.h config/parse.auto.c
$(CC) -o build-config $(OBJS_BUILD_CONFIG) $(LDFLAGS) $(LIBS) $(LIBS_BUILD)
./build-config $(VPATH)

View File

@ -276,57 +276,6 @@ bldCfgRenderConfigAutoH(const Storage *const storageRepo, const BldCfg bldCfg)
bldPut(storageRepo, "src/config/config.auto.h", BUFSTR(config));
}
/***********************************************************************************************************************************
Render config.auto.c
***********************************************************************************************************************************/
static void
bldCfgRenderConfigAutoC(const Storage *const storageRepo, const BldCfg bldCfg)
{
String *const config = bldHeader(CONFIG_MODULE, CONFIG_AUTO_COMMENT);
// Command data
// -----------------------------------------------------------------------------------------------------------------------------
strCatZ(
config,
"\n"
COMMENT_BLOCK_BEGIN "\n"
"Command data\n"
COMMENT_BLOCK_END "\n"
"static const ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_LIST\n"
"(\n");
for (unsigned int cmdIdx = 0; cmdIdx < lstSize(bldCfg.cmdList); cmdIdx++)
{
const BldCfgCommand *const cmd = lstGet(bldCfg.cmdList, cmdIdx);
if (cmdIdx != 0)
strCatZ(config, "\n");
strCatFmt(
config,
" CONFIG_COMMAND\n"
" (\n"
" CONFIG_COMMAND_NAME(%s)\n"
"\n"
" CONFIG_COMMAND_LOG_FILE(%s)\n"
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(%s)\n"
" CONFIG_COMMAND_LOCK_REQUIRED(%s)\n"
" CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(%s)\n"
" CONFIG_COMMAND_LOCK_TYPE(%s)\n"
" )\n",
strZ(bldConst("CFGCMD", cmd->name)), cvtBoolToConstZ(cmd->logFile), strZ(bldEnum("logLevel", cmd->logLevelDefault)),
cvtBoolToConstZ(cmd->lockRequired), cvtBoolToConstZ(cmd->lockRemoteRequired), strZ(bldEnum("lockType", cmd->lockType)));
}
strCatZ(
config,
")\n");
// Write to storage
// -----------------------------------------------------------------------------------------------------------------------------
bldPut(storageRepo, "src/config/config.auto.c", BUFSTR(config));
}
/***********************************************************************************************************************************
Render parse.auto.c
***********************************************************************************************************************************/
@ -487,6 +436,19 @@ bldCfgRenderParseAutoC(const Storage *const storageRepo, const BldCfg bldCfg)
" PARSE_RULE_COMMAND_NAME(\"%s\"),\n",
strZ(cmd->name));
if (cmd->lockRequired)
strCatZ(config, " PARSE_RULE_COMMAND_LOCK_REQUIRED(true),\n");
if (cmd->lockRemoteRequired)
strCatZ(config, " PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true),\n");
strCatFmt(config, " PARSE_RULE_COMMAND_LOCK_TYPE(%s),\n", strZ(bldEnum("lockType", cmd->lockType)));
if (cmd->logFile)
strCatZ(config, " PARSE_RULE_COMMAND_LOG_FILE(true),\n");
strCatFmt(config, " PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(%s),\n", strZ(bldEnum("logLevel", cmd->logLevelDefault)));
if (cmd->parameterAllowed)
strCatZ(config, " PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),\n");
@ -887,6 +849,5 @@ void
bldCfgRender(const Storage *const storageRepo, const BldCfg bldCfg)
{
bldCfgRenderConfigAutoH(storageRepo, bldCfg);
bldCfgRenderConfigAutoC(storageRepo, bldCfg);
bldCfgRenderParseAutoC(storageRepo, bldCfg);
}

View File

@ -626,7 +626,7 @@ cmdArchiveGet(void)
// Destination is wherever we were told to move the WAL segment
const String *walDestination =
walPath(strLstGet(commandParam, 1), cfgOptionStr(cfgOptPgPath), STR(cfgCommandName(cfgCommand())));
walPath(strLstGet(commandParam, 1), cfgOptionStr(cfgOptPgPath), STR(cfgCommandName()));
// Async get can only be performed on WAL segments, history or other files must use synchronous mode
if (cfgOptionBool(cfgOptArchiveAsync) && walIsSegment(walSegment))

View File

@ -321,7 +321,7 @@ cmdArchivePush(void)
lockStopTest();
// Get the segment name
String *walFile = walPath(strLstGet(commandParam, 0), cfgOptionStrNull(cfgOptPgPath), STR(cfgCommandName(cfgCommand())));
String *walFile = walPath(strLstGet(commandParam, 0), cfgOptionStrNull(cfgOptPgPath), STR(cfgCommandName()));
String *archiveFile = strBase(walFile);
if (cfgOptionBool(cfgOptArchiveAsync))

View File

@ -283,8 +283,8 @@ helpRender(void)
if (commandData[commandId].internal)
continue;
if (strlen(cfgCommandName(commandId)) > commandSizeMax)
commandSizeMax = strlen(cfgCommandName(commandId));
if (strlen(cfgParseCommandName(commandId)) > commandSizeMax)
commandSizeMax = strlen(cfgParseCommandName(commandId));
}
// Output help for each command
@ -294,8 +294,8 @@ helpRender(void)
continue;
strCatFmt(
result, " %s%*s%s\n", cfgCommandName(commandId),
(int)(commandSizeMax - strlen(cfgCommandName(commandId)) + 2), "",
result, " %s%*s%s\n", cfgParseCommandName(commandId),
(int)(commandSizeMax - strlen(cfgParseCommandName(commandId)) + 2), "",
strZ(helpRenderText(commandData[commandId].summary, false, commandSizeMax + 6, false, CONSOLE_WIDTH)));
}
@ -305,7 +305,7 @@ helpRender(void)
else
{
ConfigCommand commandId = cfgCommand();
const char *commandName = cfgCommandName(commandId);
const char *commandName = cfgParseCommandName(commandId);
// Unpack option data
HelpOptionData *optionData = memNew(sizeof(HelpOptionData) * CFG_OPTION_TOTAL);

View File

@ -1,231 +0,0 @@
/***********************************************************************************************************************************
Command and Option Configuration
Automatically generated by 'make build-config' -- do not modify directly.
***********************************************************************************************************************************/
/***********************************************************************************************************************************
Command data
***********************************************************************************************************************************/
static const ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_LIST
(
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_ARCHIVE_GET)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeArchive)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_ARCHIVE_PUSH)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(true)
CONFIG_COMMAND_LOCK_TYPE(lockTypeArchive)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_BACKUP)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(true)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(true)
CONFIG_COMMAND_LOCK_TYPE(lockTypeBackup)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_CHECK)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_EXPIRE)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(true)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeBackup)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_HELP)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_INFO)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_REPO_CREATE)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_REPO_GET)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_REPO_LS)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_REPO_PUT)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_REPO_RM)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_RESTORE)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_STANZA_CREATE)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(true)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeAll)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_STANZA_DELETE)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(true)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeAll)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_STANZA_UPGRADE)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(true)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeAll)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_START)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_STOP)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_VERIFY)
CONFIG_COMMAND_LOG_FILE(true)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
CONFIG_COMMAND
(
CONFIG_COMMAND_NAME(CFGCMD_VERSION)
CONFIG_COMMAND_LOG_FILE(false)
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
CONFIG_COMMAND_LOCK_REQUIRED(false)
CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)
CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)
)
)

View File

@ -11,45 +11,6 @@ Command and Option Configuration
#include "config/config.intern.h"
#include "config/parse.h"
/***********************************************************************************************************************************
Map command names to ids and vice versa
***********************************************************************************************************************************/
typedef struct ConfigCommandData
{
const char *name;
bool lockRequired:1;
bool lockRemoteRequired:1;
unsigned int lockType:2;
bool logFile:1;
unsigned int logLevelDefault:4;
} ConfigCommandData;
#define CONFIG_COMMAND_LIST(...) \
{__VA_ARGS__};
#define CONFIG_COMMAND(...) \
{__VA_ARGS__},
#define CONFIG_COMMAND_LOCK_REQUIRED(lockRequiredParam) \
.lockRequired = lockRequiredParam,
#define CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(lockRemoteRequiredParam) \
.lockRemoteRequired = lockRemoteRequiredParam,
#define CONFIG_COMMAND_LOCK_TYPE(lockTypeParam) \
.lockType = lockTypeParam,
#define CONFIG_COMMAND_LOG_FILE(logFileParam) \
.logFile = logFileParam,
#define CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDefaultParam) \
.logLevelDefault = logLevelDefaultParam,
#define CONFIG_COMMAND_NAME(nameParam) \
.name = nameParam,
/***********************************************************************************************************************************
Include the automatically generated configuration data
***********************************************************************************************************************************/
#include "config/config.auto.c"
/***********************************************************************************************************************************
Data for the currently loaded configuration
***********************************************************************************************************************************/
@ -118,25 +79,6 @@ cfgCommandHelp(void)
FUNCTION_TEST_RETURN(configLocal->help);
}
/**********************************************************************************************************************************/
ConfigCommand
cfgCommandId(const char *commandName)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STRINGZ, commandName);
FUNCTION_TEST_END();
ASSERT(commandName != NULL);
ConfigCommand commandId;
for (commandId = 0; commandId < cfgCmdNone; commandId++)
if (strcmp(commandName, configCommandData[commandId].name) == 0)
break;
FUNCTION_TEST_RETURN(commandId);
}
/**********************************************************************************************************************************/
VariantList *
cfgCommandJobRetry(void)
@ -162,32 +104,14 @@ cfgCommandJobRetry(void)
/**********************************************************************************************************************************/
const char *
cfgCommandName(ConfigCommand commandId)
cfgCommandName(void)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandId);
FUNCTION_TEST_END();
FUNCTION_TEST_VOID();
ASSERT(commandId < cfgCmdNone);
ASSERT(configLocal != NULL);
ASSERT(configLocal->command < cfgCmdNone);
FUNCTION_TEST_RETURN(configCommandData[commandId].name);
}
String *
cfgCommandRoleNameParam(ConfigCommand commandId, ConfigCommandRole commandRoleId, const String *separator)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandId);
FUNCTION_TEST_PARAM(ENUM, commandRoleId);
FUNCTION_TEST_PARAM(STRING, separator);
FUNCTION_TEST_END();
String *result = strNewZ(cfgCommandName(commandId));
if (commandRoleId != cfgCmdRoleMain)
strCatFmt(result, "%s%s", strZ(separator), strZ(cfgCommandRoleStr(commandRoleId)));
FUNCTION_TEST_RETURN(result);
FUNCTION_TEST_RETURN(cfgParseCommandName(configLocal->command));
}
String *
@ -195,7 +119,7 @@ cfgCommandRoleName(void)
{
FUNCTION_TEST_VOID();
FUNCTION_TEST_RETURN(cfgCommandRoleNameParam(cfgCommand(), cfgCommandRole(), COLON_STR));
FUNCTION_TEST_RETURN(cfgParseCommandRoleName(cfgCommand(), cfgCommandRole(), COLON_STR));
}
/**********************************************************************************************************************************/
@ -218,60 +142,6 @@ cfgCommandParam(void)
FUNCTION_TEST_RETURN(configLocal->paramList);
}
/**********************************************************************************************************************************/
STRING_STATIC(CONFIG_COMMAND_ROLE_ASYNC_STR, CONFIG_COMMAND_ROLE_ASYNC);
STRING_STATIC(CONFIG_COMMAND_ROLE_LOCAL_STR, CONFIG_COMMAND_ROLE_LOCAL);
STRING_STATIC(CONFIG_COMMAND_ROLE_REMOTE_STR, CONFIG_COMMAND_ROLE_REMOTE);
ConfigCommandRole
cfgCommandRoleEnum(const String *commandRole)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STRING, commandRole);
FUNCTION_TEST_END();
if (commandRole == NULL)
FUNCTION_TEST_RETURN(cfgCmdRoleMain);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_ASYNC_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleAsync);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_LOCAL_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleLocal);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_REMOTE_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleRemote);
THROW_FMT(CommandInvalidError, "invalid command role '%s'", strZ(commandRole));
}
const String *
cfgCommandRoleStr(ConfigCommandRole commandRole)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandRole);
FUNCTION_TEST_END();
const String *result = NULL;
switch (commandRole)
{
case cfgCmdRoleMain:
break;
case cfgCmdRoleAsync:
result = CONFIG_COMMAND_ROLE_ASYNC_STR;
break;
case cfgCmdRoleLocal:
result = CONFIG_COMMAND_ROLE_LOCAL_STR;
break;
case cfgCmdRoleRemote:
result = CONFIG_COMMAND_ROLE_REMOTE_STR;
break;
}
FUNCTION_TEST_RETURN(result);
}
/**********************************************************************************************************************************/
const String *
cfgExe(void)
@ -293,7 +163,7 @@ cfgLockRequired(void)
// Local roles never take a lock and the remote role has special logic for locking
FUNCTION_TEST_RETURN(
// If a lock is required for the command and the role is main
(configCommandData[cfgCommand()].lockRequired && cfgCommandRole() == cfgCmdRoleMain) ||
(configLocal->lockRequired && cfgCommandRole() == cfgCmdRoleMain) ||
// Or any command when the role is async
cfgCommandRole() == cfgCmdRoleAsync);
}
@ -304,7 +174,10 @@ cfgLockRemoteRequired(void)
{
FUNCTION_TEST_VOID();
FUNCTION_TEST_RETURN(configCommandData[cfgCommand()].lockRemoteRequired);
ASSERT(configLocal != NULL);
ASSERT(configLocal->command != cfgCmdNone);
FUNCTION_TEST_RETURN(configLocal->lockRemoteRequired);
}
/**********************************************************************************************************************************/
@ -316,7 +189,7 @@ cfgLockType(void)
ASSERT(configLocal != NULL);
ASSERT(configLocal->command != cfgCmdNone);
FUNCTION_TEST_RETURN((LockType)configCommandData[cfgCommand()].lockType);
FUNCTION_TEST_RETURN(configLocal->lockType);
}
/**********************************************************************************************************************************/
@ -330,7 +203,7 @@ cfgLogFile(void)
FUNCTION_TEST_RETURN(
// If the command always logs to a file
configCommandData[cfgCommand()].logFile ||
configLocal->logFile ||
// Or log-level-file was explicitly set as a param/env var
(cfgOptionValid(cfgOptLogLevelFile) && cfgOptionSource(cfgOptLogLevelFile) == cfgSourceParam) ||
// Or the role is async
@ -346,7 +219,7 @@ cfgLogLevelDefault(void)
ASSERT(configLocal != NULL);
ASSERT(configLocal->command != cfgCmdNone);
FUNCTION_TEST_RETURN((LogLevel)configCommandData[cfgCommand()].logLevelDefault);
FUNCTION_TEST_RETURN(configLocal->logLevelDefault);
}
/**********************************************************************************************************************************/

View File

@ -53,8 +53,8 @@ ConfigCommand cfgCommand(void);
// Current command role (async, local, remote)
ConfigCommandRole cfgCommandRole(void);
// Get command name by id
const char *cfgCommandName(ConfigCommand commandId);
// Get command name
const char *cfgCommandName(void);
// Get command:role name
String *cfgCommandRoleName(void);
@ -165,18 +165,8 @@ config/load.c.
// Was help requested?
bool cfgCommandHelp(void);
// Get command id by name
ConfigCommand cfgCommandId(const char *commandName);
void cfgCommandSet(ConfigCommand commandId, ConfigCommandRole commandRoleId);
// Get command/role name with custom separator
String *cfgCommandRoleNameParam(ConfigCommand commandId, ConfigCommandRole commandRoleId, const String *separator);
// Convert command role from String to enum and vice versa
ConfigCommandRole cfgCommandRoleEnum(const String *commandRole);
const String *cfgCommandRoleStr(ConfigCommandRole commandRole);
// pgBackRest exe
const String *cfgExe(void);

View File

@ -34,12 +34,17 @@ typedef struct Config
{
MemContext *memContext; // Mem context for config data
// Generally set by the command parser but can also be set by during execute to change commands, i.e. backup -> expire
// Generally set by the command parser but can also be set during execute to change commands, i.e. backup -> expire
ConfigCommand command; // Current command
ConfigCommandRole commandRole; // Current command role
String *exe; // Location of the executable
bool help; // Was help requested for the command?
bool lockRequired; // Is an immediate lock required?
bool lockRemoteRequired; // Is a lock required on the remote?
LockType lockType; // Lock type required
bool logFile; // Will the command log to a file?
LogLevel logLevelDefault; // Default log level
StringList *paramList; // Parameters passed to the command (if any)
// Group options that are related together to allow valid and test checks across all options in the group

View File

@ -133,7 +133,7 @@ cfgExecParam(ConfigCommand commandId, ConfigCommandRole commandRoleId, const Key
}
// Add the command
strLstAdd(result, cfgCommandRoleNameParam(commandId, commandRoleId, COLON_STR));
strLstAdd(result, cfgParseCommandRoleName(commandId, commandRoleId, COLON_STR));
// Move list to the prior context
strLstMove(result, memContextPrior());

View File

@ -78,7 +78,7 @@ cfgLoadUpdateOption(void)
OptionRequiredError,
"%s command requires option: " CFGOPT_REPO "\n"
"HINT: this command requires a specific repository to operate on",
cfgCommandName(cfgCommand()));
cfgCommandName());
}
// If there is more than one repo configured
@ -335,7 +335,7 @@ cfgLoadLogFile(void)
// Construct log filename prefix
String *logFile = strNewFmt(
"%s/%s-%s", strZ(cfgOptionStr(cfgOptLogPath)),
cfgOptionTest(cfgOptStanza) ? strZ(cfgOptionStr(cfgOptStanza)): "all", cfgCommandName(cfgCommand()));
cfgOptionTest(cfgOptStanza) ? strZ(cfgOptionStr(cfgOptStanza)): "all", cfgCommandName());
// ??? Append async for local/remote archive async commands. It would be good to find a more generic way to do this in
// case the async role is added to more commands.
@ -347,7 +347,7 @@ cfgLoadLogFile(void)
// Add command role if it is not main
if (cfgCommandRole() != cfgCmdRoleMain)
strCatFmt(logFile, "-%s", strZ(cfgCommandRoleStr(cfgCommandRole())));
strCatFmt(logFile, "-%s", strZ(cfgParseCommandRoleStr(cfgCommandRole())));
// Add process id if local or remote role
if (cfgCommandRole() == cfgCmdRoleLocal || cfgCommandRole() == cfgCmdRoleRemote)

View File

@ -13,6 +13,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("archive-get"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeArchive),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -28,6 +30,9 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("archive-push"),
PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeArchive),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -43,6 +48,11 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("backup"),
PARSE_RULE_COMMAND_LOCK_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeBackup),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -56,6 +66,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("check"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -68,6 +80,10 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("expire"),
PARSE_RULE_COMMAND_LOCK_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeBackup),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -79,6 +95,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("help"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -91,6 +109,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("info"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -103,6 +123,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("repo-create"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -115,6 +137,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("repo-get"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -128,6 +152,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("repo-ls"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -141,6 +167,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("repo-put"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -154,6 +182,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("repo-rm"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
@ -167,6 +197,9 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("restore"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -180,6 +213,10 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("stanza-create"),
PARSE_RULE_COMMAND_LOCK_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeAll),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -192,6 +229,10 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("stanza-delete"),
PARSE_RULE_COMMAND_LOCK_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeAll),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -204,6 +245,10 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("stanza-upgrade"),
PARSE_RULE_COMMAND_LOCK_REQUIRED(true),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeAll),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -216,6 +261,9 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("start"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -227,6 +275,9 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("stop"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -238,6 +289,9 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("verify"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_FILE(true),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(
@ -251,6 +305,8 @@ static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
PARSE_RULE_COMMAND
(
PARSE_RULE_COMMAND_NAME("version"),
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),
PARSE_RULE_COMMAND_ROLE_VALID_LIST
(

View File

@ -83,6 +83,11 @@ typedef struct ParseRuleCommand
{
const char *name; // Name
unsigned int commandRoleValid:CFG_COMMAND_ROLE_TOTAL; // Valid for the command role?
bool lockRequired:1; // Is an immediate lock required?
bool lockRemoteRequired:1; // Is a lock required on the remote?
unsigned int lockType:2; // Lock type required
bool logFile:1; // Will the command log to a file?
unsigned int logLevelDefault:4; // Default log level
bool parameterAllowed:1; // Command-line parameters are allowed
} ParseRuleCommand;
@ -99,6 +104,21 @@ typedef struct ParseRuleCommand
#define PARSE_RULE_COMMAND_ROLE(commandRoleParam) \
| (1 << commandRoleParam)
#define PARSE_RULE_COMMAND_LOCK_REQUIRED(lockRequiredParam) \
.lockRequired = lockRequiredParam
#define PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(lockRemoteRequiredParam) \
.lockRemoteRequired = lockRemoteRequiredParam
#define PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeParam) \
.lockType = lockTypeParam
#define PARSE_RULE_COMMAND_LOG_FILE(logFileParam) \
.logFile = logFileParam
#define PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDefaultParam) \
.logLevelDefault = logLevelDefaultParam
#define PARSE_RULE_COMMAND_PARAMETER_ALLOWED(parameterAllowedParam) \
.parameterAllowed = parameterAllowedParam
@ -390,6 +410,116 @@ parseOptionIdxValue(ParseOption *optionList, unsigned int optionId, unsigned int
FUNCTION_TEST_RETURN(&optionList[optionId].indexList[optionKeyIdx]);
}
/***********************************************************************************************************************************
Get command id by name
***********************************************************************************************************************************/
static ConfigCommand
cfgParseCommandId(const char *const commandName)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STRINGZ, commandName);
FUNCTION_TEST_END();
ASSERT(commandName != NULL);
ConfigCommand commandId;
for (commandId = 0; commandId < CFG_COMMAND_TOTAL; commandId++)
{
if (strcmp(commandName, parseRuleCommand[commandId].name) == 0)
break;
}
FUNCTION_TEST_RETURN(commandId);
}
/**********************************************************************************************************************************/
const char *
cfgParseCommandName(const ConfigCommand commandId)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandId);
FUNCTION_TEST_END();
ASSERT(commandId < cfgCmdNone);
FUNCTION_TEST_RETURN(parseRuleCommand[commandId].name);
}
/***********************************************************************************************************************************
Convert command role from String to enum and vice versa
***********************************************************************************************************************************/
STRING_STATIC(CONFIG_COMMAND_ROLE_ASYNC_STR, CONFIG_COMMAND_ROLE_ASYNC);
STRING_STATIC(CONFIG_COMMAND_ROLE_LOCAL_STR, CONFIG_COMMAND_ROLE_LOCAL);
STRING_STATIC(CONFIG_COMMAND_ROLE_REMOTE_STR, CONFIG_COMMAND_ROLE_REMOTE);
static ConfigCommandRole
cfgParseCommandRoleEnum(const String *const commandRole)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STRING, commandRole);
FUNCTION_TEST_END();
if (commandRole == NULL)
FUNCTION_TEST_RETURN(cfgCmdRoleMain);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_ASYNC_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleAsync);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_LOCAL_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleLocal);
else if (strEq(commandRole, CONFIG_COMMAND_ROLE_REMOTE_STR))
FUNCTION_TEST_RETURN(cfgCmdRoleRemote);
THROW_FMT(CommandInvalidError, "invalid command role '%s'", strZ(commandRole));
}
const String *
cfgParseCommandRoleStr(const ConfigCommandRole commandRole)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandRole);
FUNCTION_TEST_END();
const String *result = NULL;
switch (commandRole)
{
case cfgCmdRoleMain:
break;
case cfgCmdRoleAsync:
result = CONFIG_COMMAND_ROLE_ASYNC_STR;
break;
case cfgCmdRoleLocal:
result = CONFIG_COMMAND_ROLE_LOCAL_STR;
break;
case cfgCmdRoleRemote:
result = CONFIG_COMMAND_ROLE_REMOTE_STR;
break;
}
FUNCTION_TEST_RETURN(result);
}
/**********************************************************************************************************************************/
String *
cfgParseCommandRoleName(const ConfigCommand commandId, const ConfigCommandRole commandRoleId, const String *const separator)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, commandId);
FUNCTION_TEST_PARAM(ENUM, commandRoleId);
FUNCTION_TEST_PARAM(STRING, separator);
FUNCTION_TEST_END();
String *result = strNewZ(cfgParseCommandName(commandId));
if (commandRoleId != cfgCmdRoleMain)
strCatFmt(result, "%s%s", strZ(separator), strZ(cfgParseCommandRoleStr(commandRoleId)));
FUNCTION_TEST_RETURN(result);
}
/***********************************************************************************************************************************
Find an option by name in the option list
***********************************************************************************************************************************/
@ -1077,7 +1207,7 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
if (!commandSet)
{
// Try getting the command from the valid command list
config->command = cfgCommandId(arg);
config->command = cfgParseCommandId(arg);
config->commandRole = cfgCmdRoleMain;
// If not successful then a command role may be appended
@ -1088,11 +1218,11 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
if (strLstSize(commandPart) == 2)
{
// Get command id
config->command = cfgCommandId(strZ(strLstGet(commandPart, 0)));
config->command = cfgParseCommandId(strZ(strLstGet(commandPart, 0)));
// If command id is valid then get command role id
if (config->command != cfgCmdNone)
config->commandRole = cfgCommandRoleEnum(strLstGet(commandPart, 1));
config->commandRole = cfgParseCommandRoleEnum(strLstGet(commandPart, 1));
}
}
@ -1108,6 +1238,13 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
config->help = true;
else
commandSet = true;
// Set command options
config->lockRequired = parseRuleCommand[config->command].lockRequired;
config->lockRemoteRequired = parseRuleCommand[config->command].lockRemoteRequired;
config->lockType = (LockType)parseRuleCommand[config->command].lockType;
config->logFile = parseRuleCommand[config->command].logFile;
config->logLevelDefault = (LogLevel)parseRuleCommand[config->command].logLevelDefault;
}
// Additional arguments are command arguments
else
@ -1253,11 +1390,11 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
if (stanza != NULL)
{
strLstAdd(sectionList, strNewFmt("%s:%s", strZ(stanza), cfgCommandName(config->command)));
strLstAdd(sectionList, strNewFmt("%s:%s", strZ(stanza), cfgParseCommandName(config->command)));
strLstAdd(sectionList, stanza);
}
strLstAdd(sectionList, strNewFmt(CFGDEF_SECTION_GLOBAL ":%s", cfgCommandName(config->command)));
strLstAdd(sectionList, strNewFmt(CFGDEF_SECTION_GLOBAL ":%s", cfgParseCommandName(config->command)));
strLstAddZ(sectionList, CFGDEF_SECTION_GLOBAL);
// Loop through sections to search for options
@ -1415,7 +1552,7 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
{
THROW_FMT(
OptionInvalidError, "option '%s' not valid for command '%s'", cfgParseOptionName(optionId),
cfgCommandName(config->command));
cfgParseCommandName(config->command));
}
// Continue to the next option
@ -1871,7 +2008,7 @@ configParse(const Storage *storage, unsigned int argListSize, const char *argLis
hint = "\nHINT: does this stanza exist?";
THROW_FMT(
OptionRequiredError, "%s command requires option: %s%s", cfgCommandName(config->command),
OptionRequiredError, "%s command requires option: %s%s", cfgParseCommandName(config->command),
cfgParseOptionKeyIdxName(optionId, optionKeyIdx), hint);
}
}

View File

@ -28,6 +28,16 @@ Functions
// Parse the command-line arguments and config file to produce final config data
void configParse(const Storage *storage, unsigned int argListSize, const char *argList[], bool resetLogLevel);
// Get command name by id
const char *cfgParseCommandName(ConfigCommand commandId);
// Get command/role name with custom separator
String *cfgParseCommandRoleName(
const ConfigCommand commandId, const ConfigCommandRole commandRoleId, const String *separator);
// Convert command role enum to String
const String *cfgParseCommandRoleStr(ConfigCommandRole commandRole);
// Parse option name and return option info
typedef struct CfgParseOptionParam
{

View File

@ -25,7 +25,7 @@ dbGetIdx(unsigned int pgIdx)
MEM_CONTEXT_TEMP_BEGIN()
{
const String *applicationName = strNewFmt(PROJECT_NAME " [%s]", cfgCommandName(cfgCommand()));
const String *applicationName = strNewFmt(PROJECT_NAME " [%s]", cfgCommandName());
if (pgIsLocal(pgIdx))
{

View File

@ -94,7 +94,7 @@ repoIsLocalVerifyIdx(unsigned int repoIdx)
FUNCTION_TEST_VOID();
if (!repoIsLocal(repoIdx))
THROW_FMT(HostInvalidError, "%s command must be run on the repository host", cfgCommandName(cfgCommand()));
THROW_FMT(HostInvalidError, "%s command must be run on the repository host", cfgCommandName());
FUNCTION_TEST_RETURN_VOID();
}
@ -117,7 +117,7 @@ pgIsLocalVerify(void)
FUNCTION_TEST_VOID();
if (!pgIsLocal(cfgOptionGroupIdxDefault(cfgOptGrpPg)))
THROW_FMT(HostInvalidError, "%s command must be run on the " PG_NAME " host", cfgCommandName(cfgCommand()));
THROW_FMT(HostInvalidError, "%s command must be run on the " PG_NAME " host", cfgCommandName());
FUNCTION_TEST_RETURN_VOID();
}

View File

@ -1163,10 +1163,6 @@ src/common/wait.h:
class: core
type: c/h
src/config/config.auto.c:
class: core/auto
type: c
src/config/config.auto.h:
class: core/auto
type: c/h

View File

@ -50,7 +50,7 @@ hrnCfgLoad(ConfigCommand commandId, const StringList *argListParam, const HrnCfg
// Insert the command so it does not interfere with parameters
if (commandId != cfgCmdNone)
strLstInsert(argList, 0, cfgCommandRoleNameParam(commandId, param.role, COLON_STR));
strLstInsert(argList, 0, cfgParseCommandRoleName(commandId, param.role, COLON_STR));
// Insert the project exe
strLstInsert(argList, 0, param.exeBogus ? STRDEF("pgbackrest-bogus") : STRDEF(testProjectExe()));

View File

@ -91,7 +91,7 @@ Macros for defining groups of functions that implement various queries and comma
#define HRNPQ_MACRO_SET_APPLICATION_NAME(sessionParam) \
{.session = sessionParam, .function = HRNPQ_SENDQUERY, \
.param = strZ(strNewFmt("[\"set application_name = '" PROJECT_NAME " [%s]'\"]", cfgCommandName(cfgCommand()))), \
.param = strZ(strNewFmt("[\"set application_name = '" PROJECT_NAME " [%s]'\"]", cfgCommandName())), \
.resultInt = 1}, \
{.session = sessionParam, .function = HRNPQ_CONSUMEINPUT}, \
{.session = sessionParam, .function = HRNPQ_ISBUSY}, \

View File

@ -485,68 +485,6 @@ testRun(void)
"\n"
"#endif\n");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("check config.auto.c");
TEST_STORAGE_GET(
storageTest,
"src/config/config.auto.c",
COMMENT_BLOCK_BEGIN "\n"
"Command and Option Configuration\n"
"\n"
"Automatically generated by 'make build-config' -- do not modify directly.\n"
COMMENT_BLOCK_END "\n"
"\n"
COMMENT_BLOCK_BEGIN "\n"
"Command data\n"
COMMENT_BLOCK_END "\n"
"static const ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_LIST\n"
"(\n"
" CONFIG_COMMAND\n"
" (\n"
" CONFIG_COMMAND_NAME(CFGCMD_ARCHIVE_GET)\n"
"\n"
" CONFIG_COMMAND_LOG_FILE(false)\n"
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)\n"
" CONFIG_COMMAND_LOCK_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_TYPE(lockTypeArchive)\n"
" )\n"
"\n"
" CONFIG_COMMAND\n"
" (\n"
" CONFIG_COMMAND_NAME(CFGCMD_BACKUP)\n"
"\n"
" CONFIG_COMMAND_LOG_FILE(true)\n"
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)\n"
" CONFIG_COMMAND_LOCK_REQUIRED(true)\n"
" CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(true)\n"
" CONFIG_COMMAND_LOCK_TYPE(lockTypeBackup)\n"
" )\n"
"\n"
" CONFIG_COMMAND\n"
" (\n"
" CONFIG_COMMAND_NAME(CFGCMD_HELP)\n"
"\n"
" CONFIG_COMMAND_LOG_FILE(true)\n"
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)\n"
" CONFIG_COMMAND_LOCK_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)\n"
" )\n"
"\n"
" CONFIG_COMMAND\n"
" (\n"
" CONFIG_COMMAND_NAME(CFGCMD_VERSION)\n"
"\n"
" CONFIG_COMMAND_LOG_FILE(true)\n"
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)\n"
" CONFIG_COMMAND_LOCK_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_REMOTE_REQUIRED(false)\n"
" CONFIG_COMMAND_LOCK_TYPE(lockTypeNone)\n"
" )\n"
")\n");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("check parse.auto.c");
@ -568,6 +506,8 @@ testRun(void)
" PARSE_RULE_COMMAND\n"
" (\n"
" PARSE_RULE_COMMAND_NAME(\"archive-get\"),\n"
" PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeArchive),\n"
" PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),\n"
" PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),\n"
"\n"
" PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
@ -583,6 +523,11 @@ testRun(void)
" PARSE_RULE_COMMAND\n"
" (\n"
" PARSE_RULE_COMMAND_NAME(\"backup\"),\n"
" PARSE_RULE_COMMAND_LOCK_REQUIRED(true),\n"
" PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true),\n"
" PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeBackup),\n"
" PARSE_RULE_COMMAND_LOG_FILE(true),\n"
" PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
"\n"
" PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
" (\n"
@ -596,6 +541,9 @@ testRun(void)
" PARSE_RULE_COMMAND\n"
" (\n"
" PARSE_RULE_COMMAND_NAME(\"help\"),\n"
" PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),\n"
" PARSE_RULE_COMMAND_LOG_FILE(true),\n"
" PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
"\n"
" PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
" (\n"
@ -607,6 +555,9 @@ testRun(void)
" PARSE_RULE_COMMAND\n"
" (\n"
" PARSE_RULE_COMMAND_NAME(\"version\"),\n"
" PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),\n"
" PARSE_RULE_COMMAND_LOG_FILE(true),\n"
" PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
"\n"
" PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
" (\n"

View File

@ -162,9 +162,9 @@ testRun(void)
strZ(strNewFmt("%s/global-backup.confsave", strZ(configIncludePath))));
// Set up defaults
String *backupCmdDefConfigValue = strNewZ(cfgParseOptionDefault(cfgCommandId(TEST_COMMAND_BACKUP), cfgOptConfig));
String *backupCmdDefConfigValue = strNewZ(cfgParseOptionDefault(cfgParseCommandId(TEST_COMMAND_BACKUP), cfgOptConfig));
String *backupCmdDefConfigInclPathValue = strNewZ(
cfgParseOptionDefault(cfgCommandId(TEST_COMMAND_BACKUP), cfgOptConfigIncludePath));
cfgParseOptionDefault(cfgParseCommandId(TEST_COMMAND_BACKUP), cfgOptConfigIncludePath));
const String *oldConfigDefault = STRDEF(TEST_PATH PGBACKREST_CONFIG_ORIG_PATH_FILE);
// Create the option structure and initialize with 0
@ -852,7 +852,7 @@ testRun(void)
hrnLogLevelStdErrSet(logLevelError);
TEST_RESULT_VOID(configParse(storageTest, strLstSize(argList), strLstPtr(argList), true), "load remote config");
TEST_RESULT_INT(cfgCommandRole(), cfgCmdRoleRemote, " command role is remote");
TEST_RESULT_STR_Z(cfgCommandRoleStr(cfgCmdRoleRemote), "remote", " remote role name");
TEST_RESULT_STR_Z(cfgParseCommandRoleStr(cfgCmdRoleRemote), "remote", " remote role name");
TEST_RESULT_INT(hrnLogLevelStdOut(), logLevelError, "console logging is error");
TEST_RESULT_INT(hrnLogLevelStdErr(), logLevelError, "stderr logging is error");
@ -1168,6 +1168,7 @@ testRun(void)
TEST_RESULT_VOID(configParse(storageTest, strLstSize(argList), strLstPtr(argList), false), "help command");
TEST_RESULT_BOOL(cfgCommandHelp(), true, " help is set");
TEST_RESULT_INT(cfgCommand(), cfgCmdHelp, " command is help");
TEST_RESULT_Z(cfgCommandName(), "help", " command name is help");
// -------------------------------------------------------------------------------------------------------------------------
argList = strLstNew();
@ -1227,11 +1228,11 @@ testRun(void)
TEST_RESULT_BOOL(cfgLogFile(), true, " backup command does file logging");
TEST_RESULT_BOOL(cfgLockRemoteRequired(), true, " backup command requires remote lock");
TEST_RESULT_STRLST_Z(cfgCommandParam(), NULL, " check command arguments");
TEST_RESULT_UINT(cfgCommandRoleEnum(NULL), cfgCmdRoleMain, "command role main enum");
TEST_ERROR(cfgCommandRoleEnum(STRDEF("bogus")), CommandInvalidError, "invalid command role 'bogus'");
TEST_RESULT_UINT(cfgParseCommandRoleEnum(NULL), cfgCmdRoleMain, "command role main enum");
TEST_ERROR(cfgParseCommandRoleEnum(STRDEF("bogus")), CommandInvalidError, "invalid command role 'bogus'");
TEST_RESULT_INT(cfgCommandRole(), cfgCmdRoleMain, " command role is main");
TEST_RESULT_STR_Z(cfgCommandRoleName(), "backup", " command/role name is backup");
TEST_RESULT_STR_Z(cfgCommandRoleStr(cfgCmdRoleMain), NULL, " main role name is NULL");
TEST_RESULT_STR_Z(cfgParseCommandRoleStr(cfgCmdRoleMain), NULL, " main role name is NULL");
TEST_RESULT_STR_Z(cfgExe(), TEST_BACKREST_EXE, " exe is set");
@ -1446,7 +1447,7 @@ testRun(void)
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("set command to expire");
TEST_RESULT_VOID(cfgCommandSet(cfgCmdExpire, cfgCommandRoleEnum(STRDEF("async"))), "set command");
TEST_RESULT_VOID(cfgCommandSet(cfgCmdExpire, cfgParseCommandRoleEnum(STRDEF("async"))), "set command");
TEST_RESULT_STR_Z(cfgCommandRoleName(), "expire:async", "command/role name is expire:async");
// -------------------------------------------------------------------------------------------------------------------------