changeset 19734:b5fcfa9ab945

doveadm-print: Fix doveadm_print_json_print_stream
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Tue, 09 Feb 2016 10:03:56 +0200
parents cf333b33c3ef
children a3872143befd
files src/doveadm/doveadm-print-json.c
diffstat 1 files changed, 20 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-print-json.c	Mon Feb 08 22:57:13 2016 +0100
+++ b/src/doveadm/doveadm-print-json.c	Tue Feb 09 10:03:56 2016 +0200
@@ -12,6 +12,8 @@
 struct doveadm_print_json_context {
 	unsigned int header_idx, header_count;
 	bool first_row;
+	bool in_stream;
+	bool flushed;
 	ARRAY(struct doveadm_print_header) headers;
 	pool_t pool;
 	string_t *str;
@@ -28,6 +30,7 @@
 	ctx.str = str_new(ctx.pool, 256);
 	p_array_init(&ctx.headers, ctx.pool, 1);
 	ctx.first_row = TRUE;
+	ctx.in_stream = FALSE;
 }
 
 static void
@@ -94,25 +97,23 @@
 static void
 doveadm_print_json_print_stream(const unsigned char *value, size_t size)
 {
+	if (!ctx.in_stream) {
+		const struct doveadm_print_header *hdr =
+			array_idx(&ctx.headers, ctx.header_idx);
+		doveadm_print_json_value_header(hdr);
+		i_assert((hdr->flags & DOVEADM_PRINT_HEADER_FLAG_NUMBER) == 0);
+		str_append_c(ctx.str, '"');
+		ctx.in_stream = TRUE;
+	}
+
 	if (size == 0) {
-		doveadm_print_json_print("");
+		str_append_c(ctx.str, '"');
+		doveadm_print_json_value_footer();
+		ctx.in_stream = FALSE;
 		return;
 	}
 
-	const struct doveadm_print_header *hdr = array_idx(&ctx.headers, ctx.header_idx);
-
-	doveadm_print_json_value_header(hdr);
-
-	if ((hdr->flags & DOVEADM_PRINT_HEADER_FLAG_NUMBER) != 0) {
-		i_assert(str_is_float((const char*)value, (char)value[size]));
-		str_append_data(ctx.str, value, size);
-	} else {
-		str_append_c(ctx.str, '"');
-		json_append_escaped_data(ctx.str, value, size);
-		str_append_c(ctx.str, '"');
-	}
-
-	doveadm_print_json_value_footer();
+	json_append_escaped_data(ctx.str, value, size);
 
 	if (str_len(ctx.str) >= IO_BLOCK_SIZE)
 		doveadm_print_json_flush_internal();
@@ -126,6 +127,10 @@
 
 static void doveadm_print_json_flush(void)
 {
+	if (ctx.flushed)
+		return;
+	ctx.flushed = TRUE;
+
 	if (ctx.first_row == FALSE)
 		str_append_c(ctx.str,']');
 	else {