]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: table formatter supports now writing by streaming.
authorTimo Sirainen <tss@iki.fi>
Sat, 8 Dec 2012 08:48:23 +0000 (10:48 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 8 Dec 2012 08:48:23 +0000 (10:48 +0200)
This fixes it to work with doveadm server, which sometimes may use
streaming.

src/doveadm/doveadm-print-table.c

index 06e8258ee78b460c724f9e0f17fb67565023d1fc..75c96602952b3e57e0ad88e9bcfa6119cbb7a4c7 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "str.h"
 #include "doveadm-print-private.h"
 
 #include <stdio.h>
@@ -24,6 +25,7 @@ struct doveadm_print_table_context {
        pool_t pool;
        ARRAY_DEFINE(headers, struct doveadm_print_table_header);
        ARRAY_TYPE(const_string) buffered_values;
+       string_t *stream;
        unsigned int hdr_idx;
        unsigned int columns;
 
@@ -179,10 +181,17 @@ static void doveadm_print_table_print(const char *value)
 }
 
 static void
-doveadm_print_table_print_stream(const unsigned char *value ATTR_UNUSED,
-                                size_t size ATTR_UNUSED)
+doveadm_print_table_print_stream(const unsigned char *value, size_t size)
 {
-       i_fatal("table formatter doesn't support multi-line values");
+       if (memchr(value, '\n', size) != NULL)
+               i_fatal("table formatter doesn't support multi-line values");
+
+       if (size != 0)
+               str_append_n(ctx->stream, value, size);
+       else {
+               doveadm_print_table_print(str_c(ctx->stream));
+               str_truncate(ctx->stream, 0);
+       }
 }
 
 static void doveadm_print_table_flush(void)
@@ -199,6 +208,7 @@ static void doveadm_print_table_init(void)
        pool = pool_alloconly_create("doveadm print table", 2048);
        ctx = p_new(pool, struct doveadm_print_table_context, 1);
        ctx->pool = pool;
+       ctx->stream = str_new(default_pool, 128);
        p_array_init(&ctx->headers, pool, 16);
        i_array_init(&ctx->buffered_values, 64);
        ctx->columns = DEFAULT_COLUMNS;
@@ -211,6 +221,7 @@ static void doveadm_print_table_init(void)
 
 static void doveadm_print_table_deinit(void)
 {
+       str_free(&ctx->stream);
        array_free(&ctx->buffered_values);
        pool_unref(&ctx->pool);
        ctx = NULL;