@@ -26,6 +26,21 @@ static int show_backup(time_t requested_backup_id);
2626static void show_instance_plain (parray * backup_list , bool show_name );
2727static void show_instance_json (parray * backup_list );
2828
29+ /* Json output functions */
30+
31+ typedef enum
32+ {
33+ JT_BEGIN_ARRAY ,
34+ JT_END_ARRAY ,
35+ JT_BEGIN_OBJECT ,
36+ JT_END_OBJECT
37+ } JsonToken ;
38+
39+ static void json_add (PQExpBuffer buf , JsonToken type );
40+ static void json_add_key (PQExpBuffer buf , const char * name , bool add_comma );
41+ static void json_add_value (PQExpBuffer buf , const char * name , const char * value ,
42+ bool add_comma );
43+
2944static PQExpBufferData show_buf ;
3045static bool first_instance = true;
3146static uint8 json_level = 0 ;
@@ -219,8 +234,9 @@ show_instance_start(void)
219234 first_instance = true;
220235 json_level = 0 ;
221236
222- appendPQExpBufferChar (& show_buf , '[' );
223- json_level ++ ;
237+ json_add (& show_buf , JT_BEGIN_OBJECT );
238+ json_add_key (& show_buf , "instances" , false);
239+ json_add (& show_buf , JT_BEGIN_ARRAY );
224240}
225241
226242/*
@@ -230,7 +246,11 @@ static void
230246show_instance_end (void )
231247{
232248 if (show_format == SHOW_JSON )
233- appendPQExpBufferStr (& show_buf , "\n]\n" );
249+ {
250+ json_add (& show_buf , JT_END_ARRAY );
251+ json_add (& show_buf , JT_END_OBJECT );
252+ appendPQExpBufferChar (& show_buf , '\n' );
253+ }
234254
235255 fputs (show_buf .data , stdout );
236256 termPQExpBuffer (& show_buf );
@@ -375,14 +395,6 @@ json_add_indent(PQExpBuffer buf)
375395 appendPQExpBufferStr (buf , " " );
376396}
377397
378- typedef enum
379- {
380- JT_BEGIN_ARRAY ,
381- JT_END_ARRAY ,
382- JT_BEGIN_OBJECT ,
383- JT_END_OBJECT
384- } JsonToken ;
385-
386398static void
387399json_add (PQExpBuffer buf , JsonToken type )
388400{
@@ -493,10 +505,10 @@ show_instance_json(parray *backup_list)
493505
494506 /* Begin of instance object */
495507 json_add (buf , JT_BEGIN_OBJECT );
508+ json_add_key (buf , instance_name , false);
496509
497- json_add_value (buf , "instance" , instance_name , false);
498-
499- json_add_key (buf , "backups" , true);
510+ json_add (buf , JT_BEGIN_OBJECT );
511+ json_add_key (buf , "backups" , false);
500512
501513 /*
502514 * List backups.
@@ -516,14 +528,19 @@ show_instance_json(parray *backup_list)
516528 appendPQExpBufferChar (buf , ',' );
517529
518530 json_add (buf , JT_BEGIN_OBJECT );
531+ json_add_key (buf , base36enc (backup -> start_time ), false);
519532
520- json_add_value (buf , "id" , base36enc (backup -> start_time ), false);
533+ /* Show backup attributes */
534+ json_add (buf , JT_BEGIN_OBJECT );
521535
522536 if (backup -> parent_backup != 0 )
537+ {
523538 json_add_value (buf , "parent-backup-id" ,
524- base36enc (backup -> parent_backup ), true);
525-
526- json_add_value (buf , "backup-mode" , pgBackupGetBackupMode (backup ), true);
539+ base36enc (backup -> parent_backup ), false);
540+ json_add_value (buf , "backup-mode" , pgBackupGetBackupMode (backup ), true);
541+ }
542+ else
543+ json_add_value (buf , "backup-mode" , pgBackupGetBackupMode (backup ), false);
527544
528545 json_add_value (buf , "wal" , backup -> stream ? "STREAM" : "ARCHIVE" , true);
529546
@@ -545,6 +562,7 @@ show_instance_json(parray *backup_list)
545562 json_add_key (buf , "checksum-version" , true);
546563 appendPQExpBuffer (buf , "%u" , backup -> checksum_version );
547564
565+ json_add_value (buf , "program-version" , backup -> program_version , true);
548566 json_add_value (buf , "server-version" , backup -> server_version , true);
549567
550568 json_add_key (buf , "current-tli" , true);
@@ -594,11 +612,15 @@ show_instance_json(parray *backup_list)
594612
595613 json_add_value (buf , "status" , status2str (backup -> status ), true);
596614
615+ json_add (buf , JT_END_OBJECT );
616+ /* End of backup attributes */
617+
597618 json_add (buf , JT_END_OBJECT );
598619 }
599620
600621 /* End of backups */
601622 json_add (buf , JT_END_ARRAY );
623+ json_add (buf , JT_END_OBJECT );
602624
603625 /* End of instance object */
604626 json_add (buf , JT_END_OBJECT );
0 commit comments