Does not throw.
| 515 | |
| 516 | // Does not throw. |
| 517 | Future<> ParseMetaDataAsync() { |
| 518 | int64_t footer_read_size; |
| 519 | BEGIN_PARQUET_CATCH_EXCEPTIONS |
| 520 | footer_read_size = GetFooterReadSize(); |
| 521 | END_PARQUET_CATCH_EXCEPTIONS |
| 522 | // Assumes this is kept alive externally |
| 523 | return source_->ReadAsync(source_size_ - footer_read_size, footer_read_size) |
| 524 | .Then([this, footer_read_size]( |
| 525 | const std::shared_ptr<::arrow::Buffer>& footer_buffer) -> Future<> { |
| 526 | uint32_t metadata_len; |
| 527 | BEGIN_PARQUET_CATCH_EXCEPTIONS |
| 528 | metadata_len = ParseFooterLength(footer_buffer, footer_read_size); |
| 529 | END_PARQUET_CATCH_EXCEPTIONS |
| 530 | int64_t metadata_start = source_size_ - kFooterSize - metadata_len; |
| 531 | |
| 532 | std::shared_ptr<::arrow::Buffer> metadata_buffer; |
| 533 | if (footer_read_size >= (metadata_len + kFooterSize)) { |
| 534 | metadata_buffer = |
| 535 | SliceBuffer(footer_buffer, footer_read_size - metadata_len - kFooterSize, |
| 536 | metadata_len); |
| 537 | return ParseMaybeEncryptedMetaDataAsync(footer_buffer, |
| 538 | std::move(metadata_buffer), |
| 539 | footer_read_size, metadata_len); |
| 540 | } |
| 541 | return source_ |
| 542 | ->ReadAsync(metadata_start, metadata_len, /*allow_short_read=*/false) |
| 543 | .Then([this, footer_buffer, footer_read_size, metadata_len]( |
| 544 | const std::shared_ptr<::arrow::Buffer>& metadata_buffer) { |
| 545 | return ParseMaybeEncryptedMetaDataAsync(footer_buffer, metadata_buffer, |
| 546 | footer_read_size, metadata_len); |
| 547 | }); |
| 548 | }); |
| 549 | } |
| 550 | |
| 551 | // Continuation |
| 552 | Future<> ParseMaybeEncryptedMetaDataAsync( |
no test coverage detected