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,
-- 
kou

In <[email protected]>
  "Re: [C/GLib] Trying (and failing) to send RecordBatches between Client and 
Server in C" on Thu, 7 Jul 2022 14:17:39 +0200,
  Joel Ziegler <[email protected]> wrote:

> Thanks a lot for the reply! The conversion works as you wrote it. I am
> still unsure, how to send the IPC format written buffer. I tried
> getting a pointer to the data and length, so that i can simply send
> the data over the network, but the buffer created from the data
> pointer and length is not the same.
> 
> 
>     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);
> 
>     // Receiving side
>     GArrowBuffer *receivingBuffer = garrow_buffer_new(data, length);
>     GArrowBufferInputStream *inputStream =
> garrow_buffer_input_stream_new(GARROW_BUFFER(receivingBuffer));
> 
> 
> On 06.07.22 09:35, Sutou Kouhei wrote:
>> Hi,
>>
>> You need to use GArrowRecordBatchStreamWriter instead of
>> garrow_output_stream_write_record_batch() to read by
>> GArrowRecordBatchStreamReader.
>>
>> GArrowRecordBatchStreamWriter and
>> GArrowRecordBatchStreamReader assume
>> IPC Streaming Format
>> https://arrow.apache.org/docs/format/Columnar.html#ipc-streaming-format
>> but garrow_output_stream_write_record_batch() just writes a
>> RecordBatch message
>> https://arrow.apache.org/docs/format/Columnar.html#recordbatch-message
>> .
>>
>> void testRecordbatchStream(GArrowRecordBatch *rb){
>>    GError *error = NULL;
>>
>>    // Write Recordbatch
>>    GArrowResizableBuffer *buffer = garrow_resizable_buffer_new(300,
>>    &error);
>>    GArrowBufferOutputStream *bufferStream =
>>      garrow_buffer_output_stream_new(buffer);
>>    GArrowSchema *schema = garrow_record_batch_get_schema(rb);
>>    GArrowRecordBatchStreamWriter *writer =
>>      garrow_record_batch_stream_writer_new(bufferStream, schema, error);
>>    g_object_unref(schema);
>>    g_object_unref(bufferStream);
>>    garrow_record_batch_writer_write_record_batch(
>>      GARROW_RECORD_BATCH_WRITER(writer), rb, error);
>>    g_object_unref(writer);
>>
>>    // Read RecordBatch from buffer
>>    GArrowBufferInputStream *inputStream =
>>      garrow_buffer_input_stream_new(buffer);
>>    GArrowRecordBatchStreamReader *sr =
>>      garrow_record_batch_stream_reader_new(
>>        GARROW_INPUT_STREAM(inputStream), &error);
>>    g_object_unref(inputStream);
>>    GArrowRecordBatch *rb2 = garrow_record_batch_reader_read_next(sr,
>>    &error);
>>    printf("Received RB: \n%s\n", garrow_record_batch_to_string(rb2,
>>    &error));
>>    g_object_urnef(rb2);
>>    g_object_unref(sr);
>>
>>    g_object_unref(buffer);
>> }
>>
>> Your code misses g_object_unref()s. You need to call
>> g_object_unref() when an object is no longer needed. If you
>> forget to call g_object_unref(), your program causes a
>> memory leak.
>>
>>
>> Thanks,

Reply via email to