From bc464521c0b9a8c1f00c6ad3c1d292c8292b1eae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?=
 =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= <leo@yuriev.ru>
Date: Sun, 2 Mar 2025 00:42:55 +0300
Subject: [PATCH] =?UTF-8?q?mdbx-tests:=20=D1=80=D0=B0=D1=81=D1=88=D0=B8?=
 =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20`extra/dbi`.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 test/extra/dbi.c++ | 51 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 43 insertions(+), 8 deletions(-)

diff --git a/test/extra/dbi.c++ b/test/extra/dbi.c++
index 9ed37c45..fe238415 100644
--- a/test/extra/dbi.c++
+++ b/test/extra/dbi.c++
@@ -20,18 +20,53 @@ int main(int argc, const char *argv[]) {
   mdbx::path db_filename = "test-dbi";
   mdbx::env::remove(db_filename);
 
-  mdbx::env::operate_parameters operateParameters(100, 10);
+  mdbx::env::operate_parameters operateParameters(100, 10, mdbx::env::nested_transactions);
   mdbx::env_managed::create_parameters createParameters;
   {
-    mdbx::env_managed env2(db_filename, createParameters, operateParameters);
-    mdbx::txn_managed txn2 = env2.start_write(false);
-    /* mdbx::map_handle testHandle2 = */ txn2.create_map("fap1", mdbx::key_mode::reverse, mdbx::value_mode::single);
-    txn2.commit();
+    mdbx::env_managed env(db_filename, createParameters, operateParameters);
+    mdbx::txn_managed txn = env.start_write();
+    /* mdbx::map_handle dbi = */ txn.create_map("fap1", mdbx::key_mode::reverse, mdbx::value_mode::single);
+    txn.commit();
   }
+
   mdbx::env_managed env(db_filename, createParameters, operateParameters);
-  mdbx::txn_managed txn = env.start_write(false);
-  /* mdbx::map_handle testHandle = */ txn.create_map("fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
-  txn.commit();
+  {
+    // проверяем доступность в родительской транзакции хендла открытого в дочерней транзакции после коммита
+    mdbx::txn_managed txn = env.start_write();
+    mdbx::txn_managed nested = txn.start_nested();
+    mdbx::map_handle dbi = nested.open_map_accede("fap1");
+    nested.commit();
+    MDBX_MAYBE_UNUSED auto stat = txn.get_map_stat(dbi);
+    txn.commit();
+    env.close_map(dbi);
+  }
+
+  {
+    // проверяем НЕ доступность в родительской транзакции хендла открытого в дочерней транзакции после прерывания
+    mdbx::txn_managed txn = env.start_write();
+    mdbx::txn_managed nested = txn.start_nested();
+    mdbx::map_handle dbi = nested.open_map_accede("fap1");
+    nested.abort();
+    MDBX_stat stat;
+    int err = mdbx_dbi_stat(txn, dbi, &stat, sizeof(stat));
+    if (err != MDBX_BAD_DBI) {
+      std::cerr << "unexpected result err-code " << err;
+      return EXIT_FAILURE;
+    }
+    txn.commit();
+  }
+
+  {
+    // снова проверяем что таблица открывается и хендл доступень в родительской транзакции после коммита открывшей его
+    // дочерней
+    mdbx::txn_managed txn = env.start_write();
+    mdbx::txn_managed nested = txn.start_nested();
+    mdbx::map_handle dbi = nested.open_map_accede("fap1");
+    nested.commit();
+    MDBX_MAYBE_UNUSED auto stat = txn.get_map_stat(dbi);
+    txn.commit();
+    env.close_map(dbi);
+  }
 
   std::cout << "OK\n";
   return EXIT_SUCCESS;