in extensions/nanoarrow_ipc/src/nanoarrow/nanoarrow_ipc_decoder.c [1018:1077]
ArrowErrorCode ArrowIpcDecoderDecodeHeader(struct ArrowIpcDecoder* decoder,
struct ArrowBufferView data,
struct ArrowError* error) {
struct ArrowIpcDecoderPrivate* private_data =
(struct ArrowIpcDecoderPrivate*)decoder->private_data;
ArrowIpcDecoderResetHeaderInfo(decoder);
NANOARROW_RETURN_NOT_OK(
ArrowIpcDecoderCheckHeader(decoder, &data, &decoder->header_size_bytes, error));
ns(Message_table_t) message = ns(Message_as_root(data.data.as_uint8));
if (!message) {
return EINVAL;
}
// Read some basic information from the message
int32_t metadata_version = ns(Message_version(message));
decoder->message_type = ns(Message_header_type(message));
decoder->body_size_bytes = ns(Message_bodyLength(message));
switch (decoder->metadata_version) {
case ns(MetadataVersion_V5):
break;
case ns(MetadataVersion_V1):
case ns(MetadataVersion_V2):
case ns(MetadataVersion_V3):
case ns(MetadataVersion_V4):
ArrowErrorSet(error, "Expected metadata version V5 but found %s",
ns(MetadataVersion_name(decoder->metadata_version)));
break;
default:
ArrowErrorSet(error, "Unexpected value for Message metadata version (%d)",
decoder->metadata_version);
return EINVAL;
}
flatbuffers_generic_t message_header = ns(Message_header_get(message));
switch (decoder->message_type) {
case ns(MessageHeader_Schema):
NANOARROW_RETURN_NOT_OK(
ArrowIpcDecoderDecodeSchemaHeader(decoder, message_header, error));
break;
case ns(MessageHeader_RecordBatch):
NANOARROW_RETURN_NOT_OK(
ArrowIpcDecoderDecodeRecordBatchHeader(decoder, message_header, error));
break;
case ns(MessageHeader_DictionaryBatch):
case ns(MessageHeader_Tensor):
case ns(MessageHeader_SparseTensor):
ArrowErrorSet(error, "Unsupported message type: '%s'",
ns(MessageHeader_type_name(decoder->message_type)));
return ENOTSUP;
default:
ArrowErrorSet(error, "Unnown message type: %d", (int)(decoder->message_type));
return EINVAL;
}
private_data->last_message = message_header;
return NANOARROW_OK;
}