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