You've already forked pgbackrest
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:
@ -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"/>
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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))));
|
||||||
|
@ -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);
|
||||||
|
@ -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)),
|
||||||
|
@ -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
|
||||||
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
***********************************************************************************************************************************/
|
***********************************************************************************************************************************/
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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())
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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());
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)), ", ")),
|
||||||
|
Reference in New Issue
Block a user