You've already forked pgbackrest
							
							
				mirror of
				https://github.com/pgbackrest/pgbackrest.git
				synced 2025-10-30 23:37:45 +02:00 
			
		
		
		
	varNewKv() accepts a KeyValue object rather than creating one.
This allows for more flexibility about when the Variant is created.
This commit is contained in:
		| @@ -33,6 +33,10 @@ | |||||||
|                         <p>Add <code>unsigned int</code> <code>Variant</code> type and update code to use it.</p> |                         <p>Add <code>unsigned int</code> <code>Variant</code> type and update code to use it.</p> | ||||||
|                     </release-item> |                     </release-item> | ||||||
|  |  | ||||||
|  |                     <release-item> | ||||||
|  |                         <p><code>varNewKv()</code> accepts a <code>KeyValue</code> object rather than creating one.</p> | ||||||
|  |                     </release-item> | ||||||
|  |  | ||||||
|                     <release-item> |                     <release-item> | ||||||
|                         <p>Refactor <code>Ini</code> interface to expose <code>String</code> values instead of <code>Variant</code>.</p> |                         <p>Refactor <code>Ini</code> interface to expose <code>String</code> values instead of <code>Variant</code>.</p> | ||||||
|                     </release-item> |                     </release-item> | ||||||
|   | |||||||
| @@ -119,7 +119,7 @@ archiveDbList(const String *stanza, const InfoPgData *pgData, VariantList *archi | |||||||
|     String *archivePath = strNewFmt(STORAGE_PATH_ARCHIVE "/%s/%s", strPtr(stanza), strPtr(archiveId)); |     String *archivePath = strNewFmt(STORAGE_PATH_ARCHIVE "/%s/%s", strPtr(stanza), strPtr(archiveId)); | ||||||
|     String *archiveStart = NULL; |     String *archiveStart = NULL; | ||||||
|     String *archiveStop = NULL; |     String *archiveStop = NULL; | ||||||
|     Variant *archiveInfo = varNewKv(); |     Variant *archiveInfo = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|     // Get a list of WAL directories in the archive repo from oldest to newest, if any exist |     // Get a list of WAL directories in the archive repo from oldest to newest, if any exist | ||||||
|     StringList *walDir = storageListP(storageRepo(), archivePath, .expression = WAL_SEGMENT_DIR_REGEXP_STR); |     StringList *walDir = storageListP(storageRepo(), archivePath, .expression = WAL_SEGMENT_DIR_REGEXP_STR); | ||||||
| @@ -206,7 +206,7 @@ backupList(VariantList *backupSection, InfoBackup *info) | |||||||
|         // Get the backup data |         // Get the backup data | ||||||
|         InfoBackupData backupData = infoBackupData(info, keyIdx); |         InfoBackupData backupData = infoBackupData(info, keyIdx); | ||||||
|  |  | ||||||
|         Variant *backupInfo = varNewKv(); |         Variant *backupInfo = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|         // main keys |         // main keys | ||||||
|         kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTR(backupData.backupLabel)); |         kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTR(backupData.backupLabel)); | ||||||
| @@ -297,7 +297,7 @@ stanzaInfoList(const String *stanza, StringList *stanzaList) | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Create the stanzaInfo and section variables |         // Create the stanzaInfo and section variables | ||||||
|         Variant *stanzaInfo = varNewKv(); |         Variant *stanzaInfo = varNewKv(kvNew()); | ||||||
|         VariantList *dbSection = varLstNew(); |         VariantList *dbSection = varLstNew(); | ||||||
|         VariantList *backupSection = varLstNew(); |         VariantList *backupSection = varLstNew(); | ||||||
|         VariantList *archiveSection = varLstNew(); |         VariantList *archiveSection = varLstNew(); | ||||||
| @@ -345,7 +345,7 @@ stanzaInfoList(const String *stanza, StringList *stanzaList) | |||||||
|             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(kvNew()); | ||||||
|  |  | ||||||
|                 kvPut(varKv(pgInfo), DB_KEY_ID_VAR, VARUINT(pgData.id)); |                 kvPut(varKv(pgInfo), DB_KEY_ID_VAR, VARUINT(pgData.id)); | ||||||
|                 kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, VARUINT64(pgData.systemId)); |                 kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, VARUINT64(pgData.systemId)); | ||||||
| @@ -386,7 +386,7 @@ stanzaInfoList(const String *stanza, StringList *stanzaList) | |||||||
|     // If looking for a specific stanza and it was not found, set minimum info and the status |     // If looking for a specific stanza and it was not found, set minimum info and the status | ||||||
|     if (stanza != NULL && !stanzaFound) |     if (stanza != NULL && !stanzaFound) | ||||||
|     { |     { | ||||||
|         Variant *stanzaInfo = varNewKv(); |         Variant *stanzaInfo = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|         kvPut(varKv(stanzaInfo), STANZA_KEY_NAME_VAR, VARSTR(stanza)); |         kvPut(varKv(stanzaInfo), STANZA_KEY_NAME_VAR, VARSTR(stanza)); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -266,7 +266,7 @@ jsonToVarInternal(const char *json, unsigned int *jsonPos) | |||||||
|             MEM_CONTEXT_TEMP_BEGIN() |             MEM_CONTEXT_TEMP_BEGIN() | ||||||
|             { |             { | ||||||
|                 memContextSwitch(MEM_CONTEXT_OLD()); |                 memContextSwitch(MEM_CONTEXT_OLD()); | ||||||
|                 result = varNewKv(); |                 result = varNewKv(kvNew()); | ||||||
|                 memContextSwitch(MEM_CONTEXT_TEMP()); |                 memContextSwitch(MEM_CONTEXT_TEMP()); | ||||||
|  |  | ||||||
|                 // Move position to the first key/value in the object |                 // Move position to the first key/value in the object | ||||||
|   | |||||||
| @@ -293,10 +293,8 @@ kvPutKv(KeyValue *this, const Variant *key) | |||||||
|  |  | ||||||
|     MEM_CONTEXT_BEGIN(this->memContext) |     MEM_CONTEXT_BEGIN(this->memContext) | ||||||
|     { |     { | ||||||
|         Variant *keyValue = varNewKv(); |         result = kvNew(); | ||||||
|         result = varKv(keyValue); |         kvPutInternal(this, key, varNewKv(result)); | ||||||
|  |  | ||||||
|         kvPutInternal(this, key, keyValue); |  | ||||||
|     } |     } | ||||||
|     MEM_CONTEXT_END(); |     MEM_CONTEXT_END(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -967,17 +967,23 @@ varUInt64Force(const Variant *this) | |||||||
|  |  | ||||||
| /*********************************************************************************************************************************** | /*********************************************************************************************************************************** | ||||||
| New key/value variant | New key/value variant | ||||||
|  |  | ||||||
|  | Note that the kv is not duped because it this a heavy-weight operation.  It is merely moved into the same MemContext as the Variant. | ||||||
| ***********************************************************************************************************************************/ | ***********************************************************************************************************************************/ | ||||||
| Variant * | Variant * | ||||||
| varNewKv(void) | varNewKv(KeyValue *data) | ||||||
| { | { | ||||||
|     FUNCTION_TEST_VOID(); |     FUNCTION_TEST_BEGIN(); | ||||||
|  |         FUNCTION_TEST_PARAM(KEY_VALUE, data); | ||||||
|  |     FUNCTION_TEST_END(); | ||||||
|  |  | ||||||
|     // Allocate memory for the variant and set the type and data |     // Allocate memory for the variant and set the type and data | ||||||
|     VariantKeyValue *this = memNew(sizeof(VariantKeyValue)); |     VariantKeyValue *this = memNew(sizeof(VariantKeyValue)); | ||||||
|     this->memContext = memContextCurrent(); |     this->memContext = memContextCurrent(); | ||||||
|     this->type = varTypeKeyValue; |     this->type = varTypeKeyValue; | ||||||
|     this->data = kvNew(); |  | ||||||
|  |     if (data != NULL) | ||||||
|  |         this->data = kvMove(data, memContextCurrent()); | ||||||
|  |  | ||||||
|     FUNCTION_TEST_RETURN((Variant *)this); |     FUNCTION_TEST_RETURN((Variant *)this); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -64,7 +64,7 @@ Variant *varNewInt64(int64_t data); | |||||||
| int64_t varInt64(const Variant *this); | int64_t varInt64(const Variant *this); | ||||||
| int64_t varInt64Force(const Variant *this); | int64_t varInt64Force(const Variant *this); | ||||||
|  |  | ||||||
| Variant *varNewKv(void); | Variant *varNewKv(KeyValue *data); | ||||||
| KeyValue *varKv(const Variant *this); | KeyValue *varKv(const Variant *this); | ||||||
|  |  | ||||||
| Variant *varNewStr(const String *data); | Variant *varNewStr(const String *data); | ||||||
|   | |||||||
| @@ -964,7 +964,7 @@ configParse(unsigned int argListSize, const char *argList[], bool resetLogLevel) | |||||||
|                         } |                         } | ||||||
|                         else if (optionDefType == cfgDefOptTypeHash) |                         else if (optionDefType == cfgDefOptTypeHash) | ||||||
|                         { |                         { | ||||||
|                             Variant *value = varNewKv(); |                             Variant *value = varNewKv(kvNew()); | ||||||
|                             KeyValue *keyValue = varKv(value); |                             KeyValue *keyValue = varKv(value); | ||||||
|  |  | ||||||
|                             for (unsigned int listIdx = 0; listIdx < strLstSize(parseOption->valueList); listIdx++) |                             for (unsigned int listIdx = 0; listIdx < strLstSize(parseOption->valueList); listIdx++) | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ perlOptionJson(void) | |||||||
|             if (!cfgOptionValid(optionId)) |             if (!cfgOptionValid(optionId)) | ||||||
|                 continue; |                 continue; | ||||||
|  |  | ||||||
|             Variant *optionVar = varNewKv(); |             Variant *optionVar = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|             // Add valid |             // Add valid | ||||||
|             kvPut(varKv(optionVar), VARSTRDEF("valid"), BOOL_TRUE_VAR); |             kvPut(varKv(optionVar), VARSTRDEF("valid"), BOOL_TRUE_VAR); | ||||||
| @@ -83,7 +83,7 @@ perlOptionJson(void) | |||||||
|  |  | ||||||
|                     case cfgDefOptTypeHash: |                     case cfgDefOptTypeHash: | ||||||
|                     { |                     { | ||||||
|                         valueVar = varNewKv(); |                         valueVar = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|                         const KeyValue *valueKv = cfgOptionKv(optionId); |                         const KeyValue *valueKv = cfgOptionKv(optionId); | ||||||
|                         const VariantList *keyList = kvKeyList(valueKv); |                         const VariantList *keyList = kvKeyList(valueKv); | ||||||
| @@ -96,7 +96,7 @@ perlOptionJson(void) | |||||||
|  |  | ||||||
|                     case cfgDefOptTypeList: |                     case cfgDefOptTypeList: | ||||||
|                     { |                     { | ||||||
|                         valueVar = varNewKv(); |                         valueVar = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|                         const VariantList *valueList = cfgOptionLst(optionId); |                         const VariantList *valueList = cfgOptionLst(optionId); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,7 +70,7 @@ testRun(void) | |||||||
|         cfgOptionSet(cfgOptDbInclude, cfgSourceParam, varNewVarLst(varLstNewStrLst(list))); |         cfgOptionSet(cfgOptDbInclude, cfgSourceParam, varNewVarLst(varLstNewStrLst(list))); | ||||||
|  |  | ||||||
|         cfgOptionValidSet(cfgOptRecoveryOption, true); |         cfgOptionValidSet(cfgOptRecoveryOption, true); | ||||||
|         Variant *recoveryVar = varNewKv(); |         Variant *recoveryVar = varNewKv(kvNew()); | ||||||
|         KeyValue *recoveryKv = varKv(recoveryVar); |         KeyValue *recoveryKv = varKv(recoveryVar); | ||||||
|         kvPut(recoveryKv, varNewStr(strNew("standby_mode")), varNewStr(strNew("on"))); |         kvPut(recoveryKv, varNewStr(strNew("standby_mode")), varNewStr(strNew("on"))); | ||||||
|         kvPut(recoveryKv, varNewStr(strNew("primary_conn_info")), varNewStr(strNew("blah"))); |         kvPut(recoveryKv, varNewStr(strNew("primary_conn_info")), varNewStr(strNew("blah"))); | ||||||
|   | |||||||
| @@ -787,7 +787,7 @@ testRun(void) | |||||||
|         // These tests cover branches not covered in other tests |         // These tests cover branches not covered in other tests | ||||||
|         KeyValue *stanzaInfo = kvNew(); |         KeyValue *stanzaInfo = kvNew(); | ||||||
|         VariantList *dbSection = varLstNew(); |         VariantList *dbSection = varLstNew(); | ||||||
|         Variant *pgInfo = varNewKv(); |         Variant *pgInfo = varNewKv(kvNew()); | ||||||
|         kvPut(varKv(pgInfo), DB_KEY_ID_VAR, varNewUInt(1)); |         kvPut(varKv(pgInfo), DB_KEY_ID_VAR, varNewUInt(1)); | ||||||
|         kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, varNewUInt64(6625633699176220261)); |         kvPut(varKv(pgInfo), DB_KEY_SYSTEM_ID_VAR, varNewUInt64(6625633699176220261)); | ||||||
|         kvPut(varKv(pgInfo), DB_KEY_VERSION_VAR, VARSTR(pgVersionToStr(90500))); |         kvPut(varKv(pgInfo), DB_KEY_VERSION_VAR, VARSTR(pgVersionToStr(90500))); | ||||||
| @@ -798,7 +798,7 @@ testRun(void) | |||||||
|         kvPut(stanzaInfo, STANZA_KEY_DB_VAR, varNewVarLst(dbSection)); |         kvPut(stanzaInfo, STANZA_KEY_DB_VAR, varNewVarLst(dbSection)); | ||||||
|  |  | ||||||
|         VariantList *backupSection = varLstNew(); |         VariantList *backupSection = varLstNew(); | ||||||
|         Variant *backupInfo = varNewKv(); |         Variant *backupInfo = varNewKv(kvNew()); | ||||||
|  |  | ||||||
|         kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTRDEF("20181119-152138F")); |         kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTRDEF("20181119-152138F")); | ||||||
|         kvPut(varKv(backupInfo), BACKUP_KEY_TYPE_VAR, VARSTRDEF("full")); |         kvPut(varKv(backupInfo), BACKUP_KEY_TYPE_VAR, VARSTRDEF("full")); | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ testRun(void) | |||||||
|         kvPut(keyValue, varNewStrZ("checknull"), (Variant *)NULL); |         kvPut(keyValue, varNewStrZ("checknull"), (Variant *)NULL); | ||||||
|  |  | ||||||
|         VariantList *dbList = varLstNew(); |         VariantList *dbList = varLstNew(); | ||||||
|         Variant *dbInfo = varNewKv(); |         Variant *dbInfo = varNewKv(kvNew()); | ||||||
|         kvPut(varKv(dbInfo), varNewStr(strNew("id")), varNewInt(1)); |         kvPut(varKv(dbInfo), varNewStr(strNew("id")), varNewInt(1)); | ||||||
|         kvPut(varKv(dbInfo), varNewStr(strNew("version")),  varNewStr(strNew("9.4"))); |         kvPut(varKv(dbInfo), varNewStr(strNew("version")),  varNewStr(strNew("9.4"))); | ||||||
|         varLstAdd(dbList, dbInfo); |         varLstAdd(dbList, dbInfo); | ||||||
| @@ -153,7 +153,7 @@ testRun(void) | |||||||
|         String *json = NULL; |         String *json = NULL; | ||||||
|         Variant *keyValue = NULL; |         Variant *keyValue = NULL; | ||||||
|  |  | ||||||
|         TEST_ASSIGN(keyValue, varNewKv(), "build new kv"); |         TEST_ASSIGN(keyValue, varNewKv(kvNew()), "build new kv"); | ||||||
|         kvPut(varKv(keyValue), varNewStrZ("backup-info-size-delta"), varNewInt(1982702)); |         kvPut(varKv(keyValue), varNewStrZ("backup-info-size-delta"), varNewInt(1982702)); | ||||||
|         kvPut(varKv(keyValue), varNewStrZ("backup-prior"), varNewStrZ("20161219-212741F_20161219-212803I")); |         kvPut(varKv(keyValue), varNewStrZ("backup-prior"), varNewStrZ("20161219-212741F_20161219-212803I")); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -265,7 +265,10 @@ testRun(void) | |||||||
|         // ------------------------------------------------------------------------------------------------------------------------- |         // ------------------------------------------------------------------------------------------------------------------------- | ||||||
|         Variant *keyValue = NULL; |         Variant *keyValue = NULL; | ||||||
|  |  | ||||||
|         TEST_ASSIGN(keyValue, varNewKv(), "new"); |         TEST_ASSIGN(keyValue, varNewKv(NULL), "new null"); | ||||||
|  |         TEST_RESULT_PTR(varKv(keyValue), NULL, "    kv is null"); | ||||||
|  |  | ||||||
|  |         TEST_ASSIGN(keyValue, varNewKv(kvNew()), "new"); | ||||||
|         TEST_RESULT_PTR(kvPut(varKv(keyValue), VARINT(44), VARINT(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), VARINT(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"); | ||||||
| @@ -280,7 +283,7 @@ testRun(void) | |||||||
|         varFree(keyValueDup); |         varFree(keyValueDup); | ||||||
|  |  | ||||||
|         // ------------------------------------------------------------------------------------------------------------------------- |         // ------------------------------------------------------------------------------------------------------------------------- | ||||||
|         TEST_ERROR(varEq(varNewKv(), varNewKv()), AssertError, "unable to test equality for KeyValue"); |         TEST_ERROR(varEq(varNewKv(kvNew()), varNewKv(kvNew())), AssertError, "unable to test equality for KeyValue"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // ***************************************************************************************************************************** |     // ***************************************************************************************************************************** | ||||||
| @@ -326,7 +329,7 @@ testRun(void) | |||||||
|         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(VARUINT64(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(kvNew())), FormatError, "unable to force KeyValue to String"); | ||||||
|  |  | ||||||
|         // ------------------------------------------------------------------------------------------------------------------------- |         // ------------------------------------------------------------------------------------------------------------------------- | ||||||
|         string = varNewStrZ("not-an-int"); |         string = varNewStrZ("not-an-int"); | ||||||
| @@ -395,7 +398,7 @@ testRun(void) | |||||||
|     { |     { | ||||||
|         TEST_RESULT_STR(strPtr(varToLog(varNewStrZ("testme"))), "{\"testme\"}", "format String"); |         TEST_RESULT_STR(strPtr(varToLog(varNewStrZ("testme"))), "{\"testme\"}", "format String"); | ||||||
|         TEST_RESULT_STR(strPtr(varToLog(varNewBool(false))), "{false}", "format bool"); |         TEST_RESULT_STR(strPtr(varToLog(varNewBool(false))), "{false}", "format bool"); | ||||||
|         TEST_RESULT_STR(strPtr(varToLog(varNewKv())), "{KeyValue}", "format KeyValue"); |         TEST_RESULT_STR(strPtr(varToLog(varNewKv(kvNew()))), "{KeyValue}", "format KeyValue"); | ||||||
|         TEST_RESULT_STR(strPtr(varToLog(varNewVarLst(varLstNew()))), "{VariantList}", "format VariantList"); |         TEST_RESULT_STR(strPtr(varToLog(varNewVarLst(varLstNew()))), "{VariantList}", "format VariantList"); | ||||||
|         TEST_RESULT_STR(strPtr(varToLog(NULL)), "null", "format null"); |         TEST_RESULT_STR(strPtr(varToLog(NULL)), "null", "format null"); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -162,7 +162,7 @@ testRun(void) | |||||||
|         TEST_ERROR( |         TEST_ERROR( | ||||||
|             cfgOptionSet(cfgOptRecoveryOption, cfgSourceParam, varNewDbl(1.1)), AssertError, |             cfgOptionSet(cfgOptRecoveryOption, cfgSourceParam, varNewDbl(1.1)), AssertError, | ||||||
|             "option 'recovery-option' must be set with KeyValue variant"); |             "option 'recovery-option' must be set with KeyValue variant"); | ||||||
|         TEST_RESULT_VOID(cfgOptionSet(cfgOptRecoveryOption, cfgSourceConfig, varNewKv()), "set recovery-option"); |         TEST_RESULT_VOID(cfgOptionSet(cfgOptRecoveryOption, cfgSourceConfig, varNewKv(kvNew())), "set recovery-option"); | ||||||
|         TEST_RESULT_INT(varLstSize(kvKeyList(cfgOptionKv(cfgOptRecoveryOption))), 0, "recovery-option is set"); |         TEST_RESULT_INT(varLstSize(kvKeyList(cfgOptionKv(cfgOptRecoveryOption))), 0, "recovery-option is set"); | ||||||
|         TEST_ERROR( |         TEST_ERROR( | ||||||
|             cfgOptionLst(cfgOptRecoveryOption), AssertError, |             cfgOptionLst(cfgOptRecoveryOption), AssertError, | ||||||
|   | |||||||
| @@ -86,7 +86,7 @@ testRun(void) | |||||||
|  |  | ||||||
|         cfgOptionValidSet(cfgOptRecoveryOption, true); |         cfgOptionValidSet(cfgOptRecoveryOption, true); | ||||||
|  |  | ||||||
|         Variant *recoveryVar = varNewKv(); |         Variant *recoveryVar = varNewKv(kvNew()); | ||||||
|         KeyValue *recoveryKv = varKv(recoveryVar); |         KeyValue *recoveryKv = varKv(recoveryVar); | ||||||
|         kvPut(recoveryKv, varNewStr(strNew("standby_mode")), varNewStr(strNew("on"))); |         kvPut(recoveryKv, varNewStr(strNew("standby_mode")), varNewStr(strNew("on"))); | ||||||
|         kvPut(recoveryKv, varNewStr(strNew("primary_conn_info")), varNewStr(strNew("blah"))); |         kvPut(recoveryKv, varNewStr(strNew("primary_conn_info")), varNewStr(strNew("blah"))); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user