2015-08-06 4 views
10

Ich habe das C-Dokument unter avro durchlaufen und ich sehe, dass ich nur AVRO-Ausgabe in Datei erhalten kann. Wie bekomme ich die serialisierte Ausgabe in einen Puffer, so dass ich über einen TCP-Socket senden kann. Jede Hilfe wird sehr geschätzt.unterstützt die avro C-Implementierung das Streaming statt der Dateiausgabe?

+0

Warum nicht einfach in die Steckdose schreiben? –

+0

_Any Hilfe ist sehr geschätzt. _ Hmmm, ein Dankeschön Kommentar für die einzige Antwort könnte nett sein. – ryyker

Antwort

2

Es gibt eine avro_writer_memory() genau für diesen Fall, es dauert Pufferzeiger und Länge als Parameter und gibt Ihnen avro_writer_t, die in regulären Schreibfunktionen verwendet werden können. Sie können seine Verwendung in Tests wie this oder this finden. Das Mindest Beispiel wird so etwas sein (zum Ausgeben codierter Wert auf stderr, so besser, dass Datei zu einem gewissen umleiten und es nach dem Programmlauf untersuchen):

#include <avro.h> 
#include <stdio.h> 
#include <unistd.h> 

static const char json_schema[] = "{ \"type\": \"string\" }"; 

int main(void) 
{ 
    char buf[1024]; 
    avro_writer_t writer; 
    avro_schema_t schema; 
    avro_value_iface_t* iface; 
    avro_value_t val; 
    size_t len; 

    if (avro_schema_from_json_literal(json_schema, &schema) != 0) { 
     printf("failed to initialize schema\n"); 
     goto out; 
    } 
    if ((writer = avro_writer_memory(buf, sizeof(buf))) == NULL) { 
     printf("failed to initialize writer\n"); 
     goto out_schema; 
    } 
    if ((iface = avro_generic_class_from_schema(schema)) == NULL) { 
     printf("failed to get class from schema\n"); 
     goto out_writer; 
    } 
    if (avro_generic_value_new(iface, &val) != 0) { 
     printf("failed to create new value\n"); 
     goto out_iface; 
    } 
    if (avro_value_reset(&val) != 0) { 
     printf("failed to reset value\n"); 
     goto out_val; 
    } 
    if (avro_value_set_string(&val, "some string wrapped by avro") != 0) { 
     printf("failed to set value string\n"); 
     goto out_val; 
    } 
    if (avro_value_write(writer, &val) != 0) { 
     printf("failed to write value into the buffer\n"); 
     goto out_val; 
    } 
    len = avro_writer_tell(writer); 
    printf("got %lu bytes\n", (unsigned long)len); 
    if (write(STDERR_FILENO, buf, len) != len) { 
     printf("failed to write to stderr, oops\n"); 
     goto out_val; 
    } 
out_val: 
    avro_value_decref(&val); 
out_iface: 
    avro_value_iface_decref(iface); 
out_writer: 
    avro_writer_free(writer); 
out_schema: 
    avro_schema_decref(schema); 
out: 
    return 0; 
} 

Auch gibt ein avro_writer_memory_set_dest() ist, die neu festlegen können Puffer, der vom vorhandenen Writer verwendet werden soll.

Verwandte Themen