| 671 | } |
| 672 | |
| 673 | Status WriteFeatherV1(const Table& table, io::OutputStream* dst) { |
| 674 | // Preamble |
| 675 | int64_t bytes_written; |
| 676 | RETURN_NOT_OK(WritePadded(dst, reinterpret_cast<const uint8_t*>(kFeatherV1MagicBytes), |
| 677 | strlen(kFeatherV1MagicBytes), &bytes_written)); |
| 678 | |
| 679 | // Write columns |
| 680 | flatbuffers::FlatBufferBuilder fbb; |
| 681 | std::vector<flatbuffers::Offset<fbs::Column>> fb_columns; |
| 682 | for (int i = 0; i < table.num_columns(); ++i) { |
| 683 | ColumnMetadata col; |
| 684 | RETURN_NOT_OK(WriteColumnV1(*table.column(i), dst, &col)); |
| 685 | auto fb_column = fbs::CreateColumn( |
| 686 | fbb, fbb.CreateString(table.field(i)->name()), GetPrimitiveArray(fbb, col.values), |
| 687 | ToFlatbufferEnum(col.meta_type), col.WriteMetadata(fbb), |
| 688 | /*user_metadata=*/0); |
| 689 | fb_columns.push_back(fb_column); |
| 690 | } |
| 691 | |
| 692 | // Finalize file footer |
| 693 | auto root = fbs::CreateCTable(fbb, /*description=*/0, table.num_rows(), |
| 694 | fbb.CreateVector(fb_columns), kFeatherV1Version, |
| 695 | /*metadata=*/0); |
| 696 | fbb.Finish(root); |
| 697 | auto buffer = std::make_shared<Buffer>(fbb.GetBufferPointer(), |
| 698 | static_cast<int64_t>(fbb.GetSize())); |
| 699 | |
| 700 | // Writer metadata |
| 701 | RETURN_NOT_OK(WritePadded(dst, buffer->data(), buffer->size(), &bytes_written)); |
| 702 | uint32_t metadata_size = static_cast<uint32_t>(bytes_written); |
| 703 | |
| 704 | // Footer: metadata length, magic bytes |
| 705 | RETURN_NOT_OK(dst->Write(&metadata_size, sizeof(uint32_t))); |
| 706 | return dst->Write(kFeatherV1MagicBytes, strlen(kFeatherV1MagicBytes)); |
| 707 | } |
| 708 | |
| 709 | // ---------------------------------------------------------------------- |
| 710 | // Reader V2 |
no test coverage detected