From 4ec3a3f31e103c943a0582ad334d3e50b8808aa6 Mon Sep 17 00:00:00 2001 From: Adriano dos Santos Fernandes Date: Wed, 8 Jul 2026 22:57:14 -0300 Subject: [PATCH] Add Attachment::ping and Attachment::resetSession methods --- src/fb-cpp/Attachment.cpp | 19 +++++++++++++++++++ src/fb-cpp/Attachment.h | 10 ++++++++++ src/test/Attachment.cpp | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/fb-cpp/Attachment.cpp b/src/fb-cpp/Attachment.cpp index 53aabb1..63f86ef 100644 --- a/src/fb-cpp/Attachment.cpp +++ b/src/fb-cpp/Attachment.cpp @@ -97,6 +97,25 @@ void Attachment::dropDatabase() disconnectOrDrop(true); } +void Attachment::ping() +{ + assert(isValid()); + + StatusWrapper statusWrapper{*client}; + + handle->ping(&statusWrapper); +} + +void Attachment::resetSession() +{ + assert(isValid()); + + StatusWrapper statusWrapper{*client}; + + handle->execute( + &statusWrapper, nullptr, 0, "alter session reset", SQL_DIALECT_V6, nullptr, nullptr, nullptr, nullptr); +} + bool Attachment::execute(Transaction& transaction, std::string_view sql, const StatementOptions& options) { Statement statement{*this, transaction, sql, options}; diff --git a/src/fb-cpp/Attachment.h b/src/fb-cpp/Attachment.h index 368af38..128ed91 100644 --- a/src/fb-cpp/Attachment.h +++ b/src/fb-cpp/Attachment.h @@ -306,6 +306,16 @@ namespace fbcpp /// void dropDatabase(); + /// + /// Checks if the connection to the database is alive. + /// + void ping(); + + /// + /// Resets the session state. + /// + void resetSession(); + /// /// Prepares and executes an SQL statement using the supplied transaction. /// diff --git a/src/test/Attachment.cpp b/src/test/Attachment.cpp index 03ffd8f..d21a814 100644 --- a/src/test/Attachment.cpp +++ b/src/test/Attachment.cpp @@ -733,4 +733,37 @@ BOOST_AUTO_TEST_CASE(isNotValidAfterDropDatabase) BOOST_CHECK_EQUAL(attachment1.isValid(), false); } +BOOST_AUTO_TEST_CASE(ping) +{ + const auto database = getTempFile("Attachment-ping.fdb"); + Attachment attachment{CLIENT, database, AttachmentOptions().setCreateDatabase(true).setForcedWrites(false)}; + FbDropDatabase attachmentDrop{attachment}; + + BOOST_CHECK_NO_THROW(attachment.ping()); +} + +BOOST_AUTO_TEST_CASE(resetSession) +{ + const auto database = getTempFile("Attachment-resetSession.fdb"); + Attachment attachment{CLIENT, database, AttachmentOptions().setCreateDatabase(true).setForcedWrites(false)}; + FbDropDatabase attachmentDrop{attachment}; + + Transaction transaction{attachment}; + attachment.execute(transaction, + "select rdb$set_context('USER_SESSION', 'test_var', 'test_value') from rdb$database"); + const auto valueBefore = attachment.queryScalar( + transaction, "select rdb$get_context('USER_SESSION', 'test_var') from rdb$database"); + BOOST_REQUIRE(valueBefore.has_value()); + BOOST_CHECK_EQUAL(*valueBefore, "test_value"); + transaction.commit(); + + attachment.resetSession(); + + Transaction transaction2{attachment}; + const auto valueAfter = attachment.queryScalar( + transaction2, "select rdb$get_context('USER_SESSION', 'test_var') from rdb$database"); + BOOST_CHECK(!valueAfter.has_value()); + transaction2.commit(); +} + BOOST_AUTO_TEST_SUITE_END()