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

Add macros to create constant Variant types.

These work almost exactly like the String constant macros. However, a struct per variant type was required which meant custom constructors and destructors for each type.

Propagate the variant constants out into the codebase wherever they are useful.
This commit is contained in:
David Steele
2019-04-17 08:04:22 -04:00
parent 2dac4b5986
commit 4c13955c05
37 changed files with 739 additions and 570 deletions

View File

@ -27,6 +27,10 @@
<p>Add <code>STR()</code> macro to create constant <code>String</code> objects from runtime strings.</p> <p>Add <code>STR()</code> macro to create constant <code>String</code> objects from runtime strings.</p>
</release-item> </release-item>
<release-item>
<p>Add macros to create constant <code>Variant</code> types.</p>
</release-item>
<release-item> <release-item>
<release-item-contributor-list> <release-item-contributor-list>
<release-item-contributor id="cynthia.shang"/> <release-item-contributor id="cynthia.shang"/>

View File

@ -413,7 +413,7 @@ info/infoArchive.o: info/infoArchive.c common/assert.h common/crypto/common.h co
info/infoBackup.o: info/infoBackup.c common/assert.h common/crypto/common.h common/debug.h common/error.auto.h common/error.h common/ini.h common/io/filter/filter.h common/io/filter/group.h common/io/read.h common/io/write.h common/log.h common/logLevel.h common/memContext.h common/stackTrace.h common/time.h common/type/buffer.h common/type/convert.h common/type/json.h common/type/keyValue.h common/type/list.h common/type/string.h common/type/stringList.h common/type/variant.h common/type/variantList.h info/info.h info/infoBackup.h info/infoManifest.h info/infoPg.h postgres/interface.h storage/fileRead.h storage/fileWrite.h storage/helper.h storage/info.h storage/storage.h info/infoBackup.o: info/infoBackup.c common/assert.h common/crypto/common.h common/debug.h common/error.auto.h common/error.h common/ini.h common/io/filter/filter.h common/io/filter/group.h common/io/read.h common/io/write.h common/log.h common/logLevel.h common/memContext.h common/stackTrace.h common/time.h common/type/buffer.h common/type/convert.h common/type/json.h common/type/keyValue.h common/type/list.h common/type/string.h common/type/stringList.h common/type/variant.h common/type/variantList.h info/info.h info/infoBackup.h info/infoManifest.h info/infoPg.h postgres/interface.h storage/fileRead.h storage/fileWrite.h storage/helper.h storage/info.h storage/storage.h
$(CC) $(CFLAGS) -c info/infoBackup.c -o info/infoBackup.o $(CC) $(CFLAGS) -c info/infoBackup.c -o info/infoBackup.o
info/infoManifest.o: info/infoManifest.c common/error.auto.h common/error.h common/memContext.h common/type/buffer.h common/type/string.h info/infoManifest.h info/infoManifest.o: info/infoManifest.c common/error.auto.h common/error.h common/memContext.h common/type/buffer.h common/type/keyValue.h common/type/string.h common/type/variant.h common/type/variantList.h info/infoManifest.h
$(CC) $(CFLAGS) -c info/infoManifest.c -o info/infoManifest.o $(CC) $(CFLAGS) -c info/infoManifest.c -o info/infoManifest.o
info/infoPg.o: info/infoPg.c common/assert.h common/crypto/common.h common/debug.h common/error.auto.h common/error.h common/ini.h common/io/filter/filter.h common/io/filter/group.h common/io/read.h common/io/write.h common/log.h common/logLevel.h common/memContext.h common/stackTrace.h common/time.h common/type/buffer.h common/type/convert.h common/type/json.h common/type/keyValue.h common/type/list.h common/type/string.h common/type/stringList.h common/type/variant.h common/type/variantList.h info/info.h info/infoPg.h postgres/interface.h postgres/version.h storage/fileRead.h storage/fileWrite.h storage/helper.h storage/info.h storage/storage.h info/infoPg.o: info/infoPg.c common/assert.h common/crypto/common.h common/debug.h common/error.auto.h common/error.h common/ini.h common/io/filter/filter.h common/io/filter/group.h common/io/read.h common/io/write.h common/log.h common/logLevel.h common/memContext.h common/stackTrace.h common/time.h common/type/buffer.h common/type/convert.h common/type/json.h common/type/keyValue.h common/type/list.h common/type/string.h common/type/stringList.h common/type/variant.h common/type/variantList.h info/info.h info/infoPg.h postgres/interface.h postgres/version.h storage/fileRead.h storage/fileWrite.h storage/helper.h storage/info.h storage/storage.h

View File

@ -109,7 +109,7 @@ archiveAsyncStatus(ArchiveMode archiveMode, const String *walSegment, bool confe
THROW_FMT(FormatError, "%s message must be > 0", strPtr(statusFile)); THROW_FMT(FormatError, "%s message must be > 0", strPtr(statusFile));
// Get contents // Get contents
code = varIntForce(varNewStr(strNewN(strPtr(content), (size_t)(linefeedPtr - strPtr(content))))); code = varIntForce(VARSTR(strNewN(strPtr(content), (size_t)(linefeedPtr - strPtr(content)))));
message = strTrim(strNew(linefeedPtr + 1)); message = strTrim(strNew(linefeedPtr + 1));
} }

View File

@ -211,8 +211,8 @@ cmdArchiveGet(void)
// The async process should not output on the console at all // The async process should not output on the console at all
KeyValue *optionReplace = kvNew(); KeyValue *optionReplace = kvNew();
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_CONSOLE_STR), varNewStrZ("off")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_CONSOLE_STR), VARSTRDEF("off"));
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_STDERR_STR), varNewStrZ("off")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_STDERR_STR), VARSTRDEF("off"));
// Generate command options // Generate command options
StringList *commandExec = cfgExecParam(cfgCmdArchiveGetAsync, optionReplace); StringList *commandExec = cfgExecParam(cfgCmdArchiveGetAsync, optionReplace);
@ -318,9 +318,9 @@ cmdArchiveGetAsync(void)
const String *walSegment = strLstGet(walSegmentList, walSegmentIdx); const String *walSegment = strLstGet(walSegmentList, walSegmentIdx);
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_ARCHIVE_GET_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_ARCHIVE_GET_STR);
protocolCommandParamAdd(command, varNewStr(walSegment)); protocolCommandParamAdd(command, VARSTR(walSegment));
protocolParallelJobAdd(parallelExec, protocolParallelJobNew(varNewStr(walSegment), command)); protocolParallelJobAdd(parallelExec, protocolParallelJobNew(VARSTR(walSegment), command));
} }
// Process jobs // Process jobs

View File

@ -43,7 +43,7 @@ archiveGetProtocol(const String *command, const VariantList *paramList, Protocol
protocolServerResponse( protocolServerResponse(
server, server,
varNewInt( VARINT(
archiveGetFile( archiveGetFile(
storageSpoolWrite(), walSegment, strNewFmt(STORAGE_SPOOL_ARCHIVE_IN "/%s", strPtr(walSegment)), true, storageSpoolWrite(), walSegment, strNewFmt(STORAGE_SPOOL_ARCHIVE_IN "/%s", strPtr(walSegment)), true,
cipherType(cfgOptionStr(cfgOptRepoCipherType)), cfgOptionStr(cfgOptRepoCipherPass)))); cipherType(cfgOptionStr(cfgOptRepoCipherType)), cfgOptionStr(cfgOptRepoCipherPass))));

View File

@ -86,7 +86,7 @@ archivePushFile(
while (!ioReadEof(read)); while (!ioReadEof(read));
ioReadClose(read); ioReadClose(read);
String *walSegmentChecksum = varStr(ioFilterGroupResult(filterGroup, CRYPTO_HASH_FILTER_TYPE_STR)); const String *walSegmentChecksum = varStr(ioFilterGroupResult(filterGroup, CRYPTO_HASH_FILTER_TYPE_STR));
// If the wal segment already exists in the repo then compare checksums // If the wal segment already exists in the repo then compare checksums
walSegmentFile = walSegmentFind(storageRepo(), archiveId, archiveFile); walSegmentFile = walSegmentFind(storageRepo(), archiveId, archiveFile);

View File

@ -41,7 +41,7 @@ archivePushProtocol(const String *command, const VariantList *paramList, Protoco
{ {
protocolServerResponse( protocolServerResponse(
server, server,
varNewStr( VARSTR(
archivePushFile( archivePushFile(
varStr(varLstGet(paramList, 0)), varStr(varLstGet(paramList, 1)), varStr(varLstGet(paramList, 0)), varStr(varLstGet(paramList, 1)),
(unsigned int)varUInt64(varLstGet(paramList, 2)), varUInt64(varLstGet(paramList, 3)), (unsigned int)varUInt64(varLstGet(paramList, 2)), varUInt64(varLstGet(paramList, 3)),

View File

@ -296,8 +296,8 @@ cmdArchivePush(void)
// The async process should not output on the console at all // The async process should not output on the console at all
KeyValue *optionReplace = kvNew(); KeyValue *optionReplace = kvNew();
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_CONSOLE_STR), varNewStrZ("off")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_CONSOLE_STR), VARSTRDEF("off"));
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_STDERR_STR), varNewStrZ("off")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_STDERR_STR), VARSTRDEF("off"));
// Generate command options // Generate command options
StringList *commandExec = cfgExecParam(cfgCmdArchivePushAsync, optionReplace); StringList *commandExec = cfgExecParam(cfgCmdArchivePushAsync, optionReplace);
@ -455,17 +455,17 @@ cmdArchivePushAsync(void)
const String *walFile = strLstGet(walFileList, walFileIdx); const String *walFile = strLstGet(walFileList, walFileIdx);
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_ARCHIVE_PUSH_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_ARCHIVE_PUSH_STR);
protocolCommandParamAdd(command, varNewStr(strNewFmt("%s/%s", strPtr(walPath), strPtr(walFile)))); protocolCommandParamAdd(command, VARSTR(strNewFmt("%s/%s", strPtr(walPath), strPtr(walFile))));
protocolCommandParamAdd(command, varNewStr(archiveInfo.archiveId)); protocolCommandParamAdd(command, VARSTR(archiveInfo.archiveId));
protocolCommandParamAdd(command, varNewUInt64(archiveInfo.pgVersion)); protocolCommandParamAdd(command, VARUINT64(archiveInfo.pgVersion));
protocolCommandParamAdd(command, varNewUInt64(archiveInfo.pgSystemId)); protocolCommandParamAdd(command, VARUINT64(archiveInfo.pgSystemId));
protocolCommandParamAdd(command, varNewStr(walFile)); protocolCommandParamAdd(command, VARSTR(walFile));
protocolCommandParamAdd(command, varNewUInt64(cipherType(cfgOptionStr(cfgOptRepoCipherType)))); protocolCommandParamAdd(command, VARUINT64(cipherType(cfgOptionStr(cfgOptRepoCipherType))));
protocolCommandParamAdd(command, varNewStr(archiveInfo.archiveCipherPass)); protocolCommandParamAdd(command, VARSTR(archiveInfo.archiveCipherPass));
protocolCommandParamAdd(command, varNewBool(cfgOptionBool(cfgOptCompress))); protocolCommandParamAdd(command, VARBOOL(cfgOptionBool(cfgOptCompress)));
protocolCommandParamAdd(command, varNewInt(cfgOptionInt(cfgOptCompressLevel))); protocolCommandParamAdd(command, VARINT(cfgOptionInt(cfgOptCompressLevel)));
protocolParallelJobAdd(parallelExec, protocolParallelJobNew(varNewStr(walFile), command)); protocolParallelJobAdd(parallelExec, protocolParallelJobNew(VARSTR(walFile), command));
} }
// Process jobs // Process jobs

View File

@ -237,7 +237,7 @@ helpRender(void)
section = STRDEF("command"); section = STRDEF("command");
} }
kvAdd(optionKv, varNewStr(section), varNewInt((int)optionDefId)); kvAdd(optionKv, VARSTR(section), VARINT((int)optionDefId));
if (strlen(cfgDefOptionName(optionDefId)) > optionSizeMax) if (strlen(cfgDefOptionName(optionDefId)) > optionSizeMax)
optionSizeMax = strlen(cfgDefOptionName(optionDefId)); optionSizeMax = strlen(cfgDefOptionName(optionDefId));
@ -254,7 +254,7 @@ helpRender(void)
strCatFmt(result, "\n%s Options:\n\n", strPtr(strFirstUpper(strDup(section)))); strCatFmt(result, "\n%s Options:\n\n", strPtr(strFirstUpper(strDup(section))));
// Output options // Output options
VariantList *optionList = kvGetList(optionKv, varNewStr(section)); VariantList *optionList = kvGetList(optionKv, VARSTR(section));
for (unsigned int optionIdx = 0; optionIdx < varLstSize(optionList); optionIdx++) for (unsigned int optionIdx = 0; optionIdx < varLstSize(optionList); optionIdx++)
{ {

View File

@ -28,39 +28,39 @@ Constants
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
STRING_STATIC(CFGOPTVAL_INFO_OUTPUT_TEXT_STR, "text"); STRING_STATIC(CFGOPTVAL_INFO_OUTPUT_TEXT_STR, "text");
// Naming convention: <sectionname>_KEY_<keyname>_STR. If the key exists in multiple sections, then <sectionname>_ is omitted. // Naming convention: <sectionname>_KEY_<keyname>_VAR. If the key exists in multiple sections, then <sectionname>_ is omitted.
STRING_STATIC(ARCHIVE_KEY_MIN_STR, "min"); VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MIN_VAR, "min");
STRING_STATIC(ARCHIVE_KEY_MAX_STR, "max"); VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MAX_VAR, "max");
STRING_STATIC(BACKREST_KEY_FORMAT_STR, "format"); VARIANT_STRDEF_STATIC(BACKREST_KEY_FORMAT_VAR, "format");
STRING_STATIC(BACKREST_KEY_VERSION_STR, "version"); VARIANT_STRDEF_STATIC(BACKREST_KEY_VERSION_VAR, "version");
STRING_STATIC(BACKUP_KEY_BACKREST_STR, "backrest"); VARIANT_STRDEF_STATIC(BACKUP_KEY_BACKREST_VAR, "backrest");
STRING_STATIC(BACKUP_KEY_INFO_STR, "info"); VARIANT_STRDEF_STATIC(BACKUP_KEY_INFO_VAR, "info");
STRING_STATIC(BACKUP_KEY_LABEL_STR, "label"); VARIANT_STRDEF_STATIC(BACKUP_KEY_LABEL_VAR, "label");
STRING_STATIC(BACKUP_KEY_PRIOR_STR, "prior"); VARIANT_STRDEF_STATIC(BACKUP_KEY_PRIOR_VAR, "prior");
STRING_STATIC(BACKUP_KEY_REFERENCE_STR, "reference"); VARIANT_STRDEF_STATIC(BACKUP_KEY_REFERENCE_VAR, "reference");
STRING_STATIC(BACKUP_KEY_TIMESTAMP_STR, "timestamp"); VARIANT_STRDEF_STATIC(BACKUP_KEY_TIMESTAMP_VAR, "timestamp");
STRING_STATIC(BACKUP_KEY_TYPE_STR, "type"); VARIANT_STRDEF_STATIC(BACKUP_KEY_TYPE_VAR, "type");
STRING_STATIC(DB_KEY_ID_STR, "id"); VARIANT_STRDEF_STATIC(DB_KEY_ID_VAR, "id");
STRING_STATIC(DB_KEY_SYSTEM_ID_STR, "system-id"); VARIANT_STRDEF_STATIC(DB_KEY_SYSTEM_ID_VAR, "system-id");
STRING_STATIC(DB_KEY_VERSION_STR, "version"); VARIANT_STRDEF_STATIC(DB_KEY_VERSION_VAR, "version");
STRING_STATIC(INFO_KEY_REPOSITORY_STR, "repository"); VARIANT_STRDEF_STATIC(INFO_KEY_REPOSITORY_VAR, "repository");
STRING_STATIC(KEY_ARCHIVE_STR, "archive"); VARIANT_STRDEF_STATIC(KEY_ARCHIVE_VAR, "archive");
STRING_STATIC(KEY_DATABASE_STR, "database"); VARIANT_STRDEF_STATIC(KEY_DATABASE_VAR, "database");
STRING_STATIC(KEY_DELTA_STR, "delta"); VARIANT_STRDEF_STATIC(KEY_DELTA_VAR, "delta");
STRING_STATIC(KEY_SIZE_STR, "size"); VARIANT_STRDEF_STATIC(KEY_SIZE_VAR, "size");
STRING_STATIC(KEY_START_STR, "start"); VARIANT_STRDEF_STATIC(KEY_START_VAR, "start");
STRING_STATIC(KEY_STOP_STR, "stop"); VARIANT_STRDEF_STATIC(KEY_STOP_VAR, "stop");
STRING_STATIC(STANZA_KEY_BACKUP_STR, "backup"); VARIANT_STRDEF_STATIC(STANZA_KEY_BACKUP_VAR, "backup");
STRING_STATIC(STANZA_KEY_CIPHER_STR, "cipher"); VARIANT_STRDEF_STATIC(STANZA_KEY_CIPHER_VAR, "cipher");
STRING_STATIC(STANZA_VALUE_CIPHER_NONE_STR, "none"); VARIANT_STRDEF_STATIC(STANZA_KEY_NAME_VAR, "name");
STRING_STATIC(STANZA_KEY_NAME_STR, "name"); VARIANT_STRDEF_STATIC(STANZA_KEY_STATUS_VAR, "status");
STRING_STATIC(STANZA_KEY_STATUS_STR, "status"); VARIANT_STRDEF_STATIC(STANZA_KEY_DB_VAR, "db");
STRING_STATIC(STANZA_KEY_DB_STR, "db"); VARIANT_STRDEF_STATIC(STATUS_KEY_CODE_VAR, "code");
STRING_STATIC(STATUS_KEY_CODE_STR, "code"); VARIANT_STRDEF_STATIC(STATUS_KEY_MESSAGE_VAR, "message");
STRING_STATIC(STATUS_KEY_MESSAGE_STR, "message");
#define INFO_STANZA_STATUS_OK "ok"
#define INFO_STANZA_STATUS_ERROR "error"
STRING_STATIC(INFO_STANZA_STATUS_OK, "ok");
STRING_STATIC(INFO_STANZA_STATUS_ERROR, "error");
#define INFO_STANZA_STATUS_CODE_OK 0 #define INFO_STANZA_STATUS_CODE_OK 0
STRING_STATIC(INFO_STANZA_STATUS_MESSAGE_OK_STR, "ok"); STRING_STATIC(INFO_STANZA_STATUS_MESSAGE_OK_STR, "ok");
#define INFO_STANZA_STATUS_CODE_MISSING_STANZA_PATH 1 #define INFO_STANZA_STATUS_CODE_MISSING_STANZA_PATH 1
@ -86,11 +86,10 @@ stanzaStatus(const int code, const String *message, Variant *stanzaInfo)
ASSERT(message != NULL); ASSERT(message != NULL);
ASSERT(stanzaInfo != NULL); ASSERT(stanzaInfo != NULL);
Variant *stanzaStatus = varNewStr(STANZA_KEY_STATUS_STR); KeyValue *statusKv = kvPutKv(varKv(stanzaInfo), STANZA_KEY_STATUS_VAR);
KeyValue *statusKv = kvPutKv(varKv(stanzaInfo), stanzaStatus);
kvAdd(statusKv, varNewStr(STATUS_KEY_CODE_STR), varNewInt(code)); kvAdd(statusKv, STATUS_KEY_CODE_VAR, VARINT(code));
kvAdd(statusKv, varNewStr(STATUS_KEY_MESSAGE_STR), varNewStr(message)); kvAdd(statusKv, STATUS_KEY_MESSAGE_VAR, VARSTR(message));
FUNCTION_TEST_RETURN_VOID(); FUNCTION_TEST_RETURN_VOID();
} }
@ -173,14 +172,13 @@ archiveDbList(const String *stanza, const InfoPgData *pgData, VariantList *archi
if (currentDb || archiveStart != NULL) if (currentDb || archiveStart != NULL)
{ {
// Add empty database section to archiveInfo and then fill in database id from the backup.info // Add empty database section to archiveInfo and then fill in database id from the backup.info
KeyValue *databaseInfo = kvPutKv(varKv(archiveInfo), varNewStr(KEY_DATABASE_STR)); KeyValue *databaseInfo = kvPutKv(varKv(archiveInfo), KEY_DATABASE_VAR);
kvAdd(databaseInfo, varNewStr(DB_KEY_ID_STR), varNewUInt64(pgData->id)); kvAdd(databaseInfo, DB_KEY_ID_VAR, VARUINT64(pgData->id));
kvPut(varKv(archiveInfo), varNewStr(DB_KEY_ID_STR), varNewStr(archiveId)); kvPut(varKv(archiveInfo), DB_KEY_ID_VAR, VARSTR(archiveId));
kvPut( kvPut(varKv(archiveInfo), ARCHIVE_KEY_MIN_VAR, (archiveStart != NULL ? VARSTR(archiveStart) : (Variant *)NULL));
varKv(archiveInfo), varNewStr(ARCHIVE_KEY_MIN_STR), (archiveStart != NULL ? varNewStr(archiveStart) : (Variant *)NULL)); kvPut(varKv(archiveInfo), ARCHIVE_KEY_MAX_VAR, (archiveStop != NULL ? VARSTR(archiveStop) : (Variant *)NULL));
kvPut(varKv(archiveInfo), varNewStr(ARCHIVE_KEY_MAX_STR), (archiveStop != NULL ? varNewStr(archiveStop) : (Variant *)NULL));
varLstAdd(archiveSection, archiveInfo); varLstAdd(archiveSection, archiveInfo);
} }
@ -211,53 +209,53 @@ backupList(VariantList *backupSection, InfoBackup *info)
Variant *backupInfo = varNewKv(); Variant *backupInfo = varNewKv();
// main keys // main keys
kvPut(varKv(backupInfo), varNewStr(BACKUP_KEY_LABEL_STR), varNewStr(backupData.backupLabel)); kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTR(backupData.backupLabel));
kvPut(varKv(backupInfo), varNewStr(BACKUP_KEY_TYPE_STR), varNewStr(backupData.backupType)); kvPut(varKv(backupInfo), BACKUP_KEY_TYPE_VAR, VARSTR(backupData.backupType));
kvPut( kvPut(
varKv(backupInfo), varNewStr(BACKUP_KEY_PRIOR_STR), varKv(backupInfo), BACKUP_KEY_PRIOR_VAR,
(backupData.backupPrior != NULL ? varNewStr(backupData.backupPrior) : NULL)); (backupData.backupPrior != NULL ? VARSTR(backupData.backupPrior) : NULL));
kvPut( kvPut(
varKv(backupInfo), varNewStr(BACKUP_KEY_REFERENCE_STR), varKv(backupInfo), BACKUP_KEY_REFERENCE_VAR,
(backupData.backupReference != NULL ? varNewVarLst(varLstNewStrLst(backupData.backupReference)) : NULL)); (backupData.backupReference != NULL ? varNewVarLst(varLstNewStrLst(backupData.backupReference)) : NULL));
// archive section // archive section
KeyValue *archiveInfo = kvPutKv(varKv(backupInfo), varNewStr(KEY_ARCHIVE_STR)); KeyValue *archiveInfo = kvPutKv(varKv(backupInfo), KEY_ARCHIVE_VAR);
kvAdd( kvAdd(
archiveInfo, varNewStr(KEY_START_STR), archiveInfo, KEY_START_VAR,
(backupData.backupArchiveStart != NULL ? varNewStr(backupData.backupArchiveStart) : NULL)); (backupData.backupArchiveStart != NULL ? VARSTR(backupData.backupArchiveStart) : NULL));
kvAdd( kvAdd(
archiveInfo, varNewStr(KEY_STOP_STR), archiveInfo, KEY_STOP_VAR,
(backupData.backupArchiveStop != NULL ? varNewStr(backupData.backupArchiveStop) : NULL)); (backupData.backupArchiveStop != NULL ? VARSTR(backupData.backupArchiveStop) : NULL));
// backrest section // backrest section
KeyValue *backrestInfo = kvPutKv(varKv(backupInfo), varNewStr(BACKUP_KEY_BACKREST_STR)); KeyValue *backrestInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_BACKREST_VAR);
kvAdd(backrestInfo, varNewStr(BACKREST_KEY_FORMAT_STR), varNewUInt64(backupData.backrestFormat)); kvAdd(backrestInfo, BACKREST_KEY_FORMAT_VAR, VARUINT64(backupData.backrestFormat));
kvAdd(backrestInfo, varNewStr(BACKREST_KEY_VERSION_STR), varNewStr(backupData.backrestVersion)); kvAdd(backrestInfo, BACKREST_KEY_VERSION_VAR, VARSTR(backupData.backrestVersion));
// database section // database section
KeyValue *dbInfo = kvPutKv(varKv(backupInfo), varNewStr(KEY_DATABASE_STR)); KeyValue *dbInfo = kvPutKv(varKv(backupInfo), KEY_DATABASE_VAR);
kvAdd(dbInfo, varNewStr(DB_KEY_ID_STR), varNewUInt64(backupData.backupPgId)); kvAdd(dbInfo, DB_KEY_ID_VAR, VARUINT64(backupData.backupPgId));
// info section // info section
KeyValue *infoInfo = kvPutKv(varKv(backupInfo), varNewStr(BACKUP_KEY_INFO_STR)); KeyValue *infoInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_INFO_VAR);
kvAdd(infoInfo, varNewStr(KEY_SIZE_STR), varNewUInt64(backupData.backupInfoSize)); kvAdd(infoInfo, KEY_SIZE_VAR, VARUINT64(backupData.backupInfoSize));
kvAdd(infoInfo, varNewStr(KEY_DELTA_STR), varNewUInt64(backupData.backupInfoSizeDelta)); kvAdd(infoInfo, KEY_DELTA_VAR, VARUINT64(backupData.backupInfoSizeDelta));
// info:repository section // info:repository section
KeyValue *repoInfo = kvPutKv(infoInfo, varNewStr(INFO_KEY_REPOSITORY_STR)); KeyValue *repoInfo = kvPutKv(infoInfo, INFO_KEY_REPOSITORY_VAR);
kvAdd(repoInfo, varNewStr(KEY_SIZE_STR), varNewUInt64(backupData.backupInfoRepoSize)); kvAdd(repoInfo, KEY_SIZE_VAR, VARUINT64(backupData.backupInfoRepoSize));
kvAdd(repoInfo, varNewStr(KEY_DELTA_STR), varNewUInt64(backupData.backupInfoRepoSizeDelta)); kvAdd(repoInfo, KEY_DELTA_VAR, VARUINT64(backupData.backupInfoRepoSizeDelta));
// timestamp section // timestamp section
KeyValue *timeInfo = kvPutKv(varKv(backupInfo), varNewStr(BACKUP_KEY_TIMESTAMP_STR)); KeyValue *timeInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_TIMESTAMP_VAR);
kvAdd(timeInfo, varNewStr(KEY_START_STR), varNewUInt64(backupData.backupTimestampStart)); kvAdd(timeInfo, KEY_START_VAR, VARUINT64(backupData.backupTimestampStart));
kvAdd(timeInfo, varNewStr(KEY_STOP_STR), varNewUInt64(backupData.backupTimestampStop)); kvAdd(timeInfo, KEY_STOP_VAR, VARUINT64(backupData.backupTimestampStop));
varLstAdd(backupSection, backupInfo); varLstAdd(backupSection, backupInfo);
} }
@ -331,8 +329,8 @@ stanzaInfoList(const String *stanza, StringList *stanzaList)
TRY_END(); TRY_END();
// Set the stanza name and cipher // Set the stanza name and cipher
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_NAME_STR), varNewStr(stanzaListName)); kvPut(varKv(stanzaInfo), STANZA_KEY_NAME_VAR, VARSTR(stanzaListName));
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_CIPHER_STR), varNewStr(STANZA_VALUE_CIPHER_NONE_STR)); kvPut(varKv(stanzaInfo), STANZA_KEY_CIPHER_VAR, VARSTR(CIPHER_TYPE_NONE_STR));
// If the backup.info file exists, get the database history information (newest to oldest) and corresponding archive // If the backup.info file exists, get the database history information (newest to oldest) and corresponding archive
if (info != NULL) if (info != NULL)
@ -342,16 +340,16 @@ stanzaInfoList(const String *stanza, StringList *stanzaList)
// out. No such mechanism exists so this will have to do for now. Probably the easiest thing to do is store the // out. No such mechanism exists so this will have to do for now. Probably the easiest thing to do is store the
// cipher type in the info file. // cipher type in the info file.
if (infoPgCipherPass(infoBackupPg(info)) != NULL) if (infoPgCipherPass(infoBackupPg(info)) != NULL)
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_CIPHER_STR), varNewStr(CIPHER_TYPE_AES_256_CBC_STR)); kvPut(varKv(stanzaInfo), STANZA_KEY_CIPHER_VAR, VARSTR(CIPHER_TYPE_AES_256_CBC_STR));
for (unsigned int pgIdx = infoPgDataTotal(infoBackupPg(info)) - 1; (int)pgIdx >= 0; pgIdx--) for (unsigned int pgIdx = infoPgDataTotal(infoBackupPg(info)) - 1; (int)pgIdx >= 0; pgIdx--)
{ {
InfoPgData pgData = infoPgData(infoBackupPg(info), pgIdx); InfoPgData pgData = infoPgData(infoBackupPg(info), pgIdx);
Variant *pgInfo = varNewKv(); Variant *pgInfo = varNewKv();
kvPut(varKv(pgInfo), varNewStr(DB_KEY_ID_STR), varNewUInt64(pgData.id)); kvPut(varKv(pgInfo), DB_KEY_ID_VAR, VARUINT64(pgData.id));
kvPut(varKv(pgInfo), varNewStr(DB_KEY_SYSTEM_ID_STR), varNewUInt64(pgData.systemId)); kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, VARUINT64(pgData.systemId));
kvPut(varKv(pgInfo), varNewStr(DB_KEY_VERSION_STR), varNewStr(pgVersionToStr(pgData.version))); kvPut(varKv(pgInfo), DB_KEY_VERSION_VAR, VARSTR(pgVersionToStr(pgData.version)));
varLstAdd(dbSection, pgInfo); varLstAdd(dbSection, pgInfo);
@ -367,19 +365,19 @@ stanzaInfoList(const String *stanza, StringList *stanzaList)
} }
// Add the database history, backup and archive sections to the stanza info // Add the database history, backup and archive sections to the stanza info
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_DB_STR), varNewVarLst(dbSection)); kvPut(varKv(stanzaInfo), STANZA_KEY_DB_VAR, varNewVarLst(dbSection));
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_BACKUP_STR), varNewVarLst(backupSection)); kvPut(varKv(stanzaInfo), STANZA_KEY_BACKUP_VAR, varNewVarLst(backupSection));
kvPut(varKv(stanzaInfo), varNewStr(KEY_ARCHIVE_STR), varNewVarLst(archiveSection)); kvPut(varKv(stanzaInfo), KEY_ARCHIVE_VAR, varNewVarLst(archiveSection));
// If a status has not already been set and there are no backups then set status to no backup // If a status has not already been set and there are no backups then set status to no backup
if (kvGet(varKv(stanzaInfo), varNewStr(STANZA_KEY_STATUS_STR)) == NULL && if (kvGet(varKv(stanzaInfo), STANZA_KEY_STATUS_VAR) == NULL &&
varLstSize(kvGetList(varKv(stanzaInfo), varNewStr(STANZA_KEY_BACKUP_STR))) == 0) varLstSize(kvGetList(varKv(stanzaInfo), STANZA_KEY_BACKUP_VAR)) == 0)
{ {
stanzaStatus(INFO_STANZA_STATUS_CODE_NO_BACKUP, INFO_STANZA_STATUS_MESSAGE_NO_BACKUP_STR, stanzaInfo); stanzaStatus(INFO_STANZA_STATUS_CODE_NO_BACKUP, INFO_STANZA_STATUS_MESSAGE_NO_BACKUP_STR, stanzaInfo);
} }
// If a status has still not been set then set it to OK // If a status has still not been set then set it to OK
if (kvGet(varKv(stanzaInfo), varNewStr(STANZA_KEY_STATUS_STR)) == NULL) if (kvGet(varKv(stanzaInfo), STANZA_KEY_STATUS_VAR) == NULL)
stanzaStatus(INFO_STANZA_STATUS_CODE_OK, INFO_STANZA_STATUS_MESSAGE_OK_STR, stanzaInfo); stanzaStatus(INFO_STANZA_STATUS_CODE_OK, INFO_STANZA_STATUS_MESSAGE_OK_STR, stanzaInfo);
varLstAdd(result, stanzaInfo); varLstAdd(result, stanzaInfo);
@ -390,10 +388,10 @@ stanzaInfoList(const String *stanza, StringList *stanzaList)
{ {
Variant *stanzaInfo = varNewKv(); Variant *stanzaInfo = varNewKv();
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_NAME_STR), varNewStr(stanza)); kvPut(varKv(stanzaInfo), STANZA_KEY_NAME_VAR, VARSTR(stanza));
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_DB_STR), varNewVarLst(varLstNew())); kvPut(varKv(stanzaInfo), STANZA_KEY_DB_VAR, varNewVarLst(varLstNew()));
kvPut(varKv(stanzaInfo), varNewStr(STANZA_KEY_BACKUP_STR), varNewVarLst(varLstNew())); kvPut(varKv(stanzaInfo), STANZA_KEY_BACKUP_VAR, varNewVarLst(varLstNew()));
stanzaStatus(INFO_STANZA_STATUS_CODE_MISSING_STANZA_PATH, INFO_STANZA_STATUS_MESSAGE_MISSING_STANZA_PATH_STR, stanzaInfo); stanzaStatus(INFO_STANZA_STATUS_CODE_MISSING_STANZA_PATH, INFO_STANZA_STATUS_MESSAGE_MISSING_STANZA_PATH_STR, stanzaInfo);
varLstAdd(result, stanzaInfo); varLstAdd(result, stanzaInfo);
@ -415,15 +413,15 @@ formatTextDb(const KeyValue *stanzaInfo, String *resultStr)
ASSERT(stanzaInfo != NULL); ASSERT(stanzaInfo != NULL);
VariantList *dbSection = kvGetList(stanzaInfo, varNewStr(STANZA_KEY_DB_STR)); VariantList *dbSection = kvGetList(stanzaInfo, STANZA_KEY_DB_VAR);
VariantList *archiveSection = kvGetList(stanzaInfo, varNewStr(KEY_ARCHIVE_STR)); VariantList *archiveSection = kvGetList(stanzaInfo, KEY_ARCHIVE_VAR);
VariantList *backupSection = kvGetList(stanzaInfo, varNewStr(STANZA_KEY_BACKUP_STR)); VariantList *backupSection = kvGetList(stanzaInfo, STANZA_KEY_BACKUP_VAR);
// For each database (working from oldest to newest) find the corresponding archive and backup info // For each database (working from oldest to newest) find the corresponding archive and backup info
for (unsigned int dbIdx = 0; dbIdx < varLstSize(dbSection); dbIdx++) for (unsigned int dbIdx = 0; dbIdx < varLstSize(dbSection); dbIdx++)
{ {
KeyValue *pgInfo = varKv(varLstGet(dbSection, dbIdx)); KeyValue *pgInfo = varKv(varLstGet(dbSection, dbIdx));
uint64_t dbId = varUInt64(kvGet(pgInfo, varNewStr(DB_KEY_ID_STR))); uint64_t dbId = varUInt64(kvGet(pgInfo, DB_KEY_ID_VAR));
// List is ordered so 0 is always the current DB index // List is ordered so 0 is always the current DB index
if (dbIdx == varLstSize(dbSection) - 1) if (dbIdx == varLstSize(dbSection) - 1)
@ -435,21 +433,21 @@ formatTextDb(const KeyValue *stanzaInfo, String *resultStr)
for (unsigned int archiveIdx = 0; archiveIdx < varLstSize(archiveSection); archiveIdx++) for (unsigned int archiveIdx = 0; archiveIdx < varLstSize(archiveSection); archiveIdx++)
{ {
KeyValue *archiveInfo = varKv(varLstGet(archiveSection, archiveIdx)); KeyValue *archiveInfo = varKv(varLstGet(archiveSection, archiveIdx));
KeyValue *archiveDbInfo = varKv(kvGet(archiveInfo, varNewStr(KEY_DATABASE_STR))); KeyValue *archiveDbInfo = varKv(kvGet(archiveInfo, KEY_DATABASE_VAR));
uint64_t archiveDbId = varUInt64(kvGet(archiveDbInfo, varNewStr(DB_KEY_ID_STR))); uint64_t archiveDbId = varUInt64(kvGet(archiveDbInfo, DB_KEY_ID_VAR));
if (archiveDbId == dbId) if (archiveDbId == dbId)
{ {
strCatFmt( strCatFmt(
archiveResult, "\n wal archive min/max (%s): ", archiveResult, "\n wal archive min/max (%s): ",
strPtr(varStr(kvGet(archiveInfo, varNewStr(DB_KEY_ID_STR))))); strPtr(varStr(kvGet(archiveInfo, DB_KEY_ID_VAR))));
// Get the archive min/max if there are any archives for the database // Get the archive min/max if there are any archives for the database
if (kvGet(archiveInfo, varNewStr(ARCHIVE_KEY_MIN_STR)) != NULL) if (kvGet(archiveInfo, ARCHIVE_KEY_MIN_VAR) != NULL)
{ {
strCatFmt( strCatFmt(
archiveResult, "%s/%s\n", strPtr(varStr(kvGet(archiveInfo, varNewStr(ARCHIVE_KEY_MIN_STR)))), archiveResult, "%s/%s\n", strPtr(varStr(kvGet(archiveInfo, ARCHIVE_KEY_MIN_VAR))),
strPtr(varStr(kvGet(archiveInfo, varNewStr(ARCHIVE_KEY_MAX_STR))))); strPtr(varStr(kvGet(archiveInfo, ARCHIVE_KEY_MAX_VAR))));
} }
else else
strCat(archiveResult, "none present\n"); strCat(archiveResult, "none present\n");
@ -462,22 +460,22 @@ formatTextDb(const KeyValue *stanzaInfo, String *resultStr)
for (unsigned int backupIdx = 0; backupIdx < varLstSize(backupSection); backupIdx++) for (unsigned int backupIdx = 0; backupIdx < varLstSize(backupSection); backupIdx++)
{ {
KeyValue *backupInfo = varKv(varLstGet(backupSection, backupIdx)); KeyValue *backupInfo = varKv(varLstGet(backupSection, backupIdx));
KeyValue *backupDbInfo = varKv(kvGet(backupInfo, varNewStr(KEY_DATABASE_STR))); KeyValue *backupDbInfo = varKv(kvGet(backupInfo, KEY_DATABASE_VAR));
uint64_t backupDbId = varUInt64(kvGet(backupDbInfo, varNewStr(DB_KEY_ID_STR))); uint64_t backupDbId = varUInt64(kvGet(backupDbInfo, DB_KEY_ID_VAR));
if (backupDbId == dbId) if (backupDbId == dbId)
{ {
strCatFmt( strCatFmt(
backupResult, "\n %s backup: %s\n", strPtr(varStr(kvGet(backupInfo, varNewStr(BACKUP_KEY_TYPE_STR)))), backupResult, "\n %s backup: %s\n", strPtr(varStr(kvGet(backupInfo, BACKUP_KEY_TYPE_VAR))),
strPtr(varStr(kvGet(backupInfo, varNewStr(BACKUP_KEY_LABEL_STR))))); strPtr(varStr(kvGet(backupInfo, BACKUP_KEY_LABEL_VAR))));
KeyValue *timestampInfo = varKv(kvGet(backupInfo, varNewStr(BACKUP_KEY_TIMESTAMP_STR))); KeyValue *timestampInfo = varKv(kvGet(backupInfo, BACKUP_KEY_TIMESTAMP_VAR));
// Get and format the backup start/stop time // Get and format the backup start/stop time
static char timeBufferStart[20]; static char timeBufferStart[20];
static char timeBufferStop[20]; static char timeBufferStop[20];
time_t timeStart = (time_t) varUInt64(kvGet(timestampInfo, varNewStr(KEY_START_STR))); time_t timeStart = (time_t) varUInt64(kvGet(timestampInfo, KEY_START_VAR));
time_t timeStop = (time_t) varUInt64(kvGet(timestampInfo, varNewStr(KEY_STOP_STR))); time_t timeStop = (time_t) varUInt64(kvGet(timestampInfo, KEY_STOP_VAR));
strftime(timeBufferStart, 20, "%Y-%m-%d %H:%M:%S", localtime(&timeStart)); strftime(timeBufferStart, 20, "%Y-%m-%d %H:%M:%S", localtime(&timeStart));
strftime(timeBufferStop, 20, "%Y-%m-%d %H:%M:%S", localtime(&timeStop)); strftime(timeBufferStop, 20, "%Y-%m-%d %H:%M:%S", localtime(&timeStop));
@ -486,34 +484,34 @@ formatTextDb(const KeyValue *stanzaInfo, String *resultStr)
backupResult, " timestamp start/stop: %s / %s\n", timeBufferStart, timeBufferStop); backupResult, " timestamp start/stop: %s / %s\n", timeBufferStart, timeBufferStop);
strCat(backupResult, " wal start/stop: "); strCat(backupResult, " wal start/stop: ");
KeyValue *archiveDBackupInfo = varKv(kvGet(backupInfo, varNewStr(KEY_ARCHIVE_STR))); KeyValue *archiveDBackupInfo = varKv(kvGet(backupInfo, KEY_ARCHIVE_VAR));
if (kvGet(archiveDBackupInfo, varNewStr(KEY_START_STR)) != NULL && if (kvGet(archiveDBackupInfo, KEY_START_VAR) != NULL &&
kvGet(archiveDBackupInfo, varNewStr(KEY_STOP_STR)) != NULL) kvGet(archiveDBackupInfo, KEY_STOP_VAR) != NULL)
{ {
strCatFmt(backupResult, "%s / %s\n", strPtr(varStr(kvGet(archiveDBackupInfo, varNewStr(KEY_START_STR)))), strCatFmt(backupResult, "%s / %s\n", strPtr(varStr(kvGet(archiveDBackupInfo, KEY_START_VAR))),
strPtr(varStr(kvGet(archiveDBackupInfo, varNewStr(KEY_STOP_STR))))); strPtr(varStr(kvGet(archiveDBackupInfo, KEY_STOP_VAR))));
} }
else else
strCat(backupResult, "n/a\n"); strCat(backupResult, "n/a\n");
KeyValue *info = varKv(kvGet(backupInfo, varNewStr(BACKUP_KEY_INFO_STR))); KeyValue *info = varKv(kvGet(backupInfo, BACKUP_KEY_INFO_VAR));
strCatFmt( strCatFmt(
backupResult, " database size: %s, backup size: %s\n", backupResult, " database size: %s, backup size: %s\n",
strPtr(strSizeFormat(varUInt64Force(kvGet(info, varNewStr(KEY_SIZE_STR))))), strPtr(strSizeFormat(varUInt64Force(kvGet(info, KEY_SIZE_VAR)))),
strPtr(strSizeFormat(varUInt64Force(kvGet(info, varNewStr(KEY_DELTA_STR)))))); strPtr(strSizeFormat(varUInt64Force(kvGet(info, KEY_DELTA_VAR)))));
KeyValue *repoInfo = varKv(kvGet(info, varNewStr(INFO_KEY_REPOSITORY_STR))); KeyValue *repoInfo = varKv(kvGet(info, INFO_KEY_REPOSITORY_VAR));
strCatFmt( strCatFmt(
backupResult, " repository size: %s, repository backup size: %s\n", backupResult, " repository size: %s, repository backup size: %s\n",
strPtr(strSizeFormat(varUInt64Force(kvGet(repoInfo, varNewStr(KEY_SIZE_STR))))), strPtr(strSizeFormat(varUInt64Force(kvGet(repoInfo, KEY_SIZE_VAR)))),
strPtr(strSizeFormat(varUInt64Force(kvGet(repoInfo, varNewStr(KEY_DELTA_STR)))))); strPtr(strSizeFormat(varUInt64Force(kvGet(repoInfo, KEY_DELTA_VAR)))));
if (kvGet(backupInfo, varNewStr(BACKUP_KEY_REFERENCE_STR)) != NULL) if (kvGet(backupInfo, BACKUP_KEY_REFERENCE_VAR) != NULL)
{ {
StringList *referenceList = strLstNewVarLst(varVarLst(kvGet(backupInfo, varNewStr(BACKUP_KEY_REFERENCE_STR)))); StringList *referenceList = strLstNewVarLst(varVarLst(kvGet(backupInfo, BACKUP_KEY_REFERENCE_VAR)));
strCatFmt(backupResult, " backup reference list: %s\n", strPtr(strLstJoin(referenceList, ", "))); strCatFmt(backupResult, " backup reference list: %s\n", strPtr(strLstJoin(referenceList, ", ")));
} }
} }
@ -575,23 +573,23 @@ infoRender(void)
// Stanza name and status // Stanza name and status
strCatFmt( strCatFmt(
resultStr, "stanza: %s\n status: ", strPtr(varStr(kvGet(stanzaInfo, varNewStr(STANZA_KEY_NAME_STR))))); resultStr, "stanza: %s\n status: ", strPtr(varStr(kvGet(stanzaInfo, STANZA_KEY_NAME_VAR))));
// If an error has occurred, provide the information that is available and move onto next stanza // If an error has occurred, provide the information that is available and move onto next stanza
KeyValue *stanzaStatus = varKv(kvGet(stanzaInfo, varNewStr(STANZA_KEY_STATUS_STR))); KeyValue *stanzaStatus = varKv(kvGet(stanzaInfo, STANZA_KEY_STATUS_VAR));
int statusCode = varInt(kvGet(stanzaStatus, varNewStr(STATUS_KEY_CODE_STR))); int statusCode = varInt(kvGet(stanzaStatus, STATUS_KEY_CODE_VAR));
if (statusCode != INFO_STANZA_STATUS_CODE_OK) if (statusCode != INFO_STANZA_STATUS_CODE_OK)
{ {
strCatFmt( strCatFmt(
resultStr, "%s (%s)\n", strPtr(INFO_STANZA_STATUS_ERROR), resultStr, "%s (%s)\n", INFO_STANZA_STATUS_ERROR,
strPtr(varStr(kvGet(stanzaStatus, varNewStr(STATUS_KEY_MESSAGE_STR))))); strPtr(varStr(kvGet(stanzaStatus, STATUS_KEY_MESSAGE_VAR))));
if (statusCode == INFO_STANZA_STATUS_CODE_MISSING_STANZA_DATA || if (statusCode == INFO_STANZA_STATUS_CODE_MISSING_STANZA_DATA ||
statusCode == INFO_STANZA_STATUS_CODE_NO_BACKUP) statusCode == INFO_STANZA_STATUS_CODE_NO_BACKUP)
{ {
strCatFmt( strCatFmt(
resultStr, " cipher: %s\n", strPtr(varStr(kvGet(stanzaInfo, varNewStr(STANZA_KEY_CIPHER_STR))))); resultStr, " cipher: %s\n", strPtr(varStr(kvGet(stanzaInfo, STANZA_KEY_CIPHER_VAR))));
// If there is a backup.info file but no backups, then process the archive info // If there is a backup.info file but no backups, then process the archive info
if (statusCode == INFO_STANZA_STATUS_CODE_NO_BACKUP) if (statusCode == INFO_STANZA_STATUS_CODE_NO_BACKUP)
@ -601,11 +599,11 @@ infoRender(void)
continue; continue;
} }
else else
strCatFmt(resultStr, "%s\n", strPtr(INFO_STANZA_STATUS_OK)); strCatFmt(resultStr, "%s\n", INFO_STANZA_STATUS_OK);
// Cipher // Cipher
strCatFmt(resultStr, " cipher: %s\n", strCatFmt(resultStr, " cipher: %s\n",
strPtr(varStr(kvGet(stanzaInfo, varNewStr(STANZA_KEY_CIPHER_STR))))); strPtr(varStr(kvGet(stanzaInfo, STANZA_KEY_CIPHER_VAR))));
formatTextDb(stanzaInfo, resultStr); formatTextDb(stanzaInfo, resultStr);
} }

View File

@ -60,16 +60,12 @@ iniGetInternal(const Ini *this, const String *section, const String *key)
const Variant *result = NULL; const Variant *result = NULL;
MEM_CONTEXT_TEMP_BEGIN() // Get the section
{ KeyValue *sectionKv = varKv(kvGet(this->store, VARSTR(section)));
// Get the section
KeyValue *sectionKv = varKv(kvGet(this->store, varNewStr(section)));
// Section must exist to get the value // Section must exist to get the value
if (sectionKv != NULL) if (sectionKv != NULL)
result = kvGet(sectionKv, varNewStr(key)); result = kvGet(sectionKv, VARSTR(key));
}
MEM_CONTEXT_TEMP_END();
FUNCTION_TEST_RETURN(result); FUNCTION_TEST_RETURN(result);
} }
@ -146,7 +142,7 @@ iniSectionKeyList(const Ini *this, const String *section)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
// Get the section // Get the section
KeyValue *sectionKv = varKv(kvGet(this->store, varNewStr(section))); KeyValue *sectionKv = varKv(kvGet(this->store, VARSTR(section)));
// Return key list if the section exists // Return key list if the section exists
if (sectionKv != NULL) if (sectionKv != NULL)
@ -254,7 +250,7 @@ iniParse(Ini *this, const String *content)
THROW_FMT(FormatError, "key is zero-length at line %u: %s", lineIdx++, linePtr); THROW_FMT(FormatError, "key is zero-length at line %u: %s", lineIdx++, linePtr);
// Extract the value // Extract the value
Variant *value = varNewStr(strTrim(strNew(lineEqual + 1))); const Variant *value = VARSTR(strTrim(strNew(lineEqual + 1)));
// Store the section/key/value // Store the section/key/value
iniSet(this, section, key, value); iniSet(this, section, key, value);
@ -290,13 +286,13 @@ iniSet(Ini *this, const String *section, const String *key, const Variant *value
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
Variant *sectionKey = varNewStr(section); const Variant *sectionKey = VARSTR(section);
KeyValue *sectionKv = varKv(kvGet(this->store, sectionKey)); KeyValue *sectionKv = varKv(kvGet(this->store, sectionKey));
if (sectionKv == NULL) if (sectionKv == NULL)
sectionKv = kvPutKv(this->store, sectionKey); sectionKv = kvPutKv(this->store, sectionKey);
kvAdd(sectionKv, varNewStr(key), value); kvAdd(sectionKv, VARSTR(key), value);
} }
MEM_CONTEXT_TEMP_END(); MEM_CONTEXT_TEMP_END();

View File

@ -342,7 +342,7 @@ ioFilterGroupClose(IoFilterGroup *this)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
kvAdd(this->filterResult, varNewStr(ioFilterType(filterData->filter)), filterResult); kvAdd(this->filterResult, VARSTR(ioFilterType(filterData->filter)), filterResult);
} }
MEM_CONTEXT_TEMP_END(); MEM_CONTEXT_TEMP_END();
} }
@ -408,7 +408,7 @@ ioFilterGroupResult(const IoFilterGroup *this, const String *filterType)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
result = kvGet(this->filterResult, varNewStr(filterType)); result = kvGet(this->filterResult, VARSTR(filterType));
} }
MEM_CONTEXT_TEMP_END(); MEM_CONTEXT_TEMP_END();

View File

@ -87,18 +87,14 @@ httpHeaderAdd(HttpHeader *this, const String *key, const String *value)
ASSERT(key != NULL); ASSERT(key != NULL);
ASSERT(value != NULL); ASSERT(value != NULL);
MEM_CONTEXT_BEGIN(this->memContext) // Make sure the key does not already exist
{ const Variant *keyVar = VARSTR(key);
// Make sure the key does not already exist
Variant *keyVar = varNewStr(key);
if (kvGet(this->kv, keyVar) != NULL) if (kvGet(this->kv, keyVar) != NULL)
THROW_FMT(AssertError, "key '%s' already exists", strPtr(key)); THROW_FMT(AssertError, "key '%s' already exists", strPtr(key));
// Store the key // Store the key
kvPut(this->kv, keyVar, varNewStr(value)); kvPut(this->kv, keyVar, VARSTR(value));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(this); FUNCTION_TEST_RETURN(this);
} }
@ -117,15 +113,7 @@ httpHeaderGet(const HttpHeader *this, const String *key)
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(key != NULL); ASSERT(key != NULL);
String *result = NULL; FUNCTION_TEST_RETURN(varStr(kvGet(this->kv, VARSTR(key))));
MEM_CONTEXT_BEGIN(this->memContext)
{
result = varStr(kvGet(this->kv, varNewStr(key)));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(result);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -178,12 +166,8 @@ httpHeaderPut(HttpHeader *this, const String *key, const String *value)
ASSERT(key != NULL); ASSERT(key != NULL);
ASSERT(value != NULL); ASSERT(value != NULL);
MEM_CONTEXT_BEGIN(this->memContext) // Store the key
{ kvPut(this->kv, VARSTR(key), VARSTR(value));
// Store the key
kvPut(this->kv, varNewStr(key), varNewStr(value));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(this); FUNCTION_TEST_RETURN(this);
} }

View File

@ -54,18 +54,14 @@ httpQueryAdd(HttpQuery *this, const String *key, const String *value)
ASSERT(key != NULL); ASSERT(key != NULL);
ASSERT(value != NULL); ASSERT(value != NULL);
MEM_CONTEXT_BEGIN(this->memContext) // Make sure the key does not already exist
{ const Variant *keyVar = VARSTR(key);
// Make sure the key does not already exist
Variant *keyVar = varNewStr(key);
if (kvGet(this->kv, keyVar) != NULL) if (kvGet(this->kv, keyVar) != NULL)
THROW_FMT(AssertError, "key '%s' already exists", strPtr(key)); THROW_FMT(AssertError, "key '%s' already exists", strPtr(key));
// Store the key // Store the key
kvPut(this->kv, keyVar, varNewStr(value)); kvPut(this->kv, keyVar, VARSTR(value));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(this); FUNCTION_TEST_RETURN(this);
} }
@ -84,15 +80,7 @@ httpQueryGet(const HttpQuery *this, const String *key)
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(key != NULL); ASSERT(key != NULL);
String *result = NULL; FUNCTION_TEST_RETURN(varStr(kvGet(this->kv, VARSTR(key))));
MEM_CONTEXT_BEGIN(this->memContext)
{
result = varStr(kvGet(this->kv, varNewStr(key)));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(result);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -145,12 +133,8 @@ httpQueryPut(HttpQuery *this, const String *key, const String *value)
ASSERT(key != NULL); ASSERT(key != NULL);
ASSERT(value != NULL); ASSERT(value != NULL);
MEM_CONTEXT_BEGIN(this->memContext) // Store the key
{ kvPut(this->kv, VARSTR(key), VARSTR(value));
// Store the key
kvPut(this->kv, varNewStr(key), varNewStr(value));
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN(this); FUNCTION_TEST_RETURN(this);
} }

View File

@ -436,7 +436,7 @@ kvToJsonInternal(const KeyValue *kv, String *indentSpace, String *indentDepth)
for (unsigned int keyIdx = 0; keyIdx < strLstSize(keyList); keyIdx++) for (unsigned int keyIdx = 0; keyIdx < strLstSize(keyList); keyIdx++)
{ {
String *key = strLstGet(keyList, keyIdx); String *key = strLstGet(keyList, keyIdx);
const Variant *value = kvGet(kv, varNewStr(key)); const Variant *value = kvGet(kv, VARSTR(key));
// If going to add another key, prepend a comma // If going to add another key, prepend a comma
if (keyIdx > 0) if (keyIdx > 0)

View File

@ -14,15 +14,81 @@ Variant Data Type
#include "common/type/convert.h" #include "common/type/convert.h"
#include "common/type/variant.h" #include "common/type/variant.h"
/***********************************************************************************************************************************
Constant variants that are generally useful
***********************************************************************************************************************************/
// Used to declare Bool Variant constants that will be externed using VARIANT_DECLARE(). Must be used in a .c file.
#define VARIANT_BOOL_EXTERN(name, dataParam) \
const Variant *name = ((const Variant *)&(const VariantBoolConst){.type = varTypeBool, .data = dataParam})
VARIANT_BOOL_EXTERN(BOOL_FALSE_VAR, false);
VARIANT_BOOL_EXTERN(BOOL_TRUE_VAR, true);
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Information about the variant Information about the variant
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
struct Variant struct Variant
{ {
MemContext *memContext; // Mem context
unsigned int type:3; // Variant Type unsigned int type:3; // Variant Type
MemContext *memContext; // Mem context
}; };
typedef struct VariantBool
{
VARIANT_COMMON
VARIANT_BOOL_COMMON
MemContext *memContext;
} VariantBool;
typedef struct VariantDouble
{
VARIANT_COMMON
VARIANT_DOUBLE_COMMON
MemContext *memContext;
} VariantDouble;
typedef struct VariantInt
{
VARIANT_COMMON
VARIANT_INT_COMMON
MemContext *memContext;
} VariantInt;
typedef struct VariantInt64
{
VARIANT_COMMON
VARIANT_INT64_COMMON
MemContext *memContext;
} VariantInt64;
typedef struct VariantKeyValue
{
VARIANT_COMMON
KeyValue *data; /* KeyValue data */
MemContext *memContext;
} VariantKeyValue;
typedef struct VariantString
{
VARIANT_COMMON
VARIANT_STRING_COMMON
MemContext *memContext;
} VariantString;
typedef struct VariantUInt64
{
VARIANT_COMMON
VARIANT_UINT64_COMMON
MemContext *memContext;
} VariantUInt64;
typedef struct VariantVariantList
{
VARIANT_COMMON
VariantList *data; /* VariantList data */
MemContext *memContext;
} VariantVariantList;
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Variant type names Variant type names
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
@ -38,47 +104,6 @@ static const char *variantTypeName[] =
"uint64", // varTypeUInt64 "uint64", // varTypeUInt64
}; };
/***********************************************************************************************************************************
New variant of any supported type
***********************************************************************************************************************************/
static Variant *
varNewInternal(VariantType type, void *data, size_t dataSize)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(ENUM, type);
FUNCTION_TEST_PARAM_P(VOID, data);
FUNCTION_TEST_PARAM(SIZE, dataSize);
FUNCTION_TEST_END();
ASSERT(data != NULL);
ASSERT(dataSize > 0);
// Allocate memory for the variant and set the type
Variant *this = memNew(sizeof(Variant) + dataSize);
this->memContext = memContextCurrent();
this->type = type;
// Copy data
memcpy((unsigned char *)this + sizeof(Variant), data, dataSize);
FUNCTION_TEST_RETURN(this);
}
/***********************************************************************************************************************************
Get a pointer to the data stored in the variant. This hides the complicated pointer arithmetic.
***********************************************************************************************************************************/
static void *
varData(const Variant *this)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(VARIANT, this);
FUNCTION_TEST_END();
ASSERT(this != NULL);
FUNCTION_TEST_RETURN((void *)((unsigned char *)this + sizeof(Variant)));
}
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Duplicate a variant Duplicate a variant
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
@ -127,8 +152,12 @@ varDup(const Variant *this)
case varTypeKeyValue: case varTypeKeyValue:
{ {
KeyValue *data = kvDup(varKv(this)); VariantKeyValue *keyValue = memNew(sizeof(VariantKeyValue));
result = varNewInternal(varTypeKeyValue, (void *)&data, sizeof(data)); keyValue->memContext = memContextCurrent();
keyValue->type = varTypeKeyValue;
keyValue->data = kvDup(varKv(this));
result = (Variant *)keyValue;
break; break;
} }
@ -244,7 +273,13 @@ varNewBool(bool data)
FUNCTION_TEST_PARAM(BOOL, data); FUNCTION_TEST_PARAM(BOOL, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
FUNCTION_TEST_RETURN(varNewInternal(varTypeBool, (void *)&data, sizeof(data))); // Allocate memory for the variant and set the type and data
VariantBool *this = memNew(sizeof(VariantBool));
this->memContext = memContextCurrent();
this->type = varTypeBool;
this->data = data;
FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -258,10 +293,9 @@ varBool(const Variant *this)
FUNCTION_TEST_END(); FUNCTION_TEST_END();
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(this->type == varTypeBool); ASSERT(this->type == varTypeBool);
FUNCTION_TEST_RETURN(*((bool *)varData(this))); FUNCTION_TEST_RETURN(((VariantBool *)this)->data);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -340,7 +374,13 @@ varNewDbl(double data)
FUNCTION_TEST_PARAM(DOUBLE, data); FUNCTION_TEST_PARAM(DOUBLE, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
FUNCTION_TEST_RETURN(varNewInternal(varTypeDouble, (unsigned char *)&data, sizeof(data))); // Allocate memory for the variant and set the type and data
VariantDouble *this = memNew(sizeof(VariantDouble));
this->memContext = memContextCurrent();
this->type = varTypeDouble;
this->data = data;
FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -354,10 +394,9 @@ varDbl(const Variant *this)
FUNCTION_TEST_END(); FUNCTION_TEST_END();
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(this->type == varTypeDouble); ASSERT(this->type == varTypeDouble);
FUNCTION_TEST_RETURN(*((double *)varData(this))); FUNCTION_TEST_RETURN(((VariantDouble *)this)->data);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -429,7 +468,13 @@ varNewInt(int data)
FUNCTION_TEST_PARAM(INT, data); FUNCTION_TEST_PARAM(INT, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
FUNCTION_TEST_RETURN(varNewInternal(varTypeInt, (void *)&data, sizeof(data))); // Allocate memory for the variant and set the type and data
VariantInt *this = memNew(sizeof(VariantInt));
this->memContext = memContextCurrent();
this->type = varTypeInt;
this->data = data;
FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -443,10 +488,9 @@ varInt(const Variant *this)
FUNCTION_TEST_END(); FUNCTION_TEST_END();
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(this->type == varTypeInt); ASSERT(this->type == varTypeInt);
FUNCTION_TEST_RETURN(*((int *)varData(this))); FUNCTION_TEST_RETURN(((VariantInt *)this)->data);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -528,7 +572,13 @@ varNewInt64(int64_t data)
FUNCTION_TEST_PARAM(INT64, data); FUNCTION_TEST_PARAM(INT64, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
FUNCTION_TEST_RETURN(varNewInternal(varTypeInt64, (void *)&data, sizeof(data))); // Allocate memory for the variant and set the type and data
VariantInt64 *this = memNew(sizeof(VariantInt64));
this->memContext = memContextCurrent();
this->type = varTypeInt64;
this->data = data;
FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -542,10 +592,9 @@ varInt64(const Variant *this)
FUNCTION_TEST_END(); FUNCTION_TEST_END();
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(this->type == varTypeInt64); ASSERT(this->type == varTypeInt64);
FUNCTION_TEST_RETURN(*((int64_t *)varData(this))); FUNCTION_TEST_RETURN(((VariantInt64 *)this)->data);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -622,7 +671,13 @@ varNewUInt64(uint64_t data)
FUNCTION_TEST_PARAM(UINT64, data); FUNCTION_TEST_PARAM(UINT64, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
FUNCTION_TEST_RETURN(varNewInternal(varTypeUInt64, (void *)&data, sizeof(data))); // Allocate memory for the variant and set the type and data
VariantUInt64 *this = memNew(sizeof(VariantUInt64));
this->memContext = memContextCurrent();
this->type = varTypeUInt64;
this->data = data;
FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -636,10 +691,9 @@ varUInt64(const Variant *this)
FUNCTION_TEST_END(); FUNCTION_TEST_END();
ASSERT(this != NULL); ASSERT(this != NULL);
ASSERT(this->type == varTypeUInt64); ASSERT(this->type == varTypeUInt64);
FUNCTION_TEST_RETURN(*((uint64_t *)varData(this))); FUNCTION_TEST_RETURN(((VariantUInt64 *)this)->data);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -725,10 +779,13 @@ varNewKv(void)
{ {
FUNCTION_TEST_VOID(); FUNCTION_TEST_VOID();
// Create a new kv for the variant // Allocate memory for the variant and set the type and data
KeyValue *data = kvNew(); VariantKeyValue *this = memNew(sizeof(VariantKeyValue));
this->memContext = memContextCurrent();
this->type = varTypeKeyValue;
this->data = kvNew();
FUNCTION_TEST_RETURN(varNewInternal(varTypeKeyValue, (void *)&data, sizeof(data))); FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -746,7 +803,7 @@ varKv(const Variant *this)
if (this != NULL) if (this != NULL)
{ {
ASSERT(this->type == varTypeKeyValue); ASSERT(this->type == varTypeKeyValue);
result = *((KeyValue **)varData(this)); result = ((VariantKeyValue *)this)->data;
} }
FUNCTION_TEST_RETURN(result); FUNCTION_TEST_RETURN(result);
@ -762,10 +819,13 @@ varNewStr(const String *data)
FUNCTION_TEST_PARAM(STRING, data); FUNCTION_TEST_PARAM(STRING, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
// Create a copy of the string for the variant // Allocate memory for the variant and set the type and data
String *dataCopy = strDup(data); VariantString *this = memNew(sizeof(VariantString));
this->memContext = memContextCurrent();
this->type = varTypeString;
this->data = strDup(data);
FUNCTION_TEST_RETURN(varNewInternal(varTypeString, (void *)&dataCopy, sizeof(dataCopy))); FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -778,19 +838,13 @@ varNewStrZ(const char *data)
FUNCTION_TEST_PARAM(STRINGZ, data); FUNCTION_TEST_PARAM(STRINGZ, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
// Create a string for the variant FUNCTION_TEST_RETURN(varNewStr(data == NULL ? NULL : strNew(data)));
String *dataCopy = NULL;
if (data != NULL)
dataCopy = strNew(data);
FUNCTION_TEST_RETURN(varNewInternal(varTypeString, (void *)&dataCopy, sizeof(dataCopy)));
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Return string Return string
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
String * const String *
varStr(const Variant *this) varStr(const Variant *this)
{ {
FUNCTION_TEST_BEGIN(); FUNCTION_TEST_BEGIN();
@ -802,7 +856,7 @@ varStr(const Variant *this)
if (this != NULL) if (this != NULL)
{ {
ASSERT(this->type == varTypeString); ASSERT(this->type == varTypeString);
result = *((String **)varData(this)); result = ((VariantString *)this)->data;
} }
FUNCTION_TEST_RETURN(result); FUNCTION_TEST_RETURN(result);
@ -892,13 +946,15 @@ varNewVarLst(const VariantList *data)
FUNCTION_TEST_PARAM(VARIANT_LIST, data); FUNCTION_TEST_PARAM(VARIANT_LIST, data);
FUNCTION_TEST_END(); FUNCTION_TEST_END();
VariantList *dataCopy = NULL; // Allocate memory for the variant and set the type and data
VariantVariantList *this = memNew(sizeof(VariantVariantList));
this->memContext = memContextCurrent();
this->type = varTypeVariantList;
// Create a copy of the variant list if it is not null
if (data != NULL) if (data != NULL)
dataCopy = varLstDup(data); this->data = varLstDup(data);
FUNCTION_TEST_RETURN(varNewInternal(varTypeVariantList, (void *)&dataCopy, sizeof(dataCopy))); FUNCTION_TEST_RETURN((Variant *)this);
} }
/*********************************************************************************************************************************** /***********************************************************************************************************************************
@ -916,7 +972,7 @@ varVarLst(const Variant *this)
if (this != NULL) if (this != NULL)
{ {
ASSERT(this->type == varTypeVariantList); ASSERT(this->type == varTypeVariantList);
result = *((VariantList **)varData(this)); result = ((VariantVariantList *)this)->data;
} }
FUNCTION_TEST_RETURN(result); FUNCTION_TEST_RETURN(result);
@ -981,40 +1037,71 @@ varFree(Variant *this)
if (this != NULL) if (this != NULL)
{ {
MEM_CONTEXT_BEGIN(this->memContext) MemContext *contextOld = memContextCurrent();
TRY_BEGIN()
{ {
switch (this->type) switch (this->type)
{
case varTypeKeyValue:
{ {
kvFree(varKv(this)); case varTypeBool:
break; {
} memContextSwitch(((VariantBool *)this)->memContext);
break;
}
case varTypeString: case varTypeDouble:
{ {
strFree(varStr(this)); memContextSwitch(((VariantDouble *)this)->memContext);
break; break;
} }
case varTypeVariantList: case varTypeInt:
{ {
varLstFree(varVarLst(this)); memContextSwitch(((VariantInt *)this)->memContext);
break; break;
} }
// Nothing additional to free for these types case varTypeInt64:
case varTypeBool: {
case varTypeDouble: memContextSwitch(((VariantInt64 *)this)->memContext);
case varTypeInt: break;
case varTypeInt64: }
case varTypeUInt64:
break; case varTypeKeyValue:
} {
memContextSwitch(((VariantKeyValue *)this)->memContext);
kvFree(((VariantKeyValue *)this)->data);
break;
}
case varTypeString:
{
memContextSwitch(((VariantString *)this)->memContext);
strFree(((VariantString *)this)->data);
break;
}
case varTypeUInt64:
{
memContextSwitch(((VariantUInt64 *)this)->memContext);
break;
}
case varTypeVariantList:
{
memContextSwitch(((VariantVariantList *)this)->memContext);
varLstFree(((VariantVariantList *)this)->data);
break;
}
}
memFree(this); memFree(this);
} }
MEM_CONTEXT_END(); FINALLY()
{
memContextSwitch(contextOld);
}
TRY_END();
} }
FUNCTION_TEST_RETURN_VOID(); FUNCTION_TEST_RETURN_VOID();

View File

@ -68,7 +68,7 @@ KeyValue *varKv(const Variant *this);
Variant *varNewStr(const String *data); Variant *varNewStr(const String *data);
Variant *varNewStrZ(const char *data); Variant *varNewStrZ(const char *data);
String *varStr(const Variant *this); const String *varStr(const Variant *this);
String *varStrForce(const Variant *this); String *varStrForce(const Variant *this);
Variant *varNewUInt64(uint64_t data); Variant *varNewUInt64(uint64_t data);
@ -84,6 +84,129 @@ VariantType varType(const Variant *this);
void varFree(Variant *this); void varFree(Variant *this);
/***********************************************************************************************************************************
Fields that are common between dynamically allocated and constant variants
There is nothing user-accessible here but this construct allows constant variants to be created and then handled by the same
functions that process dynamically allocated variant.
***********************************************************************************************************************************/
#define VARIANT_COMMON \
VariantType type; /* Variant type */
#define VARIANT_BOOL_COMMON \
bool data; /* Boolean data */
typedef struct VariantBoolConst
{
VARIANT_COMMON
const VARIANT_BOOL_COMMON
} VariantBoolConst;
#define VARIANT_DOUBLE_COMMON \
double data; /* Double data */
typedef struct VariantDoubleConst
{
VARIANT_COMMON
const VARIANT_DOUBLE_COMMON
} VariantDoubleConst;
#define VARIANT_INT_COMMON \
int data; /* Signed integer data */
typedef struct VariantIntConst
{
VARIANT_COMMON
const VARIANT_INT_COMMON
} VariantIntConst;
#define VARIANT_INT64_COMMON \
int64_t data; /* 64-bit signed integer data */
typedef struct VariantInt64Const
{
VARIANT_COMMON
const VARIANT_INT64_COMMON
} VariantInt64Const;
#define VARIANT_STRING_COMMON \
String *data; /* String data */
typedef struct VariantStringConst
{
VARIANT_COMMON
const VARIANT_STRING_COMMON
} VariantStringConst;
#define VARIANT_UINT64_COMMON \
uint64_t data; /* 64-bit unsigned integer data */
typedef struct VariantUInt64Const
{
VARIANT_COMMON
const VARIANT_UINT64_COMMON
} VariantUInt64Const;
/***********************************************************************************************************************************
Macros for constant variants
Frequently used constant variants can be declared with these macros at compile time rather than dynamically at run time.
Note that variants created in this way are declared as const so can't be modified or freed by the var*() methods. Casting to
Variant * will generally result in a segfault.
By convention all variant constant identifiers are appended with _VAR.
***********************************************************************************************************************************/
// Create a Bool Variant constant inline from a bool
#define VARBOOL(dataParam) \
(dataParam ? BOOL_TRUE_VAR : BOOL_FALSE_VAR)
// Create a Double Variant constant inline from a double
#define VARDBL(dataParam) \
((const Variant *)&(const VariantDoubleConst){.type = varTypeDouble, .data = dataParam})
// Create an Int Variant constant inline from an int
#define VARINT(dataParam) \
((const Variant *)&(const VariantIntConst){.type = varTypeInt, .data = dataParam})
// Create an Int64 Variant constant inline from an int64_t
#define VARINT64(dataParam) \
((const Variant *)&(const VariantInt64Const){.type = varTypeInt64, .data = dataParam})
// Create a String Variant constant inline from any zero-terminated string
#define VARSTRZ(dataParam) \
((const Variant *)&(const VariantStringConst){.type = varTypeString, .data = STR(dataParam)})
// Create a String Variant constant inline from a #define or inline string constant
#define VARSTRDEF(dataParam) \
((const Variant *)&(const VariantStringConst){.type = varTypeString, .data = STRDEF(dataParam)})
// Create a String Variant constant inline from a String constant
#define VARSTR(dataParam) \
((const Variant *)&(const VariantStringConst){.type = varTypeString, .data = dataParam})
// Used to declare String Variant constants that will be externed using VARIANT_DECLARE(). Must be used in a .c file.
#define VARIANT_STRDEF_EXTERN(name, dataParam) \
const Variant *name = VARSTRDEF(dataParam)
// Used to declare String Variant constants that will be local to the .c file. Must be used in a .c file.
#define VARIANT_STRDEF_STATIC(name, dataParam) \
static const Variant *name = VARSTRDEF(dataParam)
// Create a UInt64 Variant constant inline from a uint64_t
#define VARUINT64(dataParam) \
((const Variant *)&(const VariantUInt64Const){.type = varTypeUInt64, .data = dataParam})
// Used to extern String Variant constants declared with VARIANT_STRDEF_EXTERN/STATIC(). Must be used in a .h file.
#define VARIANT_DECLARE(name) \
extern const Variant *name
/***********************************************************************************************************************************
Constant variants that are generally useful
***********************************************************************************************************************************/
VARIANT_DECLARE(BOOL_FALSE_VAR);
VARIANT_DECLARE(BOOL_TRUE_VAR);
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Macros for function logging Macros for function logging
***********************************************************************************************************************************/ ***********************************************************************************************************************************/

View File

@ -35,7 +35,7 @@ cfgExecParam(ConfigCommand commandId, const KeyValue *optionReplace)
continue; continue;
// First check for a replacement // First check for a replacement
const Variant *key = varNewStr(STR(cfgOptionName(optionId))); const Variant *key = VARSTRZ(cfgOptionName(optionId));
const Variant *value = NULL; const Variant *value = NULL;
bool exists = false; bool exists = false;
@ -55,7 +55,7 @@ cfgExecParam(ConfigCommand commandId, const KeyValue *optionReplace)
if (value == NULL && cfgOptionValid(optionId)) if (value == NULL && cfgOptionValid(optionId))
{ {
if (cfgOptionNegate(optionId)) if (cfgOptionNegate(optionId))
value = varNewBool(false); value = BOOL_FALSE_VAR;
else if (cfgOptionSource(optionId) != cfgSourceDefault) else if (cfgOptionSource(optionId) != cfgSourceDefault)
value = cfgOption(optionId); value = cfgOption(optionId);
} }

View File

@ -65,7 +65,7 @@ cfgLoadUpdateOption(void)
// Set default for repo-host-cmd // Set default for repo-host-cmd
if (cfgOptionTest(cfgOptRepoHost) && cfgOptionSource(cfgOptRepoHostCmd) == cfgSourceDefault) if (cfgOptionTest(cfgOptRepoHost) && cfgOptionSource(cfgOptRepoHostCmd) == cfgSourceDefault)
cfgOptionDefaultSet(cfgOptRepoHostCmd, varNewStr(cfgExe())); cfgOptionDefaultSet(cfgOptRepoHostCmd, VARSTR(cfgExe()));
// Set default for pg-host-cmd // Set default for pg-host-cmd
if (cfgOptionValid(cfgOptPgHostCmd)) if (cfgOptionValid(cfgOptPgHostCmd))
@ -73,7 +73,7 @@ cfgLoadUpdateOption(void)
for (unsigned int optionIdx = 0; optionIdx < cfgOptionIndexTotal(cfgOptPgHost); optionIdx++) for (unsigned int optionIdx = 0; optionIdx < cfgOptionIndexTotal(cfgOptPgHost); optionIdx++)
{ {
if (cfgOptionTest(cfgOptPgHost + optionIdx) && cfgOptionSource(cfgOptPgHostCmd + optionIdx) == cfgSourceDefault) if (cfgOptionTest(cfgOptPgHost + optionIdx) && cfgOptionSource(cfgOptPgHostCmd + optionIdx) == cfgSourceDefault)
cfgOptionDefaultSet(cfgOptPgHostCmd + optionIdx, varNewStr(cfgExe())); cfgOptionDefaultSet(cfgOptPgHostCmd + optionIdx, VARSTR(cfgExe()));
} }
} }
@ -83,7 +83,7 @@ cfgLoadUpdateOption(void)
{ {
// If protocol-timeout is default then increase it to be greater than db-timeout // If protocol-timeout is default then increase it to be greater than db-timeout
if (cfgOptionSource(cfgOptProtocolTimeout) == cfgSourceDefault) if (cfgOptionSource(cfgOptProtocolTimeout) == cfgSourceDefault)
cfgOptionSet(cfgOptProtocolTimeout, cfgSourceDefault, varNewDbl(cfgOptionDbl(cfgOptDbTimeout) + 30)); cfgOptionSet(cfgOptProtocolTimeout, cfgSourceDefault, VARDBL(cfgOptionDbl(cfgOptDbTimeout) + 30));
else if (cfgOptionSource(cfgOptDbTimeout) == cfgSourceDefault) else if (cfgOptionSource(cfgOptDbTimeout) == cfgSourceDefault)
{ {
double dbTimeout = cfgOptionDbl(cfgOptProtocolTimeout) - 30; double dbTimeout = cfgOptionDbl(cfgOptProtocolTimeout) - 30;
@ -91,11 +91,11 @@ cfgLoadUpdateOption(void)
// Normally the protocol time will be greater than 45 seconds so db timeout can be at least 15 seconds // Normally the protocol time will be greater than 45 seconds so db timeout can be at least 15 seconds
if (dbTimeout >= 15) if (dbTimeout >= 15)
{ {
cfgOptionSet(cfgOptDbTimeout, cfgSourceDefault, varNewDbl(dbTimeout)); cfgOptionSet(cfgOptDbTimeout, cfgSourceDefault, VARDBL(dbTimeout));
} }
// But in some test cases the protocol timeout will be very small so make db timeout half of protocol timeout // But in some test cases the protocol timeout will be very small so make db timeout half of protocol timeout
else else
cfgOptionSet(cfgOptDbTimeout, cfgSourceDefault, varNewDbl(cfgOptionDbl(cfgOptProtocolTimeout) / 2)); cfgOptionSet(cfgOptDbTimeout, cfgSourceDefault, VARDBL(cfgOptionDbl(cfgOptProtocolTimeout) / 2));
} }
else else
{ {
@ -172,7 +172,7 @@ cfgLoadUpdateOption(void)
if (cfgOptionTest(cfgOptRepoRetentionFull + optionIdx)) if (cfgOptionTest(cfgOptRepoRetentionFull + optionIdx))
{ {
cfgOptionSet(cfgOptRepoRetentionArchive + optionIdx, cfgSourceDefault, cfgOptionSet(cfgOptRepoRetentionArchive + optionIdx, cfgSourceDefault,
varNewInt(cfgOptionInt(cfgOptRepoRetentionFull + optionIdx))); VARINT(cfgOptionInt(cfgOptRepoRetentionFull + optionIdx)));
} }
} }
else if (strEqZ(archiveRetentionType, CFGOPTVAL_TMP_REPO_RETENTION_ARCHIVE_TYPE_DIFF)) else if (strEqZ(archiveRetentionType, CFGOPTVAL_TMP_REPO_RETENTION_ARCHIVE_TYPE_DIFF))
@ -181,7 +181,7 @@ cfgLoadUpdateOption(void)
if (cfgOptionTest(cfgOptRepoRetentionDiff + optionIdx)) if (cfgOptionTest(cfgOptRepoRetentionDiff + optionIdx))
{ {
cfgOptionSet(cfgOptRepoRetentionArchive + optionIdx, cfgSourceDefault, cfgOptionSet(cfgOptRepoRetentionArchive + optionIdx, cfgSourceDefault,
varNewInt(cfgOptionInt(cfgOptRepoRetentionDiff + optionIdx))); VARINT(cfgOptionInt(cfgOptRepoRetentionDiff + optionIdx)));
} }
else else
{ {

View File

@ -173,8 +173,8 @@ convertToByte(String **value, double *valueDbl)
} }
// Convert string to bytes // Convert string to bytes
double newDbl = varDblForce(varNewStr(result)) * multiplier; double newDbl = varDblForce(VARSTR(result)) * multiplier;
result = varStrForce(varNewDbl(newDbl)); result = varStrForce(VARDBL(newDbl));
// If nothing has blown up then safe to overwrite the original values // If nothing has blown up then safe to overwrite the original values
*valueDbl = newDbl; *valueDbl = newDbl;
@ -718,7 +718,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
} }
// Make sure this option does not appear in the same section with an alternate name // Make sure this option does not appear in the same section with an alternate name
Variant *optionFoundKey = varNewInt(optionId); const Variant *optionFoundKey = VARINT(optionId);
const Variant *optionFoundName = kvGet(optionFound, optionFoundKey); const Variant *optionFoundName = kvGet(optionFound, optionFoundKey);
if (optionFoundName != NULL) if (optionFoundName != NULL)
@ -728,7 +728,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
strPtr(key), strPtr(varStr(optionFoundName)), strPtr(section)); strPtr(key), strPtr(varStr(optionFoundName)), strPtr(section));
} }
else else
kvPut(optionFound, optionFoundKey, varNewStr(key)); kvPut(optionFound, optionFoundKey, VARSTR(key));
// Continue if the option is not valid for this command // Continue if the option is not valid for this command
if (!cfgDefOptionValid(commandDefId, optionDefId)) if (!cfgDefOptionValid(commandDefId, optionDefId))
@ -854,9 +854,9 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
if (dependOptionDefType == cfgDefOptTypeBoolean) if (dependOptionDefType == cfgDefOptTypeBoolean)
{ {
if (cfgOptionBool(dependOptionId)) if (cfgOptionBool(dependOptionId))
dependValue = varNewStrZ("1"); dependValue = VARSTRDEF("1");
else else
dependValue = varNewStrZ("0"); dependValue = VARSTRDEF("0");
} }
} }
@ -956,7 +956,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
{ {
if (optionDefType == cfgDefOptTypeBoolean) if (optionDefType == cfgDefOptTypeBoolean)
{ {
cfgOptionSet(optionId, parseOption->source, varNewBool(!parseOption->negate)); cfgOptionSet(optionId, parseOption->source, VARBOOL(!parseOption->negate));
} }
else if (optionDefType == cfgDefOptTypeHash) else if (optionDefType == cfgDefOptTypeHash)
{ {
@ -975,7 +975,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
strPtr(strLstGet(parseOption->valueList, listIdx)), cfgOptionName(optionId)); strPtr(strLstGet(parseOption->valueList, listIdx)), cfgOptionName(optionId));
} }
kvPut(keyValue, varNewStr(strNewN(pair, (size_t)(equal - pair))), varNewStr(STR(equal + 1))); kvPut(keyValue, VARSTR(strNewN(pair, (size_t)(equal - pair))), VARSTRZ(equal + 1));
} }
cfgOptionSet(optionId, parseOption->source, value); cfgOptionSet(optionId, parseOption->source, value);
@ -1000,14 +1000,14 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
if (optionDefType == cfgDefOptTypeInteger) if (optionDefType == cfgDefOptTypeInteger)
{ {
valueDbl = (double)varInt64Force(varNewStr(value)); valueDbl = (double)varInt64Force(VARSTR(value));
} }
else if (optionDefType == cfgDefOptTypeSize) else if (optionDefType == cfgDefOptTypeSize)
{ {
convertToByte(&value, &valueDbl); convertToByte(&value, &valueDbl);
} }
else else
valueDbl = varDblForce(varNewStr(value)); valueDbl = varDblForce(VARSTR(value));
} }
CATCH(AssertError) CATCH(AssertError)
{ {
@ -1072,7 +1072,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
cfgOptionName(optionId)); cfgOptionName(optionId));
} }
cfgOptionSet(optionId, parseOption->source, varNewStr(value)); cfgOptionSet(optionId, parseOption->source, VARSTR(value));
} }
} }
else if (parseOption->negate) else if (parseOption->negate)
@ -1084,7 +1084,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel)
const char *value = cfgDefOptionDefault(commandDefId, optionDefId); const char *value = cfgDefOptionDefault(commandDefId, optionDefId);
if (value != NULL) if (value != NULL)
cfgOptionSet(optionId, cfgSourceDefault, varNewStrZ(value)); cfgOptionSet(optionId, cfgSourceDefault, VARSTRZ(value));
else if (cfgOptionIndex(optionId) == 0 && cfgDefOptionRequired(commandDefId, optionDefId) && else if (cfgOptionIndex(optionId) == 0 && cfgDefOptionRequired(commandDefId, optionDefId) &&
!cfgCommandHelp()) !cfgCommandHelp())
{ {

View File

@ -159,7 +159,7 @@ infoLoad(Info *this, const Storage *storage, bool copyFile, CipherType cipherTyp
iniParse(this->ini, strNewBuf(buffer)); iniParse(this->ini, strNewBuf(buffer));
// Make sure the ini is valid by testing the checksum // Make sure the ini is valid by testing the checksum
String *infoChecksum = varStr(iniGet(this->ini, INFO_SECTION_BACKREST_STR, INFO_KEY_CHECKSUM_STR)); const String *infoChecksum = varStr(iniGet(this->ini, INFO_SECTION_BACKREST_STR, INFO_KEY_CHECKSUM_STR));
CryptoHash *hash = infoHash(this->ini); CryptoHash *hash = infoHash(this->ini);
@ -255,13 +255,10 @@ infoNew(const Storage *storage, const String *fileName, CipherType cipherType, c
TRY_END(); TRY_END();
// Load the cipher passphrase if it exists // Load the cipher passphrase if it exists
String *cipherPass = varStr(iniGetDefault(this->ini, INFO_SECTION_CIPHER_STR, INFO_KEY_CIPHER_PASS_STR, NULL)); const String *cipherPass = varStr(iniGetDefault(this->ini, INFO_SECTION_CIPHER_STR, INFO_KEY_CIPHER_PASS_STR, NULL));
if (cipherPass != NULL) if (cipherPass != NULL)
{
this->cipherPass = strSubN(cipherPass, 1, strSize(cipherPass) - 2); this->cipherPass = strSubN(cipherPass, 1, strSize(cipherPass) - 2);
strFree(cipherPass);
}
} }
MEM_CONTEXT_NEW_END(); MEM_CONTEXT_NEW_END();

View File

@ -26,11 +26,11 @@ Internal constants
#define INFO_BACKUP_SECTION "backup" #define INFO_BACKUP_SECTION "backup"
#define INFO_BACKUP_SECTION_BACKUP_CURRENT INFO_BACKUP_SECTION ":current" #define INFO_BACKUP_SECTION_BACKUP_CURRENT INFO_BACKUP_SECTION ":current"
STRING_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_STR, "backup-info-repo-size"); VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_VAR, "backup-info-repo-size");
STRING_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_DELTA_STR, "backup-info-repo-size-delta"); VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_DELTA_VAR, "backup-info-repo-size-delta");
STRING_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_STR, "backup-info-size"); VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_VAR, "backup-info-size");
STRING_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_DELTA_STR, "backup-info-size-delta"); VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_DELTA_VAR, "backup-info-size-delta");
STRING_STATIC(INFO_BACKUP_KEY_BACKUP_REFERENCE_STR, "backup-reference"); VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_REFERENCE_VAR, "backup-reference");
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Object type Object type
@ -104,35 +104,34 @@ infoBackupNew(const Storage *storage, const String *fileName, bool ignoreMissing
InfoBackupData infoBackupData = InfoBackupData infoBackupData =
{ {
.backrestFormat = (unsigned int)varUInt64(kvGet(backupKv, varNewStr(INFO_KEY_FORMAT_STR))), .backrestFormat = (unsigned int)varUInt64(kvGet(backupKv, VARSTR(INFO_KEY_FORMAT_STR))),
.backrestVersion = varStrForce(kvGet(backupKv, varNewStr(INFO_KEY_VERSION_STR))), .backrestVersion = varStrForce(kvGet(backupKv, VARSTR(INFO_KEY_VERSION_STR))),
.backupInfoRepoSize = varUInt64(kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_STR))), .backupInfoRepoSize = varUInt64(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_VAR)),
.backupInfoRepoSizeDelta = varUInt64( .backupInfoRepoSizeDelta = varUInt64(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_DELTA_VAR)),
kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_DELTA_STR))), .backupInfoSize = varUInt64(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_INFO_SIZE_VAR)),
.backupInfoSize = varUInt64(kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_STR))), .backupInfoSizeDelta = varUInt64(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_INFO_SIZE_DELTA_VAR)),
.backupInfoSizeDelta = varUInt64(kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_DELTA_STR))),
.backupLabel = strDup(backupLabelKey), .backupLabel = strDup(backupLabelKey),
.backupPgId = cvtZToUInt(strPtr(varStrForce(kvGet(backupKv, varNewStr(INFO_KEY_DB_ID_STR))))), .backupPgId = cvtZToUInt(strPtr(varStrForce(kvGet(backupKv, INFO_KEY_DB_ID_VAR)))),
.backupTimestampStart = varUInt64(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_STR))), .backupTimestampStart = varUInt64(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_VAR)),
.backupTimestampStop= varUInt64(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_STR))), .backupTimestampStop= varUInt64(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_VAR)),
.backupType = varStrForce(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_TYPE_STR))), .backupType = varStrForce(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_TYPE_VAR)),
// Possible NULL values // Possible NULL values
.backupArchiveStart = varStr(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_STR))), .backupArchiveStart = varStr(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_VAR)),
.backupArchiveStop = varStr(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_STR))), .backupArchiveStop = varStr(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_VAR)),
.backupPrior = varStr(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_BACKUP_PRIOR_STR))), .backupPrior = varStr(kvGet(backupKv, INFO_MANIFEST_KEY_BACKUP_PRIOR_VAR)),
.backupReference = (kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_REFERENCE_STR)) != NULL ? .backupReference =
strLstNewVarLst(varVarLst(kvGet(backupKv, varNewStr(INFO_BACKUP_KEY_BACKUP_REFERENCE_STR)))) : kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_REFERENCE_VAR) != NULL ?
NULL), strLstNewVarLst(varVarLst(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_REFERENCE_VAR))) : NULL,
// Options // Options
.optionArchiveCheck = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_STR))), .optionArchiveCheck = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_VAR)),
.optionArchiveCopy = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_STR))), .optionArchiveCopy = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_VAR)),
.optionBackupStandby = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_STR))), .optionBackupStandby = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_VAR)),
.optionChecksumPage = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_STR))), .optionChecksumPage = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_VAR)),
.optionCompress = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_COMPRESS_STR))), .optionCompress = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_COMPRESS_VAR)),
.optionHardlink = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_HARDLINK_STR))), .optionHardlink = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_HARDLINK_VAR)),
.optionOnline = varBool(kvGet(backupKv, varNewStr(INFO_MANIFEST_KEY_OPT_ONLINE_STR))), .optionOnline = varBool(kvGet(backupKv, INFO_MANIFEST_KEY_OPT_ONLINE_VAR)),
}; };
// Add the backup data to the list // Add the backup data to the list

View File

@ -1,22 +1,21 @@
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Manifest Info Handler Manifest Info Handler
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
#include "common/type/string.h"
#include "info/infoManifest.h" #include "info/infoManifest.h"
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Constants Constants
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_STR, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_VAR, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START);
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_STR, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_VAR, INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP);
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_PRIOR_STR, INFO_MANIFEST_KEY_BACKUP_PRIOR); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_PRIOR_VAR, INFO_MANIFEST_KEY_BACKUP_PRIOR);
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_STR, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_VAR, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START);
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_STR, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_VAR, INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP);
STRING_EXTERN(INFO_MANIFEST_KEY_BACKUP_TYPE_STR, INFO_MANIFEST_KEY_BACKUP_TYPE); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_BACKUP_TYPE_VAR, INFO_MANIFEST_KEY_BACKUP_TYPE);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_STR, INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_VAR, INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_STR, INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_VAR, INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_STR, INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_VAR, INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_STR, INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_VAR, INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_COMPRESS_STR, INFO_MANIFEST_KEY_OPT_COMPRESS); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_COMPRESS_VAR, INFO_MANIFEST_KEY_OPT_COMPRESS);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_HARDLINK_STR, INFO_MANIFEST_KEY_OPT_HARDLINK); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_HARDLINK_VAR, INFO_MANIFEST_KEY_OPT_HARDLINK);
STRING_EXTERN(INFO_MANIFEST_KEY_OPT_ONLINE_STR, INFO_MANIFEST_KEY_OPT_ONLINE); VARIANT_STRDEF_EXTERN(INFO_MANIFEST_KEY_OPT_ONLINE_VAR, INFO_MANIFEST_KEY_OPT_ONLINE);

View File

@ -4,34 +4,36 @@ Manifest Info Handler
#ifndef INFO_INFOMANIFEST_H #ifndef INFO_INFOMANIFEST_H
#define INFO_INFOMANIFEST_H #define INFO_INFOMANIFEST_H
#include "common/type/variant.h"
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Constants Constants
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
#define INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START "backup-archive-start" #define INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START "backup-archive-start"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_START_VAR);
#define INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP "backup-archive-stop" #define INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP "backup-archive-stop"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_ARCHIVE_STOP_VAR);
#define INFO_MANIFEST_KEY_BACKUP_PRIOR "backup-prior" #define INFO_MANIFEST_KEY_BACKUP_PRIOR "backup-prior"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_PRIOR_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_PRIOR_VAR);
#define INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START "backup-timestamp-start" #define INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START "backup-timestamp-start"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_START_VAR);
#define INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP "backup-timestamp-stop" #define INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP "backup-timestamp-stop"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_TIMESTAMP_STOP_VAR);
#define INFO_MANIFEST_KEY_BACKUP_TYPE "backup-type" #define INFO_MANIFEST_KEY_BACKUP_TYPE "backup-type"
STRING_DECLARE(INFO_MANIFEST_KEY_BACKUP_TYPE_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_BACKUP_TYPE_VAR);
#define INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK "option-archive-check" #define INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK "option-archive-check"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_ARCHIVE_CHECK_VAR);
#define INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY "option-archive-copy" #define INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY "option-archive-copy"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_ARCHIVE_COPY_VAR);
#define INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY "option-backup-standby" #define INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY "option-backup-standby"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_BACKUP_STANDBY_VAR);
#define INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE "option-checksum-page" #define INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE "option-checksum-page"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_CHECKSUM_PAGE_VAR);
#define INFO_MANIFEST_KEY_OPT_COMPRESS "option-compress" #define INFO_MANIFEST_KEY_OPT_COMPRESS "option-compress"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_COMPRESS_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_COMPRESS_VAR);
#define INFO_MANIFEST_KEY_OPT_HARDLINK "option-hardlink" #define INFO_MANIFEST_KEY_OPT_HARDLINK "option-hardlink"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_HARDLINK_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_HARDLINK_VAR);
#define INFO_MANIFEST_KEY_OPT_ONLINE "option-online" #define INFO_MANIFEST_KEY_OPT_ONLINE "option-online"
STRING_DECLARE(INFO_MANIFEST_KEY_OPT_ONLINE_STR); VARIANT_DECLARE(INFO_MANIFEST_KEY_OPT_ONLINE_VAR);
#endif #endif

View File

@ -22,14 +22,14 @@ PostgreSQL Info Handler
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Internal constants Internal constants
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
STRING_STATIC(INFO_SECTION_DB_STR, "db"); STRING_STATIC(INFO_SECTION_DB_STR, "db");
STRING_STATIC(INFO_SECTION_DB_HISTORY_STR, "db:history"); STRING_STATIC(INFO_SECTION_DB_HISTORY_STR, "db:history");
STRING_EXTERN(INFO_KEY_DB_ID_STR, INFO_KEY_DB_ID); VARIANT_STRDEF_EXTERN(INFO_KEY_DB_ID_VAR, INFO_KEY_DB_ID);
STRING_STATIC(INFO_KEY_DB_CATALOG_VERSION_STR, "db-catalog-version"); VARIANT_STRDEF_STATIC(INFO_KEY_DB_CATALOG_VERSION_VAR, "db-catalog-version");
STRING_STATIC(INFO_KEY_DB_CONTROL_VERSION_STR, "db-control-version"); VARIANT_STRDEF_STATIC(INFO_KEY_DB_CONTROL_VERSION_VAR, "db-control-version");
STRING_STATIC(INFO_KEY_DB_SYSTEM_ID_STR, "db-system-id"); VARIANT_STRDEF_STATIC(INFO_KEY_DB_SYSTEM_ID_VAR, "db-system-id");
STRING_STATIC(INFO_KEY_DB_VERSION_STR, "db-version"); VARIANT_STRDEF_STATIC(INFO_KEY_DB_VERSION_VAR, "db-version");
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Object type Object type
@ -80,15 +80,10 @@ infoPgNew(const Storage *storage, const String *fileName, InfoPgType type, Ciphe
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
const Ini *infoPgIni = infoIni(this->info); const Ini *infoPgIni = infoIni(this->info);
const String *pgSection = INFO_SECTION_DB_STR; const StringList *pgHistoryKey = iniSectionKeyList(infoPgIni, INFO_SECTION_DB_HISTORY_STR);
const String *pgHistorySection = INFO_SECTION_DB_HISTORY_STR;
const StringList *pgHistoryKey = iniSectionKeyList(infoPgIni, pgHistorySection);
const Variant *idKey = varNewStr(INFO_KEY_DB_ID_STR);
const Variant *systemIdKey = varNewStr(INFO_KEY_DB_SYSTEM_ID_STR);
const Variant *versionKey = varNewStr(INFO_KEY_DB_VERSION_STR);
// Get the current history id // Get the current history id
unsigned int pgId = (unsigned int)varUInt64Force(iniGet(infoPgIni, pgSection, varStr(idKey))); unsigned int pgId = (unsigned int)varUInt64Force(iniGet(infoPgIni, INFO_SECTION_DB_STR, varStr(INFO_KEY_DB_ID_VAR)));
// History must include at least one item or the file is corrupt // History must include at least one item or the file is corrupt
ASSERT(strLstSize(pgHistoryKey) > 0); ASSERT(strLstSize(pgHistoryKey) > 0);
@ -100,16 +95,17 @@ infoPgNew(const Storage *storage, const String *fileName, InfoPgType type, Ciphe
{ {
// Load JSON data into a KeyValue // Load JSON data into a KeyValue
const KeyValue *pgDataKv = varKv( const KeyValue *pgDataKv = varKv(
jsonToVar(varStr(iniGet(infoPgIni, pgHistorySection, strLstGet(pgHistoryKey, pgHistoryIdx))))); jsonToVar(varStr(iniGet(infoPgIni, INFO_SECTION_DB_HISTORY_STR, strLstGet(pgHistoryKey, pgHistoryIdx)))));
// Get db values that are common to all info files // Get db values that are common to all info files
InfoPgData infoPgData = InfoPgData infoPgData =
{ {
.id = cvtZToUInt(strPtr(strLstGet(pgHistoryKey, pgHistoryIdx))), .id = cvtZToUInt(strPtr(strLstGet(pgHistoryKey, pgHistoryIdx))),
.version = pgVersionFromStr(varStr(kvGet(pgDataKv, versionKey))), .version = pgVersionFromStr(varStr(kvGet(pgDataKv, INFO_KEY_DB_VERSION_VAR))),
// This is different in archive.info due to a typo that can't be fixed without a format version bump // This is different in archive.info due to a typo that can't be fixed without a format version bump
.systemId = varUInt64Force(kvGet(pgDataKv, type == infoPgArchive ? idKey : systemIdKey)), .systemId = varUInt64Force(
kvGet(pgDataKv, type == infoPgArchive ? INFO_KEY_DB_ID_VAR : INFO_KEY_DB_SYSTEM_ID_VAR)),
}; };
// Set index if this is the current history item // Set index if this is the current history item
@ -121,11 +117,8 @@ infoPgNew(const Storage *storage, const String *fileName, InfoPgType type, Ciphe
// we must write them at least, even if we give up reading them. // we must write them at least, even if we give up reading them.
if (type == infoPgBackup || type == infoPgManifest) if (type == infoPgBackup || type == infoPgManifest)
{ {
const Variant *catalogVersionKey = varNewStr(INFO_KEY_DB_CATALOG_VERSION_STR); infoPgData.catalogVersion = (unsigned int)varUInt64Force(kvGet(pgDataKv, INFO_KEY_DB_CATALOG_VERSION_VAR));
const Variant *controlVersionKey = varNewStr(INFO_KEY_DB_CONTROL_VERSION_STR); infoPgData.controlVersion = (unsigned int)varUInt64Force(kvGet(pgDataKv, INFO_KEY_DB_CONTROL_VERSION_VAR));
infoPgData.catalogVersion = (unsigned int)varUInt64Force(kvGet(pgDataKv, catalogVersionKey));
infoPgData.controlVersion = (unsigned int)varUInt64Force(kvGet(pgDataKv, controlVersionKey));
} }
else if (type != infoPgArchive) else if (type != infoPgArchive)
THROW_FMT(AssertError, "invalid InfoPg type %u", type); THROW_FMT(AssertError, "invalid InfoPg type %u", type);

View File

@ -19,7 +19,7 @@ typedef struct InfoPg InfoPg;
Constants Constants
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
#define INFO_KEY_DB_ID "db-id" #define INFO_KEY_DB_ID "db-id"
STRING_DECLARE(INFO_KEY_DB_ID_STR); VARIANT_DECLARE(INFO_KEY_DB_ID_VAR);
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Information about the PostgreSQL cluster Information about the PostgreSQL cluster

View File

@ -31,37 +31,37 @@ perlOptionJson(void)
Variant *optionVar = varNewKv(); Variant *optionVar = varNewKv();
// Add valid // Add valid
kvPut(varKv(optionVar), varNewStr(STRDEF("valid")), varNewBool(true)); kvPut(varKv(optionVar), VARSTRDEF("valid"), BOOL_TRUE_VAR);
// Add source // Add source
const char *source = NULL; const Variant *source = NULL;
switch (cfgOptionSource(optionId)) switch (cfgOptionSource(optionId))
{ {
case cfgSourceParam: case cfgSourceParam:
{ {
source = "param"; source = VARSTRDEF("param");
break; break;
} }
case cfgSourceConfig: case cfgSourceConfig:
{ {
source = "config"; source = VARSTRDEF("config");
break; break;
} }
case cfgSourceDefault: case cfgSourceDefault:
{ {
source = "default"; source = VARSTRDEF("default");
break; break;
} }
} }
kvPut(varKv(optionVar), varNewStr(STRDEF("source")), varNewStr(STR(source))); kvPut(varKv(optionVar), VARSTRDEF("source"), source);
// Add negate and reset // Add negate and reset
kvPut(varKv(optionVar), varNewStr(STRDEF("negate")), varNewBool(cfgOptionNegate(optionId))); kvPut(varKv(optionVar), VARSTRDEF("negate"), VARBOOL(cfgOptionNegate(optionId)));
kvPut(varKv(optionVar), varNewStr(STRDEF("reset")), varNewBool(cfgOptionReset(optionId))); kvPut(varKv(optionVar), VARSTRDEF("reset"), VARBOOL(cfgOptionReset(optionId)));
// Add value if it is set // Add value if it is set
if (cfgOptionTest(optionId)) if (cfgOptionTest(optionId))
@ -101,16 +101,16 @@ perlOptionJson(void)
const VariantList *valueList = cfgOptionLst(optionId); const VariantList *valueList = cfgOptionLst(optionId);
for (unsigned int listIdx = 0; listIdx < varLstSize(valueList); listIdx++) for (unsigned int listIdx = 0; listIdx < varLstSize(valueList); listIdx++)
kvPut(varKv(valueVar), varLstGet(valueList, listIdx), varNewBool(true)); kvPut(varKv(valueVar), varLstGet(valueList, listIdx), BOOL_TRUE_VAR);
break; break;
} }
} }
kvPut(varKv(optionVar), varNewStr(STRDEF("value")), valueVar); kvPut(varKv(optionVar), VARSTRDEF("value"), valueVar);
} }
kvPut(configKv, varNewStr(STR(cfgOptionName(optionId))), optionVar); kvPut(configKv, VARSTRZ(cfgOptionName(optionId)), optionVar);
} }
memContextSwitch(MEM_CONTEXT_OLD()); memContextSwitch(MEM_CONTEXT_OLD());

View File

@ -85,7 +85,7 @@ protocolClientNew(const String *name, const String *service, IoRead *read, IoWri
const String *expectedKey = expected[expectedIdx * 2]; const String *expectedKey = expected[expectedIdx * 2];
const String *expectedValue = expected[expectedIdx * 2 + 1]; const String *expectedValue = expected[expectedIdx * 2 + 1];
const Variant *actualValue = kvGet(greetingKv, varNewStr(expectedKey)); const Variant *actualValue = kvGet(greetingKv, VARSTR(expectedKey));
if (actualValue == NULL) if (actualValue == NULL)
THROW_FMT(ProtocolError, "unable to find greeting key '%s'", strPtr(expectedKey)); THROW_FMT(ProtocolError, "unable to find greeting key '%s'", strPtr(expectedKey));
@ -136,11 +136,11 @@ protocolClientReadOutput(ProtocolClient *this, bool outputRequired)
KeyValue *responseKv = varKv(jsonToVar(response)); KeyValue *responseKv = varKv(jsonToVar(response));
// Process error if any // Process error if any
const Variant *error = kvGet(responseKv, varNewStr(PROTOCOL_ERROR_STR)); const Variant *error = kvGet(responseKv, VARSTR(PROTOCOL_ERROR_STR));
if (error != NULL) if (error != NULL)
{ {
const String *message = varStr(kvGet(responseKv, varNewStr(PROTOCOL_OUTPUT_STR))); const String *message = varStr(kvGet(responseKv, VARSTR(PROTOCOL_OUTPUT_STR)));
THROWP_FMT( THROWP_FMT(
errorTypeFromCode(varIntForce(error)), "%s: %s", strPtr(this->errorPrefix), errorTypeFromCode(varIntForce(error)), "%s: %s", strPtr(this->errorPrefix),
@ -148,7 +148,7 @@ protocolClientReadOutput(ProtocolClient *this, bool outputRequired)
} }
// Get output // Get output
result = kvGet(responseKv, varNewStr(PROTOCOL_OUTPUT_STR)); result = kvGet(responseKv, VARSTR(PROTOCOL_OUTPUT_STR));
if (outputRequired) if (outputRequired)
{ {

View File

@ -112,10 +112,10 @@ protocolCommandJson(const ProtocolCommand *this)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
KeyValue *command = kvPut(kvNew(), varNewStr(PROTOCOL_KEY_COMMAND_STR), varNewStr(this->command)); KeyValue *command = kvPut(kvNew(), VARSTR(PROTOCOL_KEY_COMMAND_STR), VARSTR(this->command));
if (this->parameterList != NULL) if (this->parameterList != NULL)
kvPut(command, varNewStr(PROTOCOL_KEY_PARAMETER_STR), this->parameterList); kvPut(command, VARSTR(PROTOCOL_KEY_PARAMETER_STR), this->parameterList);
memContextSwitch(MEM_CONTEXT_OLD()); memContextSwitch(MEM_CONTEXT_OLD());
result = kvToJson(command, 0); result = kvToJson(command, 0);

View File

@ -1,6 +1,8 @@
/*********************************************************************************************************************************** /***********************************************************************************************************************************
Protocol Helper Protocol Helper
***********************************************************************************************************************************/ ***********************************************************************************************************************************/
#include <string.h>
#include "common/crypto/common.h" #include "common/crypto/common.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/exec.h" #include "common/exec.h"
@ -85,24 +87,24 @@ protocolLocalParam(ProtocolStorageType protocolStorageType, unsigned int protoco
KeyValue *optionReplace = kvNew(); KeyValue *optionReplace = kvNew();
// Add the command option // Add the command option
kvPut(optionReplace, varNewStr(CFGOPT_COMMAND_STR), varNewStrZ(cfgCommandName(cfgCommand()))); kvPut(optionReplace, VARSTR(CFGOPT_COMMAND_STR), VARSTRZ(cfgCommandName(cfgCommand())));
// Add the process id -- used when more than one process will be called // Add the process id -- used when more than one process will be called
kvPut(optionReplace, varNewStr(CFGOPT_PROCESS_STR), varNewInt((int)protocolId)); kvPut(optionReplace, VARSTR(CFGOPT_PROCESS_STR), VARINT((int)protocolId));
// Add the host id -- for now this is hard-coded to 1 // Add the host id -- for now this is hard-coded to 1
kvPut(optionReplace, varNewStr(CFGOPT_HOST_ID_STR), varNewInt(1)); kvPut(optionReplace, VARSTR(CFGOPT_HOST_ID_STR), VARINT(1));
// Add the type // Add the type
kvPut(optionReplace, varNewStr(CFGOPT_TYPE_STR), varNewStrZ("backup")); kvPut(optionReplace, VARSTR(CFGOPT_TYPE_STR), VARSTRDEF("backup"));
// Only enable file logging on the local when requested // Only enable file logging on the local when requested
kvPut( kvPut(
optionReplace, varNewStr(CFGOPT_LOG_LEVEL_FILE_STR), optionReplace, VARSTR(CFGOPT_LOG_LEVEL_FILE_STR),
cfgOptionBool(cfgOptLogSubprocess) ? cfgOption(cfgOptLogLevelFile) : varNewStrZ("off")); cfgOptionBool(cfgOptLogSubprocess) ? cfgOption(cfgOptLogLevelFile) : VARSTRDEF("off"));
// Always output errors on stderr for debugging purposes // Always output errors on stderr for debugging purposes
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_STDERR_STR), varNewStrZ("error")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_STDERR_STR), VARSTRDEF("error"));
result = strLstMove(cfgExecParam(cfgCmdLocal, optionReplace), MEM_CONTEXT_OLD()); result = strLstMove(cfgExecParam(cfgCmdLocal, optionReplace), MEM_CONTEXT_OLD());
} }
@ -202,36 +204,36 @@ protocolRemoteParam(ProtocolStorageType protocolStorageType, unsigned int protoc
// Replace config options with the host versions // Replace config options with the host versions
if (cfgOptionSource(cfgOptRepoHostConfig) != cfgSourceDefault) if (cfgOptionSource(cfgOptRepoHostConfig) != cfgSourceDefault)
kvPut(optionReplace, varNewStr(CFGOPT_CONFIG_STR), cfgOption(cfgOptRepoHostConfig)); kvPut(optionReplace, VARSTR(CFGOPT_CONFIG_STR), cfgOption(cfgOptRepoHostConfig));
if (cfgOptionSource(cfgOptRepoHostConfigIncludePath) != cfgSourceDefault) if (cfgOptionSource(cfgOptRepoHostConfigIncludePath) != cfgSourceDefault)
kvPut(optionReplace, varNewStr(CFGOPT_CONFIG_INCLUDE_PATH_STR), cfgOption(cfgOptRepoHostConfigIncludePath)); kvPut(optionReplace, VARSTR(CFGOPT_CONFIG_INCLUDE_PATH_STR), cfgOption(cfgOptRepoHostConfigIncludePath));
if (cfgOptionSource(cfgOptRepoHostConfigPath) != cfgSourceDefault) if (cfgOptionSource(cfgOptRepoHostConfigPath) != cfgSourceDefault)
kvPut(optionReplace, varNewStr(CFGOPT_CONFIG_PATH_STR), cfgOption(cfgOptRepoHostConfigPath)); kvPut(optionReplace, VARSTR(CFGOPT_CONFIG_PATH_STR), cfgOption(cfgOptRepoHostConfigPath));
// Add the command option (or use the current command option if it is valid) // Add the command option (or use the current command option if it is valid)
if (!cfgOptionTest(cfgOptCommand)) if (!cfgOptionTest(cfgOptCommand))
kvPut(optionReplace, varNewStr(CFGOPT_COMMAND_STR), varNewStrZ(cfgCommandName(cfgCommand()))); kvPut(optionReplace, VARSTR(CFGOPT_COMMAND_STR), VARSTRZ(cfgCommandName(cfgCommand())));
// Add the process id (or use the current process id if it is valid) // Add the process id (or use the current process id if it is valid)
if (!cfgOptionTest(cfgOptProcess)) if (!cfgOptionTest(cfgOptProcess))
kvPut(optionReplace, varNewStr(CFGOPT_PROCESS_STR), varNewInt((int)protocolId)); kvPut(optionReplace, VARSTR(CFGOPT_PROCESS_STR), VARINT((int)protocolId));
// Don't pass log-path or lock-path since these are host specific // Don't pass log-path or lock-path since these are host specific
kvPut(optionReplace, varNewStr(CFGOPT_LOG_PATH_STR), NULL); kvPut(optionReplace, VARSTR(CFGOPT_LOG_PATH_STR), NULL);
kvPut(optionReplace, varNewStr(CFGOPT_LOCK_PATH_STR), NULL); kvPut(optionReplace, VARSTR(CFGOPT_LOCK_PATH_STR), NULL);
// Only enable file logging on the remote when requested // Only enable file logging on the remote when requested
kvPut( kvPut(
optionReplace, varNewStr(CFGOPT_LOG_LEVEL_FILE_STR), optionReplace, VARSTR(CFGOPT_LOG_LEVEL_FILE_STR),
cfgOptionBool(cfgOptLogSubprocess) ? cfgOption(cfgOptLogLevelFile) : varNewStrZ("off")); cfgOptionBool(cfgOptLogSubprocess) ? cfgOption(cfgOptLogLevelFile) : VARSTRDEF("off"));
// Always output errors on stderr for debugging purposes // Always output errors on stderr for debugging purposes
kvPut(optionReplace, varNewStr(CFGOPT_LOG_LEVEL_STDERR_STR), varNewStrZ("error")); kvPut(optionReplace, VARSTR(CFGOPT_LOG_LEVEL_STDERR_STR), VARSTRDEF("error"));
// Add the type // Add the type
kvPut(optionReplace, varNewStr(CFGOPT_TYPE_STR), varNewStrZ("backup")); kvPut(optionReplace, VARSTR(CFGOPT_TYPE_STR), VARSTRDEF("backup"));
StringList *commandExec = cfgExecParam(cfgCmdRemote, optionReplace); StringList *commandExec = cfgExecParam(cfgCmdRemote, optionReplace);
strLstInsert(commandExec, 0, cfgOptionStr(cfgOptRepoHostCmd)); strLstInsert(commandExec, 0, cfgOptionStr(cfgOptRepoHostCmd));

View File

@ -61,9 +61,9 @@ protocolServerNew(const String *name, const String *service, IoRead *read, IoWri
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
KeyValue *greetingKv = kvNew(); KeyValue *greetingKv = kvNew();
kvPut(greetingKv, varNewStr(PROTOCOL_GREETING_NAME_STR), varNewStrZ(PROJECT_NAME)); kvPut(greetingKv, VARSTR(PROTOCOL_GREETING_NAME_STR), VARSTRZ(PROJECT_NAME));
kvPut(greetingKv, varNewStr(PROTOCOL_GREETING_SERVICE_STR), varNewStr(service)); kvPut(greetingKv, VARSTR(PROTOCOL_GREETING_SERVICE_STR), VARSTR(service));
kvPut(greetingKv, varNewStr(PROTOCOL_GREETING_VERSION_STR), varNewStrZ(PROJECT_VERSION)); kvPut(greetingKv, VARSTR(PROTOCOL_GREETING_VERSION_STR), VARSTRZ(PROJECT_VERSION));
ioWriteLine(this->write, kvToJson(greetingKv, 0)); ioWriteLine(this->write, kvToJson(greetingKv, 0));
ioWriteFlush(this->write); ioWriteFlush(this->write);
@ -108,8 +108,8 @@ protocolServerError(ProtocolServer *this, int code, const String *message)
ASSERT(message != NULL); ASSERT(message != NULL);
KeyValue *error = kvNew(); KeyValue *error = kvNew();
kvPut(error, varNewStr(PROTOCOL_ERROR_STR), varNewInt(errorCode())); kvPut(error, VARSTR(PROTOCOL_ERROR_STR), VARINT(errorCode()));
kvPut(error, varNewStr(PROTOCOL_OUTPUT_STR), varNewStrZ(errorMessage())); kvPut(error, VARSTR(PROTOCOL_OUTPUT_STR), VARSTRZ(errorMessage()));
ioWriteLine(this->write, kvToJson(error, 0)); ioWriteLine(this->write, kvToJson(error, 0));
ioWriteFlush(this->write); ioWriteFlush(this->write);
@ -138,8 +138,8 @@ protocolServerProcess(ProtocolServer *this)
{ {
// Read command // Read command
KeyValue *commandKv = varKv(jsonToVar(ioReadLine(this->read))); KeyValue *commandKv = varKv(jsonToVar(ioReadLine(this->read)));
String *command = varStr(kvGet(commandKv, varNewStr(PROTOCOL_KEY_COMMAND_STR))); const String *command = varStr(kvGet(commandKv, VARSTR(PROTOCOL_KEY_COMMAND_STR)));
VariantList *paramList = varVarLst(kvGet(commandKv, varNewStr(PROTOCOL_KEY_PARAMETER_STR))); VariantList *paramList = varVarLst(kvGet(commandKv, VARSTR(PROTOCOL_KEY_PARAMETER_STR)));
// Process command // Process command
bool found = false; bool found = false;
@ -199,7 +199,7 @@ protocolServerResponse(ProtocolServer *this, const Variant *output)
KeyValue *result = kvNew(); KeyValue *result = kvNew();
if (output != NULL) if (output != NULL)
kvAdd(result, varNewStr(PROTOCOL_OUTPUT_STR), output); kvAdd(result, VARSTR(PROTOCOL_OUTPUT_STR), output);
ioWriteLine(this->write, kvToJson(result, 0)); ioWriteLine(this->write, kvToJson(result, 0));
ioWriteFlush(this->write); ioWriteFlush(this->write);

View File

@ -92,8 +92,8 @@ storageDriverRemoteFileReadOpen(StorageDriverRemoteFileRead *this)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_OPEN_READ_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_OPEN_READ_STR);
protocolCommandParamAdd(command, varNewStr(this->name)); protocolCommandParamAdd(command, VARSTR(this->name));
protocolCommandParamAdd(command, varNewBool(this->ignoreMissing)); protocolCommandParamAdd(command, VARBOOL(this->ignoreMissing));
result = varBool(protocolClientExecute(this->client, command, true)); result = varBool(protocolClientExecute(this->client, command, true));
} }

View File

@ -106,13 +106,13 @@ storageDriverRemoteFileWriteOpen(StorageDriverRemoteFileWrite *this)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_OPEN_WRITE_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_OPEN_WRITE_STR);
protocolCommandParamAdd(command, varNewStr(this->name)); protocolCommandParamAdd(command, VARSTR(this->name));
protocolCommandParamAdd(command, varNewUInt64(this->modeFile)); protocolCommandParamAdd(command, VARUINT64(this->modeFile));
protocolCommandParamAdd(command, varNewUInt64(this->modePath)); protocolCommandParamAdd(command, VARUINT64(this->modePath));
protocolCommandParamAdd(command, varNewBool(this->createPath)); protocolCommandParamAdd(command, VARBOOL(this->createPath));
protocolCommandParamAdd(command, varNewBool(this->syncFile)); protocolCommandParamAdd(command, VARBOOL(this->syncFile));
protocolCommandParamAdd(command, varNewBool(this->syncPath)); protocolCommandParamAdd(command, VARBOOL(this->syncPath));
protocolCommandParamAdd(command, varNewBool(this->atomic)); protocolCommandParamAdd(command, VARBOOL(this->atomic));
protocolClientExecute(this->client, command, false); protocolClientExecute(this->client, command, false);
} }

View File

@ -58,8 +58,8 @@ storageDriverRemoteProtocol(const String *command, const VariantList *paramList,
{ {
if (strEq(command, PROTOCOL_COMMAND_STORAGE_EXISTS_STR)) if (strEq(command, PROTOCOL_COMMAND_STORAGE_EXISTS_STR))
{ {
protocolServerResponse( protocolServerResponse(server, VARBOOL( // The unusual line break is to make coverage happy -- not sure why
server, varNewBool(interface.exists(driver, storagePathNP(storage, varStr(varLstGet(paramList, 0)))))); interface.exists(driver, storagePathNP(storage, varStr(varLstGet(paramList, 0))))));
} }
else if (strEq(command, PROTOCOL_COMMAND_STORAGE_LIST_STR)) else if (strEq(command, PROTOCOL_COMMAND_STORAGE_LIST_STR))
{ {
@ -80,7 +80,7 @@ storageDriverRemoteProtocol(const String *command, const VariantList *paramList,
// Check if the file exists // Check if the file exists
bool exists = ioReadOpen(fileRead); bool exists = ioReadOpen(fileRead);
protocolServerResponse(server, varNewBool(exists)); protocolServerResponse(server, VARBOOL(exists));
// Transfer the file if it exists // Transfer the file if it exists
if (exists) if (exists)

View File

@ -89,7 +89,7 @@ storageDriverRemoteExists(StorageDriverRemote *this, const String *path)
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_EXISTS_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_EXISTS_STR);
protocolCommandParamAdd(command, varNewStr(path)); protocolCommandParamAdd(command, VARSTR(path));
result = varBool(protocolClientExecute(this->client, command, true)); result = varBool(protocolClientExecute(this->client, command, true));
} }
@ -139,9 +139,9 @@ storageDriverRemoteList(StorageDriverRemote *this, const String *path, bool erro
MEM_CONTEXT_TEMP_BEGIN() MEM_CONTEXT_TEMP_BEGIN()
{ {
ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_LIST_STR); ProtocolCommand *command = protocolCommandNew(PROTOCOL_COMMAND_STORAGE_LIST_STR);
protocolCommandParamAdd(command, varNewStr(path)); protocolCommandParamAdd(command, VARSTR(path));
protocolCommandParamAdd(command, varNewBool(errorOnMissing)); protocolCommandParamAdd(command, VARBOOL(errorOnMissing));
protocolCommandParamAdd(command, varNewStr(expression)); protocolCommandParamAdd(command, VARSTR(expression));
result = strLstMove(strLstNewVarLst(varVarLst(protocolClientExecute(this->client, command, true))), MEM_CONTEXT_OLD()); result = strLstMove(strLstNewVarLst(varVarLst(protocolClientExecute(this->client, command, true))), MEM_CONTEXT_OLD());
} }

View File

@ -788,37 +788,37 @@ testRun(void)
KeyValue *stanzaInfo = kvNew(); KeyValue *stanzaInfo = kvNew();
VariantList *dbSection = varLstNew(); VariantList *dbSection = varLstNew();
Variant *pgInfo = varNewKv(); Variant *pgInfo = varNewKv();
kvPut(varKv(pgInfo), varNewStr(DB_KEY_ID_STR), varNewUInt64(1)); kvPut(varKv(pgInfo), DB_KEY_ID_VAR, varNewUInt64(1));
kvPut(varKv(pgInfo), varNewStr(DB_KEY_SYSTEM_ID_STR), varNewUInt64(6625633699176220261)); kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, varNewUInt64(6625633699176220261));
kvPut(varKv(pgInfo), varNewStr(DB_KEY_VERSION_STR), varNewStr(pgVersionToStr(90500))); kvPut(varKv(pgInfo), DB_KEY_VERSION_VAR, VARSTR(pgVersionToStr(90500)));
varLstAdd(dbSection, pgInfo); varLstAdd(dbSection, pgInfo);
// Add the database history, backup and archive sections to the stanza info // Add the database history, backup and archive sections to the stanza info
kvPut(stanzaInfo, varNewStr(STANZA_KEY_DB_STR), varNewVarLst(dbSection)); kvPut(stanzaInfo, STANZA_KEY_DB_VAR, varNewVarLst(dbSection));
VariantList *backupSection = varLstNew(); VariantList *backupSection = varLstNew();
Variant *backupInfo = varNewKv(); Variant *backupInfo = varNewKv();
kvPut(varKv(backupInfo), varNewStr(BACKUP_KEY_LABEL_STR), varNewStr(strNew("20181119-152138F"))); kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTRDEF("20181119-152138F"));
kvPut(varKv(backupInfo), varNewStr(BACKUP_KEY_TYPE_STR), varNewStr(strNew("full"))); kvPut(varKv(backupInfo), BACKUP_KEY_TYPE_VAR, VARSTRDEF("full"));
kvPutKv(varKv(backupInfo), varNewStr(KEY_ARCHIVE_STR)); kvPutKv(varKv(backupInfo), KEY_ARCHIVE_VAR);
KeyValue *infoInfo = kvPutKv(varKv(backupInfo), varNewStr(BACKUP_KEY_INFO_STR)); KeyValue *infoInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_INFO_VAR);
kvPut(infoInfo, varNewStr(KEY_SIZE_STR), varNewUInt64(0)); kvPut(infoInfo, KEY_SIZE_VAR, varNewUInt64(0));
kvPut(infoInfo, varNewStr(KEY_DELTA_STR), varNewUInt64(0)); kvPut(infoInfo, KEY_DELTA_VAR, varNewUInt64(0));
KeyValue *repoInfo = kvPutKv(infoInfo, varNewStr(INFO_KEY_REPOSITORY_STR)); KeyValue *repoInfo = kvPutKv(infoInfo, INFO_KEY_REPOSITORY_VAR);
kvAdd(repoInfo, varNewStr(KEY_SIZE_STR), varNewUInt64(0)); kvAdd(repoInfo, KEY_SIZE_VAR, varNewUInt64(0));
kvAdd(repoInfo, varNewStr(KEY_DELTA_STR), varNewUInt64(0)); kvAdd(repoInfo, KEY_DELTA_VAR, varNewUInt64(0));
KeyValue *databaseInfo = kvPutKv(varKv(backupInfo), varNewStr(KEY_DATABASE_STR)); KeyValue *databaseInfo = kvPutKv(varKv(backupInfo), KEY_DATABASE_VAR);
kvAdd(databaseInfo, varNewStr(DB_KEY_ID_STR), varNewUInt64(1)); kvAdd(databaseInfo, DB_KEY_ID_VAR, varNewUInt64(1));
KeyValue *timeInfo = kvPutKv(varKv(backupInfo), varNewStr(BACKUP_KEY_TIMESTAMP_STR)); KeyValue *timeInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_TIMESTAMP_VAR);
kvAdd(timeInfo, varNewStr(KEY_START_STR), varNewUInt64(1542383276)); kvAdd(timeInfo, KEY_START_VAR, varNewUInt64(1542383276));
kvAdd(timeInfo, varNewStr(KEY_STOP_STR), varNewUInt64(1542383289)); kvAdd(timeInfo, KEY_STOP_VAR, varNewUInt64(1542383289));
varLstAdd(backupSection, backupInfo); varLstAdd(backupSection, backupInfo);
kvPut(stanzaInfo, varNewStr(STANZA_KEY_BACKUP_STR), varNewVarLst(backupSection)); kvPut(stanzaInfo, STANZA_KEY_BACKUP_VAR, varNewVarLst(backupSection));
kvPut(stanzaInfo, varNewStr(KEY_ARCHIVE_STR), varNewVarLst(varLstNew())); kvPut(stanzaInfo, KEY_ARCHIVE_VAR, varNewVarLst(varLstNew()));
String *result = strNew(""); String *result = strNew("");
formatTextDb(stanzaInfo, result); formatTextDb(stanzaInfo, result);

View File

@ -22,14 +22,14 @@ testRun(void)
TEST_ERROR(varBool(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeBool' failed"); TEST_ERROR(varBool(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeBool' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varBool(varNewBool(true)), true, "true bool variant"); TEST_RESULT_BOOL(varBool(BOOL_TRUE_VAR), true, "true bool variant");
TEST_RESULT_BOOL(varBool(varNewBool(false)), false, "false bool variant"); TEST_RESULT_BOOL(varBool(BOOL_FALSE_VAR), false, "false bool variant");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varBoolForce(varNewBool(false)), false, "force bool to bool"); TEST_RESULT_BOOL(varBoolForce(VARBOOL(false)), false, "force bool to bool");
TEST_RESULT_BOOL(varBoolForce(varNewInt(1)), true, "force int to bool"); TEST_RESULT_BOOL(varBoolForce(VARINT(1)), true, "force int to bool");
TEST_RESULT_BOOL(varBoolForce(varNewInt64(false)), false, "force int64 to bool"); TEST_RESULT_BOOL(varBoolForce(VARINT64(false)), false, "force int64 to bool");
TEST_RESULT_BOOL(varBoolForce(varNewUInt64(12)), true, "force uint64 to bool"); TEST_RESULT_BOOL(varBoolForce(VARUINT64(12)), true, "force uint64 to bool");
TEST_ERROR(varBoolForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to bool"); TEST_ERROR(varBoolForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to bool");
@ -37,13 +37,13 @@ testRun(void)
TEST_RESULT_VOID(varFree(NULL), "ok to free null variant"); TEST_RESULT_VOID(varFree(NULL), "ok to free null variant");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varBool(varDup(varNewBool(true))), true, "dup bool"); TEST_RESULT_BOOL(varBool(varDup(BOOL_TRUE_VAR)), true, "dup bool");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varEq(varNewBool(true), varNewInt(1)), false, "bool, int not eq"); TEST_RESULT_BOOL(varEq(BOOL_TRUE_VAR, VARINT(1)), false, "bool, int not eq");
TEST_RESULT_BOOL(varEq(varNewBool(true), varNewBool(true)), true, "bool, bool eq"); TEST_RESULT_BOOL(varEq(BOOL_TRUE_VAR, BOOL_TRUE_VAR), true, "bool, bool eq");
TEST_RESULT_BOOL(varEq(varNewBool(false), varNewBool(true)), false, "bool, bool not eq"); TEST_RESULT_BOOL(varEq(BOOL_FALSE_VAR, BOOL_TRUE_VAR), false, "bool, bool not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
@ -57,25 +57,25 @@ testRun(void)
TEST_ERROR(varDbl(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeDouble' failed"); TEST_ERROR(varDbl(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeDouble' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_DOUBLE(varDblForce(varNewDbl(4.567)), 4.567, "force double to double"); TEST_RESULT_DOUBLE(varDblForce(VARDBL(4.567)), 4.567, "force double to double");
TEST_RESULT_DOUBLE(varDblForce(varNewBool(false)), 0, "force bool to double"); TEST_RESULT_DOUBLE(varDblForce(varNewBool(false)), 0, "force bool to double");
TEST_RESULT_DOUBLE(varDblForce(varNewInt(123)), 123, "force int to double"); TEST_RESULT_DOUBLE(varDblForce(VARINT(123)), 123, "force int to double");
TEST_RESULT_DOUBLE(varDblForce(varNewInt64(999999999999)), 999999999999, "force int64 to double"); TEST_RESULT_DOUBLE(varDblForce(VARINT64(999999999999)), 999999999999, "force int64 to double");
TEST_RESULT_DOUBLE(varDblForce(varNewUInt64(9223372036854775807U)), 9223372036854775807U, "force uint64 to double"); TEST_RESULT_DOUBLE(varDblForce(VARUINT64(9223372036854775807U)), 9223372036854775807U, "force uint64 to double");
TEST_RESULT_DOUBLE(varDblForce(varNewStr(strNew("879.01"))), 879.01, "force String to double"); TEST_RESULT_DOUBLE(varDblForce(VARSTRDEF("879.01")), 879.01, "force String to double");
TEST_RESULT_DOUBLE(varDblForce(varNewStr(strNew("0"))), 0, "force String to double"); TEST_RESULT_DOUBLE(varDblForce(VARSTRDEF("0")), 0, "force String to double");
TEST_RESULT_DOUBLE( TEST_RESULT_DOUBLE(
varDblForce(varNewUInt64(UINT64_MAX)), 18446744073709551616.0, "force max uint64 to double (it will be rounded)"); varDblForce(VARUINT64(UINT64_MAX)), 18446744073709551616.0, "force max uint64 to double (it will be rounded)");
TEST_ERROR(varDblForce(varNewStr(strNew("AAA"))), FormatError, "unable to convert string 'AAA' to double"); TEST_ERROR(varDblForce(VARSTRDEF("AAA")), FormatError, "unable to convert string 'AAA' to double");
TEST_ERROR(varDblForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to double"); TEST_ERROR(varDblForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to double");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_DOUBLE(varDbl(varDup(varNewDbl(3.1415))), 3.1415, "dup double"); TEST_RESULT_DOUBLE(varDbl(varDup(VARDBL(3.1415))), 3.1415, "dup double");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varEq(varNewDbl(1.234), varNewDbl(1.234)), true, "double, double eq"); TEST_RESULT_BOOL(varEq(VARDBL(1.234), VARDBL(1.234)), true, "double, double eq");
TEST_RESULT_BOOL(varEq(varNewDbl(4.321), varNewDbl(1.234)), false, "double, double not eq"); TEST_RESULT_BOOL(varEq(VARDBL(4.321), VARDBL(1.234)), false, "double, double not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
@ -89,25 +89,25 @@ testRun(void)
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varIntForce(varNewBool(true)), 1, "force bool to int"); TEST_RESULT_INT(varIntForce(varNewBool(true)), 1, "force bool to int");
TEST_ERROR(varIntForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to int"); TEST_ERROR(varIntForce(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to int");
TEST_RESULT_INT(varIntForce(varNewInt64(999)), 999, "force int64 to int"); TEST_RESULT_INT(varIntForce(VARINT64(999)), 999, "force int64 to int");
TEST_ERROR(varIntForce(varNewInt64(2147483648)), FormatError, "unable to convert int64 2147483648 to int"); TEST_ERROR(varIntForce(VARINT64(2147483648)), FormatError, "unable to convert int64 2147483648 to int");
TEST_ERROR(varIntForce(varNewInt64(-2147483649)), FormatError, "unable to convert int64 -2147483649 to int"); TEST_ERROR(varIntForce(VARINT64(-2147483649)), FormatError, "unable to convert int64 -2147483649 to int");
TEST_RESULT_INT(varIntForce(varNewUInt64(12345)), 12345, "force uint64 to int"); TEST_RESULT_INT(varIntForce(VARUINT64(12345)), 12345, "force uint64 to int");
TEST_ERROR(varIntForce(varNewUInt64(2147483648)), FormatError, "unable to convert uint64 2147483648 to int"); TEST_ERROR(varIntForce(VARUINT64(2147483648)), FormatError, "unable to convert uint64 2147483648 to int");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_ERROR(varInt(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeInt' failed"); TEST_ERROR(varInt(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeInt' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varInt(varDup(varNewInt(88976))), 88976, "dup int"); TEST_RESULT_INT(varInt(varDup(VARINT(88976))), 88976, "dup int");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq"); TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq");
TEST_RESULT_BOOL(varEq(NULL, varNewInt(123)), false, "null, int not eq"); TEST_RESULT_BOOL(varEq(NULL, VARINT(123)), false, "null, int not eq");
TEST_RESULT_BOOL(varEq(varNewInt(123), NULL), false, "int, null not eq"); TEST_RESULT_BOOL(varEq(VARINT(123), NULL), false, "int, null not eq");
TEST_RESULT_BOOL(varEq(varNewInt(123), varNewInt(123)), true, "int, int eq"); TEST_RESULT_BOOL(varEq(VARINT(123), VARINT(123)), true, "int, int eq");
TEST_RESULT_BOOL(varEq(varNewInt(444), varNewInt(123)), false, "int, int not eq"); TEST_RESULT_BOOL(varEq(VARINT(444), VARINT(123)), false, "int, int not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
@ -120,29 +120,29 @@ testRun(void)
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varInt64Force(varNewBool(true)), 1, "force bool to int64"); TEST_RESULT_INT(varInt64Force(varNewBool(true)), 1, "force bool to int64");
TEST_RESULT_INT(varInt64Force(varNewInt(2147483647)), 2147483647, "force int to int64"); TEST_RESULT_INT(varInt64Force(VARINT(2147483647)), 2147483647, "force int to int64");
TEST_RESULT_INT(varInt64Force(varNewStrZ("9223372036854775807")), 9223372036854775807L, "force str to int64"); TEST_RESULT_INT(varInt64Force(varNewStrZ("9223372036854775807")), 9223372036854775807L, "force str to int64");
TEST_RESULT_INT(varInt64Force(varNewUInt64(9223372036854775807U)), 9223372036854775807L, "force uint64 to int64"); TEST_RESULT_INT(varInt64Force(VARUINT64(9223372036854775807U)), 9223372036854775807L, "force uint64 to int64");
TEST_ERROR( TEST_ERROR(
varInt64Force(varNewStrZ("9223372036854775808")), FormatError, varInt64Force(varNewStrZ("9223372036854775808")), FormatError,
"unable to convert base 10 string '9223372036854775808' to int64"); "unable to convert base 10 string '9223372036854775808' to int64");
TEST_ERROR(varInt64Force(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to int64"); TEST_ERROR(varInt64Force(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to int64");
TEST_ERROR(varInt64Force(varNewUInt64(9223372036854775808U)), FormatError, TEST_ERROR(varInt64Force(VARUINT64(9223372036854775808U)), FormatError,
"unable to convert uint64 9223372036854775808 to int64"); "unable to convert uint64 9223372036854775808 to int64");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_ERROR(varInt64(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeInt64' failed"); TEST_ERROR(varInt64(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeInt64' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varInt64(varDup(varNewInt64(88976))), 88976, "dup int64"); TEST_RESULT_INT(varInt64(varDup(VARINT64(88976))), 88976, "dup int64");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq"); TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq");
TEST_RESULT_BOOL(varEq(NULL, varNewInt64(123)), false, "null, int64 not eq"); TEST_RESULT_BOOL(varEq(NULL, VARINT64(123)), false, "null, int64 not eq");
TEST_RESULT_BOOL(varEq(varNewInt64(9223372036854775807L), varNewInt64(9223372036854775807L)), true, "int64, int64 eq"); TEST_RESULT_BOOL(varEq(VARINT64(9223372036854775807L), VARINT64(9223372036854775807L)), true, "int64, int64 eq");
TEST_RESULT_BOOL(varEq(varNewInt64(444), varNewInt64(123)), false, "int64, int64 not eq"); TEST_RESULT_BOOL(varEq(VARINT64(444), VARINT64(123)), false, "int64, int64 not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
@ -155,51 +155,51 @@ testRun(void)
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_DOUBLE(varUInt64Force(varNewBool(true)), 1, "force bool to uint64"); TEST_RESULT_DOUBLE(varUInt64Force(varNewBool(true)), 1, "force bool to uint64");
TEST_RESULT_DOUBLE(varUInt64Force(varNewInt(2147483647)), 2147483647, "force int to uint64"); TEST_RESULT_DOUBLE(varUInt64Force(VARINT(2147483647)), 2147483647, "force int to uint64");
TEST_RESULT_DOUBLE(varUInt64Force(varNewInt64(2147483647)), 2147483647, "force int64 to uint64"); TEST_RESULT_DOUBLE(varUInt64Force(VARINT64(2147483647)), 2147483647, "force int64 to uint64");
TEST_RESULT_DOUBLE(varUInt64Force(varNewStrZ("18446744073709551615")), 18446744073709551615U, "force str to uint64"); TEST_RESULT_DOUBLE(varUInt64Force(varNewStrZ("18446744073709551615")), 18446744073709551615U, "force str to uint64");
TEST_RESULT_DOUBLE(varUInt64Force(varNewUInt64(18446744073709551615U)), 18446744073709551615U, "force uint64 to uint64"); TEST_RESULT_DOUBLE(varUInt64Force(VARUINT64(18446744073709551615U)), 18446744073709551615U, "force uint64 to uint64");
TEST_ERROR( TEST_ERROR(
varUInt64Force(varNewStrZ("18446744073709551616")), FormatError, varUInt64Force(varNewStrZ("18446744073709551616")), FormatError,
"unable to convert base 10 string '18446744073709551616' to uint64"); // string value is out of bounds for uint64 "unable to convert base 10 string '18446744073709551616' to uint64"); // string value is out of bounds for uint64
TEST_ERROR(varUInt64Force(varNewStrZ(" 16")), FormatError,"unable to convert base 10 string ' 16' to uint64"); TEST_ERROR(varUInt64Force(varNewStrZ(" 16")), FormatError,"unable to convert base 10 string ' 16' to uint64");
TEST_ERROR(varUInt64Force(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to uint64"); TEST_ERROR(varUInt64Force(varNewVarLst(varLstNew())), AssertError, "unable to force VariantList to uint64");
TEST_ERROR(varUInt64Force(varNewInt64(-1)), FormatError, "unable to convert int64 -1 to uint64"); TEST_ERROR(varUInt64Force(VARINT64(-1)), FormatError, "unable to convert int64 -1 to uint64");
TEST_ERROR(varUInt64Force(varNewInt(-1)), FormatError, "unable to convert int -1 to uint64"); TEST_ERROR(varUInt64Force(VARINT(-1)), FormatError, "unable to convert int -1 to uint64");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_ERROR(varUInt64(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeUInt64' failed"); TEST_ERROR(varUInt64(varNewStrZ("string")), AssertError, "assertion 'this->type == varTypeUInt64' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_DOUBLE(varUInt64(varDup(varNewUInt64(88976))), 88976, "dup uint64"); TEST_RESULT_DOUBLE(varUInt64(varDup(VARUINT64(88976))), 88976, "dup uint64");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq"); TEST_RESULT_BOOL(varEq(NULL, NULL), true, "null, null eq");
TEST_RESULT_BOOL(varEq(NULL, varNewUInt64(123)), false, "null, uint64 not eq"); TEST_RESULT_BOOL(varEq(NULL, VARUINT64(123)), false, "null, uint64 not eq");
TEST_RESULT_BOOL(varEq(varNewUInt64(9223372036854775807L), varNewUInt64(9223372036854775807L)), true, "uint64, uint64 eq"); TEST_RESULT_BOOL(varEq(VARUINT64(9223372036854775807L), VARUINT64(9223372036854775807L)), true, "uint64, uint64 eq");
TEST_RESULT_BOOL(varEq(varNewUInt64(444), varNewUInt64(123)), false, "uint64, uint64 not eq"); TEST_RESULT_BOOL(varEq(VARUINT64(444), VARUINT64(123)), false, "uint64, uint64 not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
if (testBegin("keyValue")) if (testBegin("keyValue"))
{ {
TEST_ERROR(varKv(varNewInt(66)), AssertError, "assertion 'this->type == varTypeKeyValue' failed"); TEST_ERROR(varKv(VARINT(66)), AssertError, "assertion 'this->type == varTypeKeyValue' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
Variant *keyValue = NULL; Variant *keyValue = NULL;
TEST_ASSIGN(keyValue, varNewKv(), "new"); TEST_ASSIGN(keyValue, varNewKv(), "new");
TEST_RESULT_PTR(kvPut(varKv(keyValue), varNewInt(44), varNewInt(55)), varKv(keyValue), " put int/int"); TEST_RESULT_PTR(kvPut(varKv(keyValue), VARINT(44), VARINT(55)), varKv(keyValue), " put int/int");
TEST_RESULT_INT(varInt(kvGet(varKv(keyValue), varNewInt(44))), 55, " get int/int"); TEST_RESULT_INT(varInt(kvGet(varKv(keyValue), VARINT(44))), 55, " get int/int");
TEST_RESULT_PTR(varKv(NULL), NULL, "get null kv"); TEST_RESULT_PTR(varKv(NULL), NULL, "get null kv");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
Variant *keyValueDup = NULL; Variant *keyValueDup = NULL;
TEST_ASSIGN(keyValueDup, varDup(keyValue), "duplicate"); TEST_ASSIGN(keyValueDup, varDup(keyValue), "duplicate");
TEST_RESULT_INT(varInt(kvGet(varKv(keyValueDup), varNewInt(44))), 55, " get int/int"); TEST_RESULT_INT(varInt(kvGet(varKv(keyValueDup), VARINT(44))), 55, " get int/int");
varFree(keyValue); varFree(keyValue);
varFree(keyValueDup); varFree(keyValueDup);
@ -224,52 +224,53 @@ testRun(void)
TEST_ERROR(varStr(varNewBool(true)), AssertError, "assertion 'this->type == varTypeString' failed"); TEST_ERROR(varStr(varNewBool(true)), AssertError, "assertion 'this->type == varTypeString' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varIntForce(varNewStrZ("777")), 777, "int from string"); TEST_RESULT_INT(varIntForce(VARSTR(STRDEF("777"))), 777, "int from string");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_INT(varBoolForce(varNewStr(strNew("y"))), true, "bool from string"); TEST_RESULT_INT(varBoolForce(VARSTRDEF("y")), true, "bool from string");
TEST_RESULT_INT(varBoolForce(varNewStr(strNew("on"))), true, "bool from string"); TEST_RESULT_INT(varBoolForce(VARSTRZ("on")), true, "bool from string");
TEST_RESULT_INT(varBoolForce(varNewStr(strNew("n"))), false, "bool from string"); TEST_RESULT_INT(varBoolForce(varNewStrZ("n")), false, "bool from string");
TEST_RESULT_INT(varBoolForce(varNewStr(strNew("off"))), false, "bool from string"); TEST_RESULT_INT(varBoolForce(VARSTRDEF("off")), false, "bool from string");
TEST_RESULT_INT(varBoolForce(varNewStr(strNew("OFF"))), false, "bool from string"); TEST_RESULT_INT(varBoolForce(VARSTRDEF("OFF")), false, "bool from string");
TEST_ERROR(varBoolForce(varNewStr(strNew(BOGUS_STR))), FormatError, "unable to convert str 'BOGUS' to bool"); TEST_ERROR(varBoolForce(VARSTRDEF(BOGUS_STR)), FormatError, "unable to convert str 'BOGUS' to bool");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_STR(strPtr(varStrForce(varNewStr(strNew("teststring")))), "teststring", "force string to string"); TEST_RESULT_STR(strPtr(varStrForce(VARSTRDEF("teststring"))), "teststring", "force string to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewInt(999))), "999", "force int to string"); TEST_RESULT_STR(strPtr(varStrForce(VARINT(999))), "999", "force int to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewInt64(9223372036854775807L))), "9223372036854775807", "force int64 to string"); TEST_RESULT_STR(strPtr(varStrForce(VARINT64(9223372036854775807L))), "9223372036854775807", "force int64 to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewDbl((double)999999999.123456))), "999999999.123456", "force double to string"); TEST_RESULT_STR(strPtr(varStrForce(VARDBL((double)999999999.123456))), "999999999.123456", "force double to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewBool(true))), "true", "force bool to string"); TEST_RESULT_STR(strPtr(varStrForce(varNewBool(true))), "true", "force bool to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewBool(false))), "false", "force bool to string"); TEST_RESULT_STR(strPtr(varStrForce(varNewBool(false))), "false", "force bool to string");
TEST_RESULT_STR(strPtr(varStrForce(varNewUInt64(18446744073709551615U))), "18446744073709551615", "force uint64 to string"); TEST_RESULT_STR(strPtr(varStrForce(VARUINT64(18446744073709551615U))), "18446744073709551615", "force uint64 to string");
TEST_ERROR(varStrForce(varNewKv()), FormatError, "unable to force KeyValue to String"); TEST_ERROR(varStrForce(varNewKv()), FormatError, "unable to force KeyValue to String");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
string = varNewStr(strNew("not-an-int")); string = varNewStrZ("not-an-int");
TEST_ERROR(varIntForce(string), FormatError, "unable to convert base 10 string 'not-an-int' to int"); TEST_ERROR(varIntForce(string), FormatError, "unable to convert base 10 string 'not-an-int' to int");
varFree(string); varFree(string);
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_STR(strPtr(varStr(varNewStrZ("test-z-str"))), "test-z-str", "new zero-terminated string"); TEST_RESULT_STR(strPtr(varStr(VARSTRDEF("test-z-str"))), "test-z-str", "new zero-terminated string");
TEST_RESULT_PTR(strPtr(varStr(VARSTR(NULL))), NULL, "new null strz");
TEST_RESULT_PTR(strPtr(varStr(varNewStrZ(NULL))), NULL, "new null strz"); TEST_RESULT_PTR(strPtr(varStr(varNewStrZ(NULL))), NULL, "new null strz");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_STR(strPtr(varStr(varDup(varNewStr(strNew("yabba-dabba-doo"))))), "yabba-dabba-doo", "dup string"); TEST_RESULT_STR(strPtr(varStr(varDup(VARSTRDEF("yabba-dabba-doo")))), "yabba-dabba-doo", "dup string");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_RESULT_PTR(varDup(NULL), NULL, "dup NULL"); TEST_RESULT_PTR(varDup(NULL), NULL, "dup NULL");
TEST_RESULT_BOOL(varEq(varNewStr(strNew("expect-equal")), varNewStr(strNew("expect-equal"))), true, "string, string eq"); TEST_RESULT_BOOL(varEq(VARSTRDEF("expect-equal"), VARSTRDEF("expect-equal")), true, "string, string eq");
TEST_RESULT_BOOL(varEq(varNewStr(strNew("Y")), varNewStr(strNew("X"))), false, "string, string not eq"); TEST_RESULT_BOOL(varEq(VARSTRDEF("Y"), VARSTRDEF("X")), false, "string, string not eq");
} }
// ***************************************************************************************************************************** // *****************************************************************************************************************************
if (testBegin("VariantList")) if (testBegin("VariantList"))
{ {
TEST_ERROR(varVarLst(varNewInt(66)), AssertError, "assertion 'this->type == varTypeVariantList' failed"); TEST_ERROR(varVarLst(VARINT(66)), AssertError, "assertion 'this->type == varTypeVariantList' failed");
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
Variant *listVar = NULL; Variant *listVar = NULL;
@ -345,8 +346,8 @@ testRun(void)
{ {
VariantList *list = varLstNew(); VariantList *list = varLstNew();
varLstAdd(list, varNewStr(strNew("string1"))); varLstAdd(list, varNewStrZ("string1"));
varLstAdd(list, varNewStr(strNew("string2"))); varLstAdd(list, varNewStrZ("string2"));
TEST_RESULT_STR( TEST_RESULT_STR(
strPtr(strLstJoin(strLstNewVarLst(varLstDup(list)), ", ")), strPtr(strLstJoin(strLstNewVarLst(varLstDup(list)), ", ")),