diff --git a/src/fb-cpp/Statement.h b/src/fb-cpp/Statement.h index 396e7eb..f8590d7 100644 --- a/src/fb-cpp/Statement.h +++ b/src/fb-cpp/Statement.h @@ -408,6 +408,14 @@ namespace fbcpp return outMetadata; } + /// + /// @brief Provides direct access to the raw output message buffer. + /// + std::vector& getOutputMessage() noexcept + { + return outMessage; + } + /// /// @brief Returns the type classification reported by the server. /// diff --git a/src/test/Statement.cpp b/src/test/Statement.cpp index e1b45f9..e8722a9 100644 --- a/src/test/Statement.cpp +++ b/src/test/Statement.cpp @@ -336,6 +336,29 @@ BOOST_AUTO_TEST_CASE(descriptorMetadataFields) BOOST_CHECK(inDescriptors[0].alias.empty()); } +BOOST_AUTO_TEST_CASE(getOutputMessageContainsFetchedValueAtMetadataOffset) +{ + const auto database = getTempFile("Statement-getOutputMessageContainsFetchedValueAtMetadataOffset.fdb"); + + Attachment attachment{CLIENT, database, AttachmentOptions().setCreateDatabase(true)}; + FbDropDatabase attachmentDrop{attachment}; + + Transaction transaction{attachment}; + Statement stmt{attachment, transaction, "select 42 from rdb$database"}; + + auto& outMsg = stmt.getOutputMessage(); + BOOST_CHECK(!outMsg.empty()); + + const auto valueOffset = stmt.getOutputDescriptors()[0].offset; + + BOOST_REQUIRE(stmt.execute(transaction)); + BOOST_CHECK_EQUAL(stmt.getInt32(0).value(), 42); + + BOOST_REQUIRE_GE(outMsg.size(), valueOffset + sizeof(std::int32_t)); + const auto* data = &outMsg[valueOffset]; + BOOST_CHECK_EQUAL(*reinterpret_cast(data), 42); +} + BOOST_AUTO_TEST_SUITE_END()