Mercurial > dovecot > core-2.2
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 {