1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-13 01:00:23 +02:00

Replace cfgOptionGroupIdxToKey() with cfgOptionGroupName().

Do the replacement anywhere cfgOptionGroupIdxToKey() is being used to construct a group name in a message. cfgOptionGroupName() is better for this case since it also includes the name of the group so that it does not need to be repeated in each message.
This commit is contained in:
David Steele
2022-01-10 09:10:06 -05:00
parent 9657f1b325
commit aced5d47ed
18 changed files with 99 additions and 70 deletions

View File

@ -45,6 +45,7 @@
<release-item>
<commit subject="Fix inconsistent group display names in messages."/>
<commit subject="Dynamically allocate index to key index map."/>
<commit subject="Replace cfgOptionGroupIdxToKey() with cfgOptionGroupName()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>

View File

@ -92,7 +92,7 @@ ArchiveGetFileResult archiveGetFile(
strLstAdd(
result.warnList,
strNewFmt(
"repo%u: %s [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, actual->repoIdx), strZ(actual->file),
"%s: %s [%s] %s", cfgOptionGroupName(cfgOptGrpRepo, actual->repoIdx), strZ(actual->file),
errorTypeName(errorType()), errorMessage()));
}
MEM_CONTEXT_PRIOR_END();

View File

@ -31,7 +31,7 @@ Archive Get Command
Constants for log messages that are used multiple times to keep them consistent
***********************************************************************************************************************************/
#define FOUND_IN_ARCHIVE_MSG "found %s in the archive"
#define FOUND_IN_REPO_ARCHIVE_MSG "found %s in the repo%u: %s archive"
#define FOUND_IN_REPO_ARCHIVE_MSG "found %s in the %s: %s archive"
#define UNABLE_TO_FIND_IN_ARCHIVE_MSG "unable to find %s in the archive"
#define UNABLE_TO_FIND_VALID_REPO_MSG "unable to find a valid repository"
#define REPO_INVALID_OR_ERR_MSG "some repositories were invalid or encountered errors"
@ -61,8 +61,7 @@ typedef struct ArchiveGetCheckResult
static void
archiveGetErrorAdd(StringList *warnList, bool log, unsigned int repoIdx, const ErrorType *type, const String *message)
{
const String *warn = strNewFmt(
"repo%u: [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorTypeName(type), strZ(message));
const String *warn = strNewFmt("%s: [%s] %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorTypeName(type), strZ(message));
if (!strLstExists(warnList, warn))
{
@ -814,7 +813,7 @@ cmdArchiveGet(void)
ASSERT(file != NULL);
LOG_INFO_FMT(
FOUND_IN_REPO_ARCHIVE_MSG, strZ(walSegment), cfgOptionGroupIdxToKey(cfgOptGrpRepo, file->repoIdx),
FOUND_IN_REPO_ARCHIVE_MSG, strZ(walSegment), cfgOptionGroupName(cfgOptGrpRepo, file->repoIdx),
strZ(file->archiveId));
result = 0;
@ -980,7 +979,7 @@ cmdArchiveGetAsync(void)
LOG_DETAIL_PID_FMT(
processId, FOUND_IN_REPO_ARCHIVE_MSG, strZ(walSegment),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, file->repoIdx), strZ(file->archiveId));
cfgOptionGroupName(cfgOptGrpRepo, file->repoIdx), strZ(file->archiveId));
// Rename temp WAL segment to actual name. This is done after the ok file is written so the ok file
// is guaranteed to exist before the foreground process finds the WAL segment.

View File

@ -40,8 +40,7 @@ archivePushErrorAdd(StringList *errorList, unsigned int repoIdx)
strLstAdd(
errorList,
strNewFmt(
"repo%u: [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()), errorMessage()));
strNewFmt("%s: [%s] %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()), errorMessage()));
FUNCTION_TEST_RETURN_VOID();
}
@ -200,9 +199,9 @@ archivePushFile(
strLstAdd(
result.warnList,
strNewFmt(
"WAL file '%s' already exists in the repo%u archive with the same checksum"
"WAL file '%s' already exists in the %s archive with the same checksum"
"\nHINT: this is valid in some recovery scenarios but may also indicate a problem.",
strZ(archiveFile), cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoData->repoIdx)));
strZ(archiveFile), cfgOptionGroupName(cfgOptGrpRepo, repoData->repoIdx)));
}
MEM_CONTEXT_PRIOR_END();
@ -214,8 +213,8 @@ archivePushFile(
else
{
THROW_FMT(
ArchiveDuplicateError, "WAL file '%s' already exists in the repo%u archive with a different checksum",
strZ(archiveFile), cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoData->repoIdx));
ArchiveDuplicateError, "WAL file '%s' already exists in the %s archive with a different checksum",
strZ(archiveFile), cfgOptionGroupName(cfgOptGrpRepo, repoData->repoIdx));
}
}
// Else the repo needs a copy

View File

@ -250,10 +250,10 @@ archivePushCheck(bool pgPathSet)
ArchiveMismatchError,
"%s version %s, system-id %" PRIu64 " do not match %s stanza version %s, system-id %" PRIu64
"\nHINT: are you archiving to the correct stanza?",
pgPathSet ? PG_NAME : strZ(strNewFmt("repo%u stanza", cfgOptionGroupIdxToKey(cfgOptGrpRepo, 0))),
pgPathSet ? PG_NAME : strZ(strNewFmt("%s stanza", cfgOptionGroupName(cfgOptGrpRepo, 0))),
strZ(pgVersionToStr(result.pgVersion)), result.pgSystemId,
strZ(strNewFmt("repo%u", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx))),
strZ(pgVersionToStr(archiveInfo.version)), archiveInfo.systemId);
cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(pgVersionToStr(archiveInfo.version)),
archiveInfo.systemId);
}
}
@ -279,8 +279,7 @@ archivePushCheck(bool pgPathSet)
strLstAdd(
result.errorList,
strNewFmt(
"repo%u: [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()),
errorMessage()));
"%s: [%s] %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()), errorMessage()));
}
TRY_END();
}

View File

@ -2062,8 +2062,8 @@ cmdBackup(void)
if (!cfgOptionTest(cfgOptRepo) && cfgOptionGroupIdxTotal(cfgOptGrpRepo) > 1)
{
LOG_INFO_FMT(
"repo option not specified, defaulting to repo%u",
cfgOptionGroupIdxToKey(cfgOptGrpRepo, cfgOptionGroupIdxDefault(cfgOptGrpRepo)));
"repo option not specified, defaulting to %s",
cfgOptionGroupName(cfgOptGrpRepo, cfgOptionGroupIdxDefault(cfgOptGrpRepo)));
}
// Load backup.info

View File

@ -78,7 +78,7 @@ checkStandby(const DbGetResult dbGroup, unsigned int pgPathDefinedTotal)
// Check each repository configured
for (unsigned int repoIdx = 0; repoIdx < cfgOptionGroupIdxTotal(cfgOptGrpRepo); repoIdx++)
{
LOG_INFO_FMT(CFGCMD_CHECK " repo%u (standby)", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
LOG_INFO_FMT(CFGCMD_CHECK " %s (standby)", cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
// Get the repo storage in case it is remote and encryption settings need to be pulled down (performed here for testing)
const Storage *storageRepo = storageRepoIdx(repoIdx);
@ -121,7 +121,7 @@ checkPrimary(const DbGetResult dbGroup)
for (unsigned int repoIdx = 0; repoIdx < cfgOptionGroupIdxTotal(cfgOptGrpRepo); repoIdx++)
{
LOG_INFO_FMT(CFGCMD_CHECK " repo%u configuration (primary)", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
LOG_INFO_FMT(CFGCMD_CHECK " %s configuration (primary)", cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
// Get the repo storage in case it is remote and encryption settings need to be pulled down (performed here for testing)
const Storage *storageRepo = storageRepoIdx(repoIdx);
@ -145,16 +145,16 @@ checkPrimary(const DbGetResult dbGroup)
// Wait for the WAL to appear in each repo
for (unsigned int repoIdx = 0; repoIdx < cfgOptionGroupIdxTotal(cfgOptGrpRepo); repoIdx++)
{
LOG_INFO_FMT(CFGCMD_CHECK " repo%u archive for WAL (primary)", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
LOG_INFO_FMT(CFGCMD_CHECK " %s archive for WAL (primary)", cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
const Storage *storageRepo = storageRepoIdx(repoIdx);
const String *walSegmentFile = walSegmentFind(
storageRepo, repoArchiveId[repoIdx], walSegment, cfgOptionUInt64(cfgOptArchiveTimeout));
LOG_INFO_FMT(
"WAL segment %s successfully archived to '%s' on repo%u", strZ(walSegment),
"WAL segment %s successfully archived to '%s' on %s", strZ(walSegment),
strZ(storagePathP(storageRepo, strNewFmt(STORAGE_REPO_ARCHIVE "/%s/%s", strZ(repoArchiveId[repoIdx]),
strZ(walSegmentFile)))), cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
strZ(walSegmentFile)))), cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
}
dbFree(dbGroup.primary);

View File

@ -143,9 +143,9 @@ expireAdhocBackup(InfoBackup *infoBackup, const String *backupLabel, unsigned in
// backups that can be recovered through PITR until the next full backup is created. Same problem for differential
// backups with retention-diff.
LOG_WARN_FMT(
"repo%u: expiring latest backup %s - the ability to perform point-in-time-recovery (PITR) may be affected\n"
"%s: expiring latest backup %s - the ability to perform point-in-time-recovery (PITR) may be affected\n"
"HINT: non-default settings for '%s'/'%s' (even in prior expires) can cause gaps in the WAL.",
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(latestBackup),
cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(latestBackup),
cfgOptionIdxName(cfgOptRepoRetentionArchive, repoIdx), cfgOptionIdxName(cfgOptRepoRetentionArchiveType, repoIdx));
// Adhoc expire is never performed through backup command so only check to determine if dry-run has been set or not
@ -157,7 +157,7 @@ expireAdhocBackup(InfoBackup *infoBackup, const String *backupLabel, unsigned in
// Log the expired backup list (prepend "set:" if there were any dependents that were also expired)
LOG_INFO_FMT(
"repo%u: expire adhoc backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), (result > 1 ? "set " : ""),
"%s: expire adhoc backup %s%s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), (result > 1 ? "set " : ""),
strZ(strLstJoin(backupExpired, ", ")));
}
MEM_CONTEXT_TEMP_END();
@ -209,7 +209,7 @@ expireDiffBackup(InfoBackup *infoBackup, unsigned int repoIdx)
// Log the expired backups. If there is more than one backup, then prepend "set:"
LOG_INFO_FMT(
"repo%u: expire diff backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: expire diff backup %s%s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
(strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", ")));
}
}
@ -259,7 +259,7 @@ expireFullBackup(InfoBackup *infoBackup, unsigned int repoIdx)
// Log the expired backups. If there is more than one backup, then prepend "set:"
LOG_INFO_FMT(
"repo%u: expire full backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: expire full backup %s%s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
(strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", ")));
}
}
@ -328,7 +328,7 @@ expireTimeBasedBackup(InfoBackup *infoBackup, const time_t minTimestamp, unsigne
// Log the expired backups. If there is more than one backup, then prepend "set:"
LOG_INFO_FMT(
"repo%u: expire time-based backup %s%s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: expire time-based backup %s%s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
(strLstSize(backupExpired) > 1 ? "set " : ""), strZ(strLstJoin(backupExpired, ", ")));
}
@ -356,7 +356,7 @@ logExpire(ArchiveExpired *archiveExpire, String *archiveId, unsigned int repoIdx
{
// Force out any remaining message
LOG_INFO_FMT(
"repo%u: %s remove archive, start = %s, stop = %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId),
"%s: %s remove archive, start = %s, stop = %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(archiveId),
strZ(archiveExpire->start), strZ(archiveExpire->stop));
archiveExpire->start = NULL;
@ -396,8 +396,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign
else
{
LOG_INFO_FMT(
"repo%u: time-based archive retention not met %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
strZ(msg));
"%s: time-based archive retention not met %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(msg));
}
}
else
@ -527,8 +526,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign
storageRepoIdx(repoIdx), strNewFmt(STORAGE_REPO_ARCHIVE "/%s", strZ(archiveId)));
LOG_INFO_FMT(
"repo%u: remove archive path %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
strZ(fullPath));
"%s: remove archive path %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(fullPath));
// Execute the real expiration and deletion only if the dry-run option is disabled
if (!cfgOptionValid(cfgOptDryRun) || !cfgOptionBool(cfgOptDryRun))
@ -620,9 +618,9 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign
archiveExpireMax = strDup(archiveRange.start);
LOG_DETAIL_FMT(
"repo%u: %s archive retention on backup %s, start = %s%s",
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(archiveId),
strZ(backupData->backupLabel), strZ(archiveRange.start),
"%s: %s archive retention on backup %s, start = %s%s",
cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(archiveId), strZ(backupData->backupLabel),
strZ(archiveRange.start),
archiveRange.stop != NULL ? strZ(strNewFmt(", stop = %s", strZ(archiveRange.stop))) : "");
// Add the archive range to the list
@ -734,8 +732,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign
if (archiveExpire.total == 0)
{
LOG_INFO_FMT(
"repo%u: %s no archive to remove", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
strZ(archiveId));
"%s: %s no archive to remove", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(archiveId));
}
// Log if there is more to log
else
@ -768,7 +765,7 @@ removeExpiredArchive(InfoBackup *infoBackup, bool timeBasedFullRetention, unsign
}
LOG_INFO_FMT(
"repo%u: %s remove history file %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: %s remove history file %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
strZ(archiveId), strZ(historyFile));
}
}
@ -847,8 +844,7 @@ removeExpiredBackup(InfoBackup *infoBackup, const String *adhocBackupLabel, unsi
if (!strLstExists(currentBackupList, strLstGet(backupList, backupIdx)))
{
LOG_INFO_FMT(
"repo%u: remove expired backup %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
strZ(strLstGet(backupList, backupIdx)));
"%s: remove expired backup %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(strLstGet(backupList, backupIdx)));
// Execute the real expiration and deletion only if the dry-run mode is disabled
if (!cfgOptionValid(cfgOptDryRun) || !cfgOptionBool(cfgOptDryRun))
@ -903,8 +899,7 @@ removeExpiredHistory(InfoBackup *infoBackup, unsigned int repoIdx)
if (strCmp(historyYear, strSubN(minBackupLabel, 0, 4)) < 0)
{
LOG_INFO_FMT(
"repo%u: remove expired backup history path %s",
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), strZ(historyYear));
"%s: remove expired backup history path %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), strZ(historyYear));
// Execute the real expiration and deletion only if the dry-run mode is disabled
if (!cfgOptionValid(cfgOptDryRun) || !cfgOptionBool(cfgOptDryRun))
@ -934,7 +929,7 @@ removeExpiredHistory(InfoBackup *infoBackup, unsigned int repoIdx)
if (!strLstExists(currentBackupList, historyBackupLabel) && strCmp(historyBackupLabel, minBackupLabel) < 0)
{
LOG_INFO_FMT(
"repo%u: remove expired backup history manifest %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: remove expired backup history manifest %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
strZ(historyBackupFile));
// Execute the real expiration and deletion only if the dry-run mode is disabled
@ -1069,8 +1064,7 @@ cmdExpire(void)
}
CATCH_ANY()
{
LOG_ERROR_FMT(
errorTypeCode(errorType()), "repo%u: %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorMessage());
LOG_ERROR_FMT(errorTypeCode(errorType()), "%s: %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorMessage());
errorTotal++;;
}
TRY_END();

View File

@ -266,8 +266,7 @@ restoreBackupSet(void)
}
CATCH_ANY()
{
LOG_WARN_FMT(
"repo%u: [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()), errorMessage());
LOG_WARN_FMT("%s: [%s] %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorTypeName(errorType()), errorMessage());
}
TRY_END();
@ -278,7 +277,7 @@ restoreBackupSet(void)
if (infoBackupDataTotal(infoBackup) == 0)
{
LOG_WARN_FMT(
"repo%u: [%s] no backup sets to restore", cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"%s: [%s] no backup sets to restore", cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
errorTypeName(&BackupSetInvalidError));
continue;
}
@ -2254,7 +2253,7 @@ cmdRestore(void)
// Log the backup set to restore. If the backup was online then append the time recovery will start from.
String *const message = strCatFmt(
strNew(), "repo%u: restore backup set %s", cfgOptionGroupIdxToKey(cfgOptGrpRepo, backupData.repoIdx),
strNew(), "%s: restore backup set %s", cfgOptionGroupName(cfgOptGrpRepo, backupData.repoIdx),
strZ(backupData.backupSet));
if (manifestData(jobData.manifest)->backupOptionOnline)

View File

@ -44,8 +44,8 @@ cmdStanzaCreate(void)
for (unsigned int repoIdx = 0; repoIdx < cfgOptionGroupIdxTotal(cfgOptGrpRepo); repoIdx++)
{
LOG_INFO_FMT(
CFGCMD_STANZA_CREATE " for stanza '%s' on repo%u", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
CFGCMD_STANZA_CREATE " for stanza '%s' on %s", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
const Storage *storageRepoReadStanza = storageRepoIdx(repoIdx);
const Storage *storageRepoWriteStanza = storageRepoIdxWrite(repoIdx);
@ -133,8 +133,8 @@ cmdStanzaCreate(void)
if (sourceFile == NULL)
{
LOG_INFO_FMT(
"stanza '%s' already exists on repo%u and is valid", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
"stanza '%s' already exists on %s and is valid", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
}
}
// Else if both .info and corresponding .copy file are missing for one but not the other, then error - the user will
@ -143,11 +143,11 @@ cmdStanzaCreate(void)
{
THROW_FMT(
FileMissingError,
"%s on repo%u\n"
"%s on %s\n"
"HINT: this may be a symptom of repository corruption!",
((archiveInfoFileExists || archiveInfoFileCopyExists) ?
"archive.info exists but backup.info is missing" : "backup.info exists but archive.info is missing"),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
}
}
}

View File

@ -54,9 +54,9 @@ stanzaDelete(const Storage *storageRepoWriteStanza, const StringList *archiveLis
{
THROW_FMT(
PgRunningError, PG_FILE_POSTMTRPID " exists - looks like " PG_NAME " is running. "
"To delete stanza '%s' on repo%u, shut down " PG_NAME " for stanza '%s' and try again, or use --force.",
"To delete stanza '%s' on %s, shut down " PG_NAME " for stanza '%s' and try again, or use --force.",
strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, cfgOptionGroupIdxDefault(cfgOptGrpRepo)),
cfgOptionGroupName(cfgOptGrpRepo, cfgOptionGroupIdxDefault(cfgOptGrpRepo)),
strZ(cfgOptionDisplay(cfgOptStanza)));
}

View File

@ -41,8 +41,8 @@ cmdStanzaUpgrade(void)
for (unsigned int repoIdx = 0; repoIdx < cfgOptionGroupIdxTotal(cfgOptGrpRepo); repoIdx++)
{
LOG_INFO_FMT(
CFGCMD_STANZA_UPGRADE " for stanza '%s' on repo%u", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
CFGCMD_STANZA_UPGRADE " for stanza '%s' on %s", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
const Storage *storageRepoReadStanza = storageRepoIdx(repoIdx);
const Storage *storageRepoWriteStanza = storageRepoIdxWrite(repoIdx);
@ -100,8 +100,8 @@ cmdStanzaUpgrade(void)
if (!(infoArchiveUpgrade || infoBackupUpgrade))
{
LOG_INFO_FMT(
"stanza '%s' on repo%u is already up to date", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx));
"stanza '%s' on %s is already up to date", strZ(cfgOptionDisplay(cfgOptStanza)),
cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
}
}
}

View File

@ -237,6 +237,39 @@ cfgOptionGroup(ConfigOption optionId)
FUNCTION_TEST_RETURN(configLocal->option[optionId].group);
}
/**********************************************************************************************************************************/
const char *
cfgOptionGroupName(const ConfigOptionGroup groupId, const unsigned int groupIdx)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, groupId);
FUNCTION_TEST_PARAM(UINT, groupIdx);
FUNCTION_TEST_END();
ASSERT(configLocal != NULL);
ASSERT(groupId < CFG_OPTION_GROUP_TOTAL);
ASSERT(groupIdx < configLocal->optionGroup[groupId].indexTotal);
// Generate display names for the group the first time one is requested
if (configLocal->optionGroup[groupId].indexDisplay == NULL)
{
MEM_CONTEXT_BEGIN(configLocal->memContext)
{
configLocal->optionGroup[groupId].indexDisplay = memNew(
sizeof(String *) * configLocal->optionGroup[groupId].indexTotal);
for (unsigned int groupIdx = 0; groupIdx < configLocal->optionGroup[groupId].indexTotal; groupIdx++)
{
configLocal->optionGroup[groupId].indexDisplay[groupIdx] = strNewFmt(
"%s%u", configLocal->optionGroup[groupId].name, configLocal->optionGroup[groupId].indexMap[groupIdx] + 1);
}
}
MEM_CONTEXT_END();
}
FUNCTION_TEST_RETURN(strZ(configLocal->optionGroup[groupId].indexDisplay[groupIdx]));
}
/**********************************************************************************************************************************/
unsigned int
cfgOptionGroupId(ConfigOption optionId)

View File

@ -80,12 +80,14 @@ const StringList *cfgCommandParam(void);
/***********************************************************************************************************************************
Option Group Functions
***********************************************************************************************************************************/
// Format group name for display to the user. Useful for messages that do not show an option name but must use an group name that
// the user will recognize.
const char *cfgOptionGroupName(ConfigOptionGroup groupId, unsigned int groupIdx);
// Get the default index for this group, i.e. the index that will be used if a non-indexed function like cfgOptionTest() is called.
unsigned int cfgOptionGroupIdxDefault(ConfigOptionGroup groupId);
// Convert the group index to a key, i.e. the key that was used in the original configuration file, command-line, etc. Useful for
// messages that do not show an option name but must use an index that the user will recognize. It is preferrable to generate an
// option name with cfgOptionIdxName() when possible.
// Convert the group index to a key, i.e. the key that was used in the original configuration file, command-line, etc.
unsigned int cfgOptionGroupIdxToKey(ConfigOptionGroup groupId, unsigned int groupIdx);
// Total indexes, 0 if the group is not valid. Will be the total configured indexes, no matter which raw indexes were used during

View File

@ -62,6 +62,7 @@ typedef struct Config
bool indexDefaultExists; // Is there a default index for non-indexed functions?
unsigned int indexDefault; // Default index (usually 0)
unsigned int *indexMap; // List of index to key index mappings
const String **indexDisplay; // List of index display names
} optionGroup[CFG_OPTION_GROUP_TOTAL];
// Option data

View File

@ -98,8 +98,8 @@ cfgLoadUpdateOption(void)
{
THROW_FMT(
OptionInvalidValueError,
"local repo%u and repo%u paths are both '%s' but must be different",
cfgOptionGroupIdxToKey(cfgOptGrpRepo, optionIdx), cfgOptionGroupIdxToKey(cfgOptGrpRepo, repoIdx),
"local %s and %s paths are both '%s' but must be different",
cfgOptionGroupName(cfgOptGrpRepo, optionIdx), cfgOptionGroupName(cfgOptGrpRepo, repoIdx),
strZ(cfgOptionIdxDisplay(cfgOptRepoPath, repoIdx)));
}
}

View File

@ -89,7 +89,7 @@ dbGet(bool primaryOnly, bool primaryRequired, bool standbyRequired)
CATCH_ANY()
{
LOG_WARN_FMT(
"unable to check pg%u: [%s] %s", cfgOptionGroupIdxToKey(cfgOptGrpPg, pgIdx), errorTypeName(errorType()),
"unable to check %s: [%s] %s", cfgOptionGroupName(cfgOptGrpPg, pgIdx), errorTypeName(errorType()),
errorMessage());
db = NULL;
}

View File

@ -1687,6 +1687,8 @@ testRun(void)
TEST_RESULT_BOOL(cfgOptionIdxReset(cfgOptPgHost, 0), true, "pg1-host was reset");
TEST_RESULT_UINT(cfgOptionGroupIdxDefault(cfgOptGrpPg), 0, "pg1 is default");
TEST_RESULT_UINT(cfgOptionGroupIdxToKey(cfgOptGrpPg, 1), 2, "pg2 is index 2");
TEST_RESULT_Z(cfgOptionGroupName(cfgOptGrpPg, 1), "pg2", "pg2 group display");
TEST_RESULT_Z(cfgOptionGroupName(cfgOptGrpPg, 0), "pg1", "pg1 group display (cached)");
TEST_RESULT_STR_Z(cfgOptionStr(cfgOptPgPath), "/path/to/db", "default pg-path");
TEST_RESULT_STR_Z(varStr(cfgOptionVar(cfgOptPgPath)), "/path/to/db", "default pg-path as variant");
TEST_RESULT_BOOL(cfgOptionGroupValid(cfgOptGrpPg), true, "pg group is valid");