From 759d0442d4efa8fe95eca00d886e6e31a00d7116 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?= Date: Fri, 18 Jul 2025 10:24:40 +0300 Subject: [PATCH] =?UTF-8?q?mdbx-tests:=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20extra/dbi=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/extra/dbi.c++ | 181 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 165 insertions(+), 16 deletions(-) diff --git a/test/extra/dbi.c++ b/test/extra/dbi.c++ index 9aca25a5..20ae91e5 100644 --- a/test/extra/dbi.c++ +++ b/test/extra/dbi.c++ @@ -2,17 +2,9 @@ #include -static char log_buffer[1024]; +mdbx::path db_filename = "test-dbi"; -static void logger_nofmt(MDBX_log_level_t loglevel, const char *function, int line, const char *msg, - unsigned length) noexcept { - (void)length; - (void)loglevel; - fprintf(stdout, "%s:%u %s", function, line, msg); -} - -int doit() { - mdbx::path db_filename = "test-dbi"; +bool case1() { mdbx::env::remove(db_filename); mdbx::env::operate_parameters operateParameters(100, 10, mdbx::env::nested_transactions); @@ -45,15 +37,15 @@ int doit() { 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; + std::cerr << "Unexpected err " << err << " (wanna MDBX_BAD_DBI/-30780)\n"; + return false; } 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"); @@ -63,8 +55,165 @@ int doit() { env.close_map(dbi); } - std::cout << "OK\n"; - return EXIT_SUCCESS; + return true; +} + +bool case2() { + bool ok = true; + mdbx::env_managed::create_parameters createParameters; + mdbx::env::remove(db_filename); + { + mdbx::env::operate_parameters operateParameters(0, 10, mdbx::env::nested_transactions); + mdbx::env_managed env(db_filename, createParameters, operateParameters); + { + mdbx::txn_managed txn = env.start_write(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "test", MDBX_CREATE, &dbi); + if (err != MDBX_DBS_FULL) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_DBS_FULL/-30791)\n"; + ok = false; + } + } + { + mdbx::txn_managed txn = env.start_write(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "test", MDBX_CREATE | MDBX_DUPSORT | MDBX_DUPFIXED, &dbi); + if (err != MDBX_DBS_FULL) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_DBS_FULL/-30791)\n"; + ok = false; + } + } + } + + { + mdbx::env::operate_parameters operateParameters(1, 10, mdbx::env::nested_transactions); + mdbx::env_managed env(db_filename, createParameters, operateParameters); + { + mdbx::txn_managed txn = env.start_write(); + mdbx::map_handle dbi = txn.create_map("dup", mdbx::key_mode::ordinal, mdbx::value_mode::multi_ordinal); + txn.commit(); + env.close_map(dbi); + } + { + mdbx::txn_managed txn = env.start_write(); + mdbx::map_handle dbi = txn.create_map("uni", mdbx::key_mode::reverse, mdbx::value_mode::single); + txn.commit(); + env.close_map(dbi); + } + } + + { + mdbx::env::operate_parameters operateParameters(0, 10, mdbx::env::nested_transactions); + mdbx::env_managed env(db_filename, createParameters, operateParameters); + { + mdbx::txn_managed txn = env.start_read(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "uni", MDBX_DB_ACCEDE, &dbi); + if (err != MDBX_DBS_FULL) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_DBS_FULL/-30791)\n"; + ok = false; + } + if (dbi) + env.close_map(dbi); + } + + { + mdbx::txn_managed txn = env.start_read(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "dup", MDBX_DB_ACCEDE, &dbi); + if (err != MDBX_DBS_FULL) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_DBS_FULL/-30791)\n"; + ok = false; + } + if (dbi) + env.close_map(dbi); + } + } + + { + { + mdbx::env::operate_parameters operateParameters(1, 10, mdbx::env::nested_transactions); + mdbx::env_managed env(db_filename, createParameters, operateParameters); + { + mdbx::txn_managed txn = env.start_read(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "uni", MDBX_DB_ACCEDE, &dbi); + if (err != MDBX_SUCCESS) { + std::cerr << "Unexpected err " << err << "\n"; + ok = false; + } + if (dbi) + env.close_map(dbi); + } + { + mdbx::txn_managed txn = env.start_read(); + MDBX_dbi dbi = 0; + int err = mdbx_dbi_open(txn, "dup", MDBX_DB_ACCEDE, &dbi); + if (err != MDBX_SUCCESS) { + std::cerr << "Unexpected err " << err << "\n"; + ok = false; + } + if (dbi) + env.close_map(dbi); + } + } + } + + return ok; +} + +bool case3() { + bool ok = true; + mdbx::env_managed::create_parameters createParameters; + mdbx::env::remove(db_filename); + { + mdbx::env::operate_parameters operateParameters(1, 10, mdbx::env::nested_transactions); + mdbx::env_managed env(db_filename, createParameters, operateParameters); + { + mdbx::txn_managed txn = env.start_write(); + MDBX_dbi notexists_dbi = 0; + int err = mdbx_dbi_open(txn, "test", MDBX_DB_DEFAULTS, ¬exists_dbi); + if (err != MDBX_NOTFOUND) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_NOTFOUND/-30798)\n"; + ok = false; + } + mdbx::map_handle dbi = txn.create_map("test", mdbx::key_mode::ordinal, mdbx::value_mode::single); + dbi = txn.open_map("test", mdbx::key_mode::ordinal, mdbx::value_mode::single); + err = mdbx_dbi_close(env, dbi); + if (err != MDBX_DANGLING_DBI) { + std::cerr << "Unexpected err " << err << " (wanna MDBX_DANGLING_DBI/-30412)\n"; + ok = false; + } + txn.commit(); + env.close_map(dbi); + } + } + return ok; +} + +int doit() { + + bool ok = true; + ok = case1() && ok; + ok = case2() && ok; + ok = case3() && ok; + + if (ok) { + std::cout << "OK\n"; + return EXIT_SUCCESS; + } else { + std::cerr << "FAIL\n"; + return EXIT_FAILURE; + } +} + +static char log_buffer[1024]; + +static void logger_nofmt(MDBX_log_level_t loglevel, const char *function, int line, const char *msg, + unsigned length) noexcept { + (void)length; + (void)loglevel; + fprintf(stdout, "%s:%u %s", function, line, msg); } int main(int argc, char *argv[]) {