Hi, > GBytes *data = garrow_buffer_get_data(GARROW_BUFFER(buffer)); > gint64 length = garrow_buffer_get_size(GARROW_BUFFER(buffer)); > > GArrowBuffer *receivingBuffer = garrow_buffer_new(data, length);
The data is GBytes * not const char *. You need to get raw data from GBytes *: GBytes *data = garrow_buffer_get_data(GARROW_BUFFER(buffer)); gsize data_size; gconstpointer data_raw = g_bytes_get_data(data, &data_size); GArrowBuffer *receivingBuffer = garrow_buffer_new(data_raw, data_size); And you need to call g_bytes_unref() against the data when no longer needed: g_bytes_unref(data); Thanks, -- kou In <[email protected]> "Re: [C/GLib] Trying (and failing) to send RecordBatches between Client and Server in C" on Fri, 8 Jul 2022 15:05:52 +0200, Joel Ziegler <[email protected]> wrote: > Hi Sutou Kouhei, > > closing the writer before requesting the data does not solve the > problem at my side. Any other error i made? The error happens at the > creation of the RecordBatchStreamReader. > > > void testRecordbatchStream(GArrowRecordBatch *rb){ > GError *error = NULL; > GArrowResizableBuffer *buffer = garrow_resizable_buffer_new(300, > &error); > if(buffer == NULL){ > fprintf(stderr, "Failed to initialize resizable buffer! Error > message: %s\n", error->message); > g_error_free(error); > } > > GArrowBufferOutputStream *bufferStream = > garrow_buffer_output_stream_new(buffer); > GArrowSchema *schema = garrow_record_batch_get_schema(rb); > GArrowRecordBatchStreamWriter *sw = > garrow_record_batch_stream_writer_new(GARROW_OUTPUT_STREAM(bufferStream), > schema, &error); > if(sw == NULL){ > fprintf(stderr, "Failed to create Record batch writer! Error > message: %s\n", error->message); > g_error_free(error); > } > > g_object_unref(bufferStream); > g_object_unref(schema); > > gboolean test = > garrow_record_batch_writer_write_record_batch(GARROW_RECORD_BATCH_WRITER(sw), > rb, &error); > if(!test){ > fprintf(stderr, "Failed to write Record batch! Error message: > %s\n", error->message); > g_error_free(error); > } > g_object_unref(sw); > > GBytes *data = garrow_buffer_get_data(GARROW_BUFFER(buffer)); > gint64 length = garrow_buffer_get_size(GARROW_BUFFER(buffer)); > > GArrowBuffer *receivingBuffer = garrow_buffer_new(data, length); > GArrowBufferInputStream *inputStream = > garrow_buffer_input_stream_new(GARROW_BUFFER(receivingBuffer)); // > using inital buffer here, without the intermediate data pointer, > works! > GArrowRecordBatchStreamReader *sr = > garrow_record_batch_stream_reader_new(GARROW_INPUT_STREAM(inputStream), > &error); > if(sr == NULL){ > fprintf(stderr, "Failed to create stream reader! Error > message: %s\n", error->message); > g_error_free(error); > } > > GArrowRecordBatch *rb2 = > garrow_record_batch_reader_read_next(GARROW_RECORD_BATCH_READER(sr), > &error); > if(rb == NULL){ > printf("Failed to create record batch from stream... Error > message: %s\n", error->message); > g_error_free(error); > }else { > printf("Recordbatch:\n%s\n", > garrow_record_batch_to_string(rb2, &error)); > } > > g_object_unref(inputStream); > g_object_unref(rb2); > g_object_unref(sr); > g_object_unref(buffer); > } > > > On 07.07.22 22:30, Sutou Kouhei wrote: >> Hi, >> >>> gboolean test = garrow_record_batch_writer_write_record_batch( >>> GARROW_RECORD_BATCH_WRITER(sw), rb, &error); >>> >>> GBytes *data = garrow_buffer_get_data(GARROW_BUFFER(buffer)); >>> gint64 length = garrow_buffer_get_size(GARROW_BUFFER(buffer)); >>> >>> g_object_unref(sw); >> You need to "close" the writer before you get data from >> buffer. g_object_unref(sw) closes the writer implicitly: >> >> gboolean test = garrow_record_batch_writer_write_record_batch( >> GARROW_RECORD_BATCH_WRITER(sw), rb, &error); >> g_object_unref(sw); >> >> GBytes *data = garrow_buffer_get_data(GARROW_BUFFER(buffer)); >> gint64 length = garrow_buffer_get_size(GARROW_BUFFER(buffer)); >> >> >> Thanks,
