| 540 | } |
| 541 | |
| 542 | void array_deserialize( |
| 543 | Array* array, |
| 544 | SerializationType serialize_type, |
| 545 | span<const char> serialized_buffer, |
| 546 | ContextResources& resources, |
| 547 | shared_ptr<MemoryTracker> memory_tracker) { |
| 548 | try { |
| 549 | switch (serialize_type) { |
| 550 | case SerializationType::JSON: { |
| 551 | ::capnp::MallocMessageBuilder message_builder; |
| 552 | capnp::Array::Builder array_builder = |
| 553 | message_builder.initRoot<capnp::Array>(); |
| 554 | utils::decode_json_message(serialized_buffer, array_builder); |
| 555 | capnp::Array::Reader array_reader = array_builder.asReader(); |
| 556 | array_from_capnp(array_reader, resources, array, true, memory_tracker); |
| 557 | break; |
| 558 | } |
| 559 | case SerializationType::CAPNP: { |
| 560 | // Set traversal limit from config |
| 561 | uint64_t limit = resources.config() |
| 562 | .get<uint64_t>("rest.capnp_traversal_limit") |
| 563 | .value(); |
| 564 | ::capnp::ReaderOptions readerOptions; |
| 565 | // capnp uses the limit in words |
| 566 | readerOptions.traversalLimitInWords = limit / sizeof(::capnp::word); |
| 567 | |
| 568 | const auto mBytes = |
| 569 | reinterpret_cast<const kj::byte*>(serialized_buffer.data()); |
| 570 | ::capnp::FlatArrayMessageReader reader( |
| 571 | kj::arrayPtr( |
| 572 | reinterpret_cast<const ::capnp::word*>(mBytes), |
| 573 | serialized_buffer.size() / sizeof(::capnp::word)), |
| 574 | readerOptions); |
| 575 | capnp::Array::Reader array_reader = reader.getRoot<capnp::Array>(); |
| 576 | array_from_capnp(array_reader, resources, array, true, memory_tracker); |
| 577 | break; |
| 578 | } |
| 579 | default: { |
| 580 | throw ArraySerializationException( |
| 581 | "Error deserializing array; Unknown serialization type passed"); |
| 582 | } |
| 583 | } |
| 584 | |
| 585 | } catch (kj::Exception& e) { |
| 586 | throw ArraySerializationException( |
| 587 | "Error deserializing array; kj::Exception: " + |
| 588 | std::string(e.getDescription().cStr())); |
| 589 | } catch (std::exception& e) { |
| 590 | throw ArraySerializationException( |
| 591 | "Error deserializing array; exception " + std::string(e.what())); |
| 592 | } |
| 593 | } |
| 594 | |
| 595 | Status array_open_serialize( |
| 596 | const Array& array, |
no test coverage detected