mirror of
https://github.com/isar/libmdbx.git
synced 2025-08-19 19:39:26 +08:00
mdbx: новые настройки clang-format (косметика).
This commit is contained in:
@@ -26,8 +26,7 @@ std::string format_va(const char *fmt, va_list ap) {
|
||||
result.reserve(size_t(needed + 1));
|
||||
result.resize(size_t(needed), '\0');
|
||||
assert(int(result.capacity()) > needed);
|
||||
int actual = vsnprintf(const_cast<char *>(result.data()), result.capacity(),
|
||||
fmt, ones);
|
||||
int actual = vsnprintf(const_cast<char *>(result.data()), result.capacity(), fmt, ones);
|
||||
assert(actual == needed);
|
||||
(void)actual;
|
||||
va_end(ones);
|
||||
@@ -47,10 +46,8 @@ struct acase {
|
||||
unsigned vlen_min, vlen_max;
|
||||
unsigned dupmax_log2;
|
||||
|
||||
acase(unsigned klen_min, unsigned klen_max, unsigned vlen_min,
|
||||
unsigned vlen_max, unsigned dupmax_log2)
|
||||
: klen_min(klen_min), klen_max(klen_max), vlen_min(vlen_min),
|
||||
vlen_max(vlen_max), dupmax_log2(dupmax_log2) {}
|
||||
acase(unsigned klen_min, unsigned klen_max, unsigned vlen_min, unsigned vlen_max, unsigned dupmax_log2)
|
||||
: klen_min(klen_min), klen_max(klen_max), vlen_min(vlen_min), vlen_max(vlen_max), dupmax_log2(dupmax_log2) {}
|
||||
};
|
||||
|
||||
// std::random_device rd;
|
||||
@@ -80,33 +77,26 @@ static mdbx::slice mk_val(mdbx::default_buffer &buf, const acase &thecase) {
|
||||
|
||||
static std::string name(unsigned n) { return format("Commitment_%05u", n); }
|
||||
|
||||
static mdbx::map_handle create_and_fill(mdbx::txn txn, const acase &thecase,
|
||||
const unsigned n) {
|
||||
static mdbx::map_handle create_and_fill(mdbx::txn txn, const acase &thecase, const unsigned n) {
|
||||
auto map = txn.create_map(name(n),
|
||||
(thecase.klen_min == thecase.klen_max &&
|
||||
(thecase.klen_min == 4 || thecase.klen_max == 8))
|
||||
(thecase.klen_min == thecase.klen_max && (thecase.klen_min == 4 || thecase.klen_max == 8))
|
||||
? mdbx::key_mode::ordinal
|
||||
: mdbx::key_mode::usual,
|
||||
(thecase.vlen_min == thecase.vlen_max)
|
||||
? mdbx::value_mode::multi_samelength
|
||||
: mdbx::value_mode::multi);
|
||||
(thecase.vlen_min == thecase.vlen_max) ? mdbx::value_mode::multi_samelength
|
||||
: mdbx::value_mode::multi);
|
||||
|
||||
if (txn.get_map_stat(map).ms_entries < NN) {
|
||||
mdbx::default_buffer k, v;
|
||||
for (auto i = 0u; i < NN; i++) {
|
||||
mk_key(k, thecase);
|
||||
for (auto ii = thecase.dupmax_log2
|
||||
? 1u + (rnd() & ((2u << thecase.dupmax_log2) - 1u))
|
||||
: 1u;
|
||||
ii > 0; --ii)
|
||||
for (auto ii = thecase.dupmax_log2 ? 1u + (rnd() & ((2u << thecase.dupmax_log2) - 1u)) : 1u; ii > 0; --ii)
|
||||
txn.upsert(map, k, mk_val(v, thecase));
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
static void chunched_delete(mdbx::txn txn, const acase &thecase,
|
||||
const unsigned n) {
|
||||
static void chunched_delete(mdbx::txn txn, const acase &thecase, const unsigned n) {
|
||||
// printf(">> %s, case #%i\n", __FUNCTION__, n);
|
||||
mdbx::default_buffer k, v;
|
||||
auto map = txn.open_map_accede(name(n));
|
||||
@@ -121,27 +111,20 @@ static void chunched_delete(mdbx::txn txn, const acase &thecase,
|
||||
bool last_r;
|
||||
|
||||
if (true == ((last_op = "MDBX_GET_BOTH"),
|
||||
(last_r = cursor.find_multivalue(
|
||||
mk_key(k, thecase), mk_val(v, thecase), false))) ||
|
||||
(last_r = cursor.find_multivalue(mk_key(k, thecase), mk_val(v, thecase), false))) ||
|
||||
rnd() % 3 == 0 ||
|
||||
true == ((last_op = "MDBX_SET_RANGE"),
|
||||
(last_r = cursor.lower_bound(mk_key(k, thecase), false)))) {
|
||||
true == ((last_op = "MDBX_SET_RANGE"), (last_r = cursor.lower_bound(mk_key(k, thecase), false)))) {
|
||||
int i = int(rnd() % 7) - 3;
|
||||
// if (i)
|
||||
// printf(" %s -> %s\n", last_op, last_r ? "true" : "false");
|
||||
// printf("== shift multi %i\n", i);
|
||||
try {
|
||||
while (i < 0 &&
|
||||
true == ((last_op = "MDBX_PREV_DUP"),
|
||||
(last_r = cursor.to_current_prev_multi(false))))
|
||||
while (i < 0 && true == ((last_op = "MDBX_PREV_DUP"), (last_r = cursor.to_current_prev_multi(false))))
|
||||
++i;
|
||||
while (i > 0 &&
|
||||
true == ((last_op = "MDBX_NEXT_DUP"),
|
||||
(last_r = cursor.to_current_next_multi(false))))
|
||||
while (i > 0 && true == ((last_op = "MDBX_NEXT_DUP"), (last_r = cursor.to_current_next_multi(false))))
|
||||
--i;
|
||||
} catch (const mdbx::no_data &) {
|
||||
printf("cursor_del() -> exception, last %s %s\n", last_op,
|
||||
last_r ? "true" : "false");
|
||||
printf("cursor_del() -> exception, last %s %s\n", last_op, last_r ? "true" : "false");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -159,8 +142,7 @@ static void chunched_delete(mdbx::txn txn, const acase &thecase,
|
||||
// printf(" cursor_del() -> %s\n", last_r ? "true" : "false");
|
||||
} while (cursor.to_next(false) && --i > 0);
|
||||
} catch (const mdbx::no_data &) {
|
||||
printf("cursor_del() -> exception, last %s %s\n", last_op,
|
||||
last_r ? "true" : "false");
|
||||
printf("cursor_del() -> exception, last %s %s\n", last_op, last_r ? "true" : "false");
|
||||
}
|
||||
|
||||
// (void) last_op;
|
||||
@@ -178,8 +160,8 @@ static void chunched_delete(mdbx::txn txn, const acase &thecase,
|
||||
|
||||
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 {
|
||||
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);
|
||||
@@ -187,12 +169,10 @@ static void logger_nofmt(MDBX_log_level_t loglevel, const char *function,
|
||||
|
||||
bool outofrange_prev(mdbx::env env) {
|
||||
mdbx::cursor_managed cursor;
|
||||
const std::array<mdbx::pair, 4> items = {
|
||||
{{"k1", "v1"}, {"k1", "v2"}, {"k2", "v1"}, {"k2", "v2"}}};
|
||||
const std::array<mdbx::pair, 4> items = {{{"k1", "v1"}, {"k1", "v2"}, {"k2", "v1"}, {"k2", "v2"}}};
|
||||
|
||||
auto txn = env.start_write();
|
||||
auto multi =
|
||||
txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
auto multi = txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
auto simple = txn.create_map("simple");
|
||||
txn.clear_map(multi);
|
||||
txn.clear_map(simple);
|
||||
@@ -242,12 +222,10 @@ bool outofrange_prev(mdbx::env env) {
|
||||
}
|
||||
|
||||
bool next_prev_current(mdbx::env env) {
|
||||
const std::array<mdbx::pair, 4> items = {
|
||||
{{"k1", "v1"}, {"k1", "v2"}, {"k2", "v1"}, {"k2", "v2"}}};
|
||||
const std::array<mdbx::pair, 4> items = {{{"k1", "v1"}, {"k1", "v2"}, {"k2", "v1"}, {"k2", "v2"}}};
|
||||
|
||||
auto txn = env.start_write();
|
||||
auto map =
|
||||
txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
auto map = txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
txn.clear_map(map);
|
||||
for (const auto &i : items)
|
||||
txn.upsert(map, i);
|
||||
@@ -309,8 +287,7 @@ bool next_prev_current(mdbx::env env) {
|
||||
}
|
||||
|
||||
bool simple(mdbx::env env) {
|
||||
const std::array<mdbx::pair, 3> items = {
|
||||
{{"k0", "v0"}, {"k1", "v1"}, {"k2", "v2"}}};
|
||||
const std::array<mdbx::pair, 3> items = {{{"k0", "v0"}, {"k1", "v1"}, {"k2", "v2"}}};
|
||||
|
||||
auto txn = env.start_write();
|
||||
auto map = txn.create_map("simple");
|
||||
@@ -376,14 +353,12 @@ int main(int argc, const char *argv[]) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt,
|
||||
log_buffer, sizeof(log_buffer));
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt, log_buffer, sizeof(log_buffer));
|
||||
|
||||
mdbx::path db_filename = "test-crunched-del";
|
||||
mdbx::env::remove(db_filename);
|
||||
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters(42));
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(), mdbx::env::operate_parameters(42));
|
||||
if (!simple(env) || !next_prev_current(env) || !outofrange_prev(env))
|
||||
return EXIT_FAILURE;
|
||||
|
||||
@@ -392,8 +367,7 @@ int main(int argc, const char *argv[]) {
|
||||
// Значения разной длины от 100 до 1000 байт.
|
||||
testset.emplace_back(/* keylen_min */ 1, /* keylen_max */ 64,
|
||||
/* datalen_min */ 100, /* datalen_max */
|
||||
mdbx_env_get_valsize4page_max(
|
||||
env, MDBX_db_flags_t(mdbx::value_mode::multi)),
|
||||
mdbx_env_get_valsize4page_max(env, MDBX_db_flags_t(mdbx::value_mode::multi)),
|
||||
/* dups_log2 */ 6);
|
||||
// В одной таблице DupSort: path -> version_u64+data
|
||||
// path - это префикс в дереве. Самые частые длины: 1-5 байт и 32-36 байт.
|
||||
|
@@ -2,8 +2,8 @@
|
||||
|
||||
#include <iostream>
|
||||
|
||||
static void logger_nofmt(MDBX_log_level_t loglevel, const char *function,
|
||||
int line, const char *msg, unsigned length) noexcept {
|
||||
static void logger_nofmt(MDBX_log_level_t loglevel, const char *function, int line, const char *msg,
|
||||
unsigned length) noexcept {
|
||||
(void)length;
|
||||
(void)loglevel;
|
||||
std::cout << function << ":" << line << " " << msg;
|
||||
@@ -15,20 +15,17 @@ int main(int argc, const char *argv[]) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt,
|
||||
log_buffer, sizeof(log_buffer));
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt, log_buffer, sizeof(log_buffer));
|
||||
|
||||
mdbx::path db_filename = "test-cursor-closing";
|
||||
mdbx::env::remove(db_filename);
|
||||
|
||||
mdbx::env_managed env(
|
||||
db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters(42, 0, mdbx::env::nested_transactions));
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters(42, 0, mdbx::env::nested_transactions));
|
||||
|
||||
{
|
||||
auto txn = env.start_write();
|
||||
auto table = txn.create_map("dummy", mdbx::key_mode::usual,
|
||||
mdbx::value_mode::single);
|
||||
auto table = txn.create_map("dummy", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
auto cursor_1 = txn.open_cursor(table);
|
||||
auto cursor_2 = cursor_1.clone();
|
||||
|
||||
|
@@ -4,8 +4,8 @@
|
||||
|
||||
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 {
|
||||
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);
|
||||
@@ -15,8 +15,7 @@ int main(int argc, const char *argv[]) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt,
|
||||
log_buffer, sizeof(log_buffer));
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_NOTICE, MDBX_DBG_ASSERT, logger_nofmt, log_buffer, sizeof(log_buffer));
|
||||
|
||||
mdbx::path db_filename = "test-dbi";
|
||||
mdbx::env::remove(db_filename);
|
||||
@@ -26,14 +25,12 @@ int main(int argc, const char *argv[]) {
|
||||
{
|
||||
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);
|
||||
/* 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(false);
|
||||
/* mdbx::map_handle testHandle = */ txn.create_map(
|
||||
"fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
/* mdbx::map_handle testHandle = */ txn.create_map("fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
txn.commit();
|
||||
|
||||
std::cout << "OK\n";
|
||||
|
@@ -7,8 +7,7 @@
|
||||
#include <iostream>
|
||||
#include <random>
|
||||
|
||||
static ::std::ostream &operator<<(::std::ostream &out,
|
||||
const mdbx::cursor::move_operation op) {
|
||||
static ::std::ostream &operator<<(::std::ostream &out, const mdbx::cursor::move_operation op) {
|
||||
static const char *const str[] = {"FIRST",
|
||||
"FIRST_DUP",
|
||||
"GET_BOTH",
|
||||
@@ -70,54 +69,45 @@ static buffer random_value() { return random(prng() % 47); }
|
||||
|
||||
using predicate = std::function<bool(const mdbx::pair &, const mdbx::pair &)>;
|
||||
|
||||
static bool probe(mdbx::txn txn, mdbx::map_handle dbi,
|
||||
mdbx::cursor::move_operation op, predicate cmp,
|
||||
static bool probe(mdbx::txn txn, mdbx::map_handle dbi, mdbx::cursor::move_operation op, predicate cmp,
|
||||
const buffer_pair &pair) {
|
||||
auto seeker = txn.open_cursor(dbi);
|
||||
auto scanner = seeker.clone();
|
||||
|
||||
const bool scan_backward =
|
||||
op == mdbx::cursor::key_lesser_than ||
|
||||
op == mdbx::cursor::key_lesser_or_equal ||
|
||||
op == mdbx::cursor::multi_exactkey_value_lesser_than ||
|
||||
op == mdbx::cursor::multi_exactkey_value_lesser_or_equal ||
|
||||
op == mdbx::cursor::pair_lesser_than ||
|
||||
op == mdbx::cursor::pair_lesser_or_equal;
|
||||
const bool scan_backward = op == mdbx::cursor::key_lesser_than || op == mdbx::cursor::key_lesser_or_equal ||
|
||||
op == mdbx::cursor::multi_exactkey_value_lesser_than ||
|
||||
op == mdbx::cursor::multi_exactkey_value_lesser_or_equal ||
|
||||
op == mdbx::cursor::pair_lesser_than || op == mdbx::cursor::pair_lesser_or_equal;
|
||||
|
||||
const bool is_multi = mdbx::is_multi(txn.get_handle_info(dbi).value_mode());
|
||||
|
||||
auto seek_result = seeker.move(op, pair.key, pair.value, false);
|
||||
auto scan_result = scanner.fullscan(
|
||||
[cmp, &pair](const mdbx::pair &scan) -> bool { return cmp(scan, pair); },
|
||||
scan_backward);
|
||||
auto scan_result =
|
||||
scanner.fullscan([cmp, &pair](const mdbx::pair &scan) -> bool { return cmp(scan, pair); }, scan_backward);
|
||||
if (seek_result.done == scan_result &&
|
||||
(!scan_result ||
|
||||
seeker.is_same_position(
|
||||
scanner,
|
||||
op < mdbx::cursor::multi_exactkey_value_lesser_than && is_multi)))
|
||||
seeker.is_same_position(scanner, op < mdbx::cursor::multi_exactkey_value_lesser_than && is_multi)))
|
||||
return true;
|
||||
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "bug:";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << std::string(is_multi ? "multi" : "single") << "-map, op " << op
|
||||
<< ", key " << pair.key << ", value " << pair.value;
|
||||
std::cerr << std::string(is_multi ? "multi" : "single") << "-map, op " << op << ", key " << pair.key << ", value "
|
||||
<< pair.value;
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "\tscanner: ";
|
||||
if (scan_result)
|
||||
std::cerr << " done, key " << scanner.current(false).key << ", value "
|
||||
<< scanner.current(false).value;
|
||||
std::cerr << " done, key " << scanner.current(false).key << ", value " << scanner.current(false).value;
|
||||
else
|
||||
std::cerr << "not-found";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "\t seeker: " << (seek_result.done ? " done" : "not-found")
|
||||
<< ", key " << seek_result.key << ", value " << seek_result.value;
|
||||
std::cerr << "\t seeker: " << (seek_result.done ? " done" : "not-found") << ", key " << seek_result.key
|
||||
<< ", value " << seek_result.value;
|
||||
std::cerr << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool probe(mdbx::txn txn, mdbx::map_handle dbi,
|
||||
mdbx::cursor::move_operation op, predicate cmp) {
|
||||
static bool probe(mdbx::txn txn, mdbx::map_handle dbi, mdbx::cursor::move_operation op, predicate cmp) {
|
||||
const auto pair = buffer_pair(random_key(), random_value());
|
||||
const bool ok = probe(txn, dbi, op, cmp, pair);
|
||||
#if MDBX_DEBUG
|
||||
@@ -159,32 +149,27 @@ static bool test(mdbx::txn txn, mdbx::map_handle dbi) {
|
||||
|
||||
ok = probe(txn, dbi, mdbx::cursor::multi_exactkey_value_lesser_than,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 &&
|
||||
mdbx_dcmp(txn, dbi, l.value, r.value) < 0;
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 && mdbx_dcmp(txn, dbi, l.value, r.value) < 0;
|
||||
}) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::multi_exactkey_value_lesser_or_equal,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 &&
|
||||
mdbx_dcmp(txn, dbi, l.value, r.value) <= 0;
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 && mdbx_dcmp(txn, dbi, l.value, r.value) <= 0;
|
||||
}) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::multi_exactkey_value_equal,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 &&
|
||||
mdbx_dcmp(txn, dbi, l.value, r.value) == 0;
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 && mdbx_dcmp(txn, dbi, l.value, r.value) == 0;
|
||||
}) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::multi_exactkey_value_greater_or_equal,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 &&
|
||||
mdbx_dcmp(txn, dbi, l.value, r.value) >= 0;
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 && mdbx_dcmp(txn, dbi, l.value, r.value) >= 0;
|
||||
}) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::multi_exactkey_value_greater,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 &&
|
||||
mdbx_dcmp(txn, dbi, l.value, r.value) > 0;
|
||||
return mdbx_cmp(txn, dbi, l.key, r.key) == 0 && mdbx_dcmp(txn, dbi, l.value, r.value) > 0;
|
||||
}) &&
|
||||
ok;
|
||||
|
||||
@@ -205,9 +190,7 @@ static bool test(mdbx::txn txn, mdbx::map_handle dbi) {
|
||||
}) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::pair_equal,
|
||||
[](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
return l == r;
|
||||
}) &&
|
||||
[](const mdbx::pair &l, const mdbx::pair &r) -> bool { return l == r; }) &&
|
||||
ok;
|
||||
ok = probe(txn, dbi, mdbx::cursor::pair_greater_or_equal,
|
||||
[txn, dbi](const mdbx::pair &l, const mdbx::pair &r) -> bool {
|
||||
@@ -234,14 +217,11 @@ int main(int argc, const char *argv[]) {
|
||||
|
||||
mdbx::path db_filename = "test-posi";
|
||||
mdbx::env_managed::remove(db_filename);
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters(3));
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(), mdbx::env::operate_parameters(3));
|
||||
|
||||
auto txn = env.start_write();
|
||||
auto single =
|
||||
txn.create_map("single", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
auto multi =
|
||||
txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
auto single = txn.create_map("single", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
auto multi = txn.create_map("multi", mdbx::key_mode::usual, mdbx::value_mode::multi);
|
||||
for (size_t i = 0; i < 1000; ++i) {
|
||||
auto key = random_key();
|
||||
txn.upsert(single, key, random_value());
|
||||
|
@@ -37,8 +37,7 @@ int main() {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
rc = mdbx_env_open(env, "./example-db", MDBX_NOSUBDIR | MDBX_LIFORECLAIM,
|
||||
0664);
|
||||
rc = mdbx_env_open(env, "./example-db", MDBX_NOSUBDIR | MDBX_LIFORECLAIM, 0664);
|
||||
if (rc != MDBX_SUCCESS) {
|
||||
fprintf(stderr, "mdbx_env_open: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||
exit(EXIT_FAILURE);
|
||||
@@ -50,8 +49,7 @@ int main() {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
rc = mdbx_dbi_open(txn, "test", MDBX_DUPSORT | MDBX_DUPFIXED | MDBX_CREATE,
|
||||
&dbi);
|
||||
rc = mdbx_dbi_open(txn, "test", MDBX_DUPSORT | MDBX_DUPFIXED | MDBX_CREATE, &dbi);
|
||||
if (rc != MDBX_SUCCESS) {
|
||||
fprintf(stderr, "mdbx_dbi_open: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||
exit(EXIT_FAILURE);
|
||||
|
@@ -8,14 +8,11 @@
|
||||
int doit() {
|
||||
mdbx::path db_filename = "test-dupfix-multiple";
|
||||
mdbx::env_managed::remove(db_filename);
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters());
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(), mdbx::env::operate_parameters());
|
||||
|
||||
using buffer =
|
||||
mdbx::buffer<mdbx::default_allocator, mdbx::default_capacity_policy>;
|
||||
using buffer = mdbx::buffer<mdbx::default_allocator, mdbx::default_capacity_policy>;
|
||||
auto txn = env.start_write();
|
||||
auto map = txn.create_map(nullptr, mdbx::key_mode::ordinal,
|
||||
mdbx::value_mode::multi_ordinal);
|
||||
auto map = txn.create_map(nullptr, mdbx::key_mode::ordinal, mdbx::value_mode::multi_ordinal);
|
||||
|
||||
txn.insert(map, buffer::key_from_u64(21), buffer::key_from_u64(18));
|
||||
txn.insert(map, buffer::key_from_u64(7), buffer::key_from_u64(19));
|
||||
@@ -29,15 +26,11 @@ int doit() {
|
||||
|
||||
txn = env.start_read();
|
||||
auto cursor = txn.open_cursor(map);
|
||||
if (cursor.to_first().value.as_uint64() != 19 ||
|
||||
cursor.to_next().value.as_uint64() != 18 ||
|
||||
cursor.to_next().value.as_uint64() != 17 ||
|
||||
cursor.to_next().value.as_uint64() != 16 ||
|
||||
cursor.to_next().value.as_uint64() != 15 ||
|
||||
cursor.to_next().value.as_uint64() != 14 ||
|
||||
cursor.to_next().value.as_uint64() != 13 ||
|
||||
cursor.to_next().value.as_uint64() != 12 || cursor.to_next(false).done ||
|
||||
!cursor.eof()) {
|
||||
if (cursor.to_first().value.as_uint64() != 19 || cursor.to_next().value.as_uint64() != 18 ||
|
||||
cursor.to_next().value.as_uint64() != 17 || cursor.to_next().value.as_uint64() != 16 ||
|
||||
cursor.to_next().value.as_uint64() != 15 || cursor.to_next().value.as_uint64() != 14 ||
|
||||
cursor.to_next().value.as_uint64() != 13 || cursor.to_next().value.as_uint64() != 12 ||
|
||||
cursor.to_next(false).done || !cursor.eof()) {
|
||||
std::cerr << "Fail\n";
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
@@ -45,20 +38,13 @@ int doit() {
|
||||
|
||||
const uint64_t array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 42, 17, 99, 0, 33, 333};
|
||||
txn = env.start_write();
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(13), array + 3, 4,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(10), array + 0, 1,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(12), array + 2, 3,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(15), array + 5, 6,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(14), array + 4, 5,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(11), array + 1, 2,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(16), array + 6, 7,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(13), array + 3, 4, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(10), array + 0, 1, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(12), array + 2, 3, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(15), array + 5, 6, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(14), array + 4, 5, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(11), array + 1, 2, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(16), array + 6, 7, mdbx::upsert);
|
||||
txn.commit();
|
||||
|
||||
txn = env.start_read();
|
||||
@@ -69,42 +55,30 @@ int doit() {
|
||||
cursor.to_next().value.as_uint64() != 1 ||
|
||||
|
||||
/* key = 11: 2 элемента, пропуск 1 */
|
||||
cursor.to_next().value.as_uint64() != 2 ||
|
||||
cursor.to_next().value.as_uint64() != 3 ||
|
||||
cursor.to_next().value.as_uint64() != 2 || cursor.to_next().value.as_uint64() != 3 ||
|
||||
|
||||
/* key = 12: 3 элемента, пропуск 2 */
|
||||
cursor.to_next().value.as_uint64() != 3 ||
|
||||
cursor.to_next().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 3 || cursor.to_next().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
|
||||
/* key = 13: 4 элемента, пропуск 3 */
|
||||
cursor.to_next().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 4 || cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
|
||||
/* key = 14: 5 элементов, пропуск 4 */
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 5 || cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 || cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
|
||||
/* key = 15: 6 элементов, пропуск 5 */
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 ||
|
||||
cursor.to_next().value.as_uint64() != 42 ||
|
||||
cursor.to_next().value.as_uint64() != 6 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 || cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 || cursor.to_next().value.as_uint64() != 42 ||
|
||||
|
||||
/* key = 16: 7 элементов, пропуск 6 */
|
||||
cursor.to_next().value.as_uint64() != 0 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 ||
|
||||
cursor.to_next().value.as_uint64() != 42 ||
|
||||
cursor.to_next().value.as_uint64() != 0 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 || cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 || cursor.to_next().value.as_uint64() != 42 ||
|
||||
cursor.to_next().value.as_uint64() != 99 ||
|
||||
|
||||
/* key = 21 */ cursor.to_next().value.as_uint64() != 18 ||
|
||||
@@ -113,46 +87,35 @@ int doit() {
|
||||
/* key = 24 */ cursor.to_next().value.as_uint64() != 15 ||
|
||||
/* key = 25 */ cursor.to_next().value.as_uint64() != 14 ||
|
||||
/* key = 26 */ cursor.to_next().value.as_uint64() != 13 ||
|
||||
/* key = 27 */ cursor.to_next().value.as_uint64() != 12 ||
|
||||
cursor.to_next(false).done || !cursor.eof()) {
|
||||
/* key = 27 */ cursor.to_next().value.as_uint64() != 12 || cursor.to_next(false).done || !cursor.eof()) {
|
||||
std::cerr << "Fail\n";
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
txn.abort();
|
||||
|
||||
txn = env.start_write();
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(7), array + 3, 4,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(7), array + 3, 4, mdbx::update);
|
||||
txn.upsert(map, buffer::key_from_u64(10), buffer::key_from_u64(14));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(11), array + 4, 5,
|
||||
mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(12), array + 0, 1,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(11), array + 4, 5, mdbx::upsert);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(12), array + 0, 1, mdbx::update);
|
||||
txn.update(map, buffer::key_from_u64(13), buffer::key_from_u64(18));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(14), array + 2, 3,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(14), array + 2, 3, mdbx::update);
|
||||
txn.update(map, buffer::key_from_u64(15), buffer::key_from_u64(13));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(16), array + 6, 9,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(16), array + 6, 9, mdbx::update);
|
||||
txn.update(map, buffer::key_from_u64(21), buffer::key_from_u64(17));
|
||||
txn.update(map, buffer::key_from_u64(22), buffer::key_from_u64(15));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(23), array + 1, 2,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(23), array + 1, 2, mdbx::update);
|
||||
txn.update(map, buffer::key_from_u64(24), buffer::key_from_u64(16));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(25), array + 5, 6,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(25), array + 5, 6, mdbx::update);
|
||||
txn.upsert(map, buffer::key_from_u64(26), buffer::key_from_u64(12));
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(27), array + 12, 3,
|
||||
mdbx::update);
|
||||
txn.put_multiple_samelength(map, buffer::key_from_u64(27), array + 12, 3, mdbx::update);
|
||||
txn.commit();
|
||||
|
||||
txn = env.start_read();
|
||||
cursor = txn.open_cursor(map);
|
||||
if (/* key = 7 */
|
||||
cursor.to_first().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_first().value.as_uint64() != 4 || cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
|
||||
/* key = 10: 1 элемент */
|
||||
cursor.to_next().value.as_uint64() != 1 ||
|
||||
@@ -160,13 +123,10 @@ int doit() {
|
||||
cursor.to_next().value.as_uint64() != 14 ||
|
||||
|
||||
/* key = 11: 2 элемента, пропуск 1 */
|
||||
cursor.to_next().value.as_uint64() != 2 ||
|
||||
cursor.to_next().value.as_uint64() != 3 ||
|
||||
cursor.to_next().value.as_uint64() != 2 || cursor.to_next().value.as_uint64() != 3 ||
|
||||
/* +5 элементов, пропуск 4 */
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 5 || cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 || cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
|
||||
/* key = 12: 1 элемент */
|
||||
@@ -174,44 +134,33 @@ int doit() {
|
||||
/* key = 13 */ cursor.to_next().value.as_uint64() != 18 ||
|
||||
|
||||
/* key = 14: 3 элемента, пропуск 2 */
|
||||
cursor.to_next().value.as_uint64() != 3 ||
|
||||
cursor.to_next().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 3 || cursor.to_next().value.as_uint64() != 4 ||
|
||||
cursor.to_next().value.as_uint64() != 5 ||
|
||||
|
||||
/* key = 15 */ cursor.to_next().value.as_uint64() != 13 ||
|
||||
|
||||
/* key = 16: 9 элементов, пропуск 6 */
|
||||
cursor.to_next().value.as_uint64() != 0 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 ||
|
||||
cursor.to_next().value.as_uint64() != 33 ||
|
||||
cursor.to_next().value.as_uint64() != 42 ||
|
||||
cursor.to_next().value.as_uint64() != 99 ||
|
||||
cursor.to_next().value.as_uint64() != 0 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 || cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 || cursor.to_next().value.as_uint64() != 33 ||
|
||||
cursor.to_next().value.as_uint64() != 42 || cursor.to_next().value.as_uint64() != 99 ||
|
||||
cursor.to_next().value.as_uint64() != 333 ||
|
||||
|
||||
/* key = 21 */ cursor.to_next().value.as_uint64() != 17 ||
|
||||
/* key = 22 */ cursor.to_next().value.as_uint64() != 15 ||
|
||||
/* key = 23: 2 элемента, пропуск 1 */
|
||||
cursor.to_next().value.as_uint64() != 2 ||
|
||||
cursor.to_next().value.as_uint64() != 3 ||
|
||||
cursor.to_next().value.as_uint64() != 2 || cursor.to_next().value.as_uint64() != 3 ||
|
||||
/* key = 24 */ cursor.to_next().value.as_uint64() != 16 ||
|
||||
/* key = 25: 6 элемента, пропуск 5 */
|
||||
cursor.to_next().value.as_uint64() != 6 ||
|
||||
cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 ||
|
||||
cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 ||
|
||||
cursor.to_next().value.as_uint64() != 42 ||
|
||||
cursor.to_next().value.as_uint64() != 6 || cursor.to_next().value.as_uint64() != 7 ||
|
||||
cursor.to_next().value.as_uint64() != 8 || cursor.to_next().value.as_uint64() != 9 ||
|
||||
cursor.to_next().value.as_uint64() != 17 || cursor.to_next().value.as_uint64() != 42 ||
|
||||
|
||||
/* key = 26, 1+1 upsert */
|
||||
cursor.to_next().value.as_uint64() != 12 ||
|
||||
cursor.to_next().value.as_uint64() != 13 ||
|
||||
cursor.to_next().value.as_uint64() != 12 || cursor.to_next().value.as_uint64() != 13 ||
|
||||
|
||||
/* key = 27: 3 элемента, пропуск 12 */
|
||||
cursor.to_next().value.as_uint64() != 0 ||
|
||||
cursor.to_next().value.as_uint64() != 33 ||
|
||||
cursor.to_next().value.as_uint64() != 0 || cursor.to_next().value.as_uint64() != 33 ||
|
||||
cursor.to_next().value.as_uint64() != 333 ||
|
||||
|
||||
cursor.to_next(false).done || !cursor.eof()) {
|
||||
@@ -247,8 +196,7 @@ int doit() {
|
||||
|
||||
txn = env.start_write();
|
||||
txn.clear_map(map);
|
||||
map = txn.create_map(nullptr, mdbx::key_mode::usual,
|
||||
mdbx::value_mode::multi_samelength);
|
||||
map = txn.create_map(nullptr, mdbx::key_mode::usual, mdbx::value_mode::multi_samelength);
|
||||
txn.upsert(map, mdbx::slice("key1"), mdbx::slice("val1"));
|
||||
txn.upsert(map, mdbx::pair("key1", "val2"));
|
||||
txn.upsert(map, mdbx::pair("key1", "val3"));
|
||||
|
@@ -23,14 +23,11 @@ int main(int argc, char *argv[]) {
|
||||
// 1); assert(err == MDBX_SUCCESS);
|
||||
|
||||
intptr_t lowerbound(0), size(0), upperbound(mdbx::env::geometry::GiB / 2);
|
||||
intptr_t step(128 * mdbx::env::geometry::MiB),
|
||||
shrink(256 * mdbx::env::geometry::MiB), pagesize(-1);
|
||||
err = mdbx_env_set_geometry(environment, lowerbound, size, upperbound, step,
|
||||
shrink, pagesize);
|
||||
intptr_t step(128 * mdbx::env::geometry::MiB), shrink(256 * mdbx::env::geometry::MiB), pagesize(-1);
|
||||
err = mdbx_env_set_geometry(environment, lowerbound, size, upperbound, step, shrink, pagesize);
|
||||
assert(err == MDBX_SUCCESS);
|
||||
|
||||
MDBX_env_flags_t flags(MDBX_NOSUBDIR | MDBX_WRITEMAP | MDBX_LIFORECLAIM |
|
||||
MDBX_NORDAHEAD);
|
||||
MDBX_env_flags_t flags(MDBX_NOSUBDIR | MDBX_WRITEMAP | MDBX_LIFORECLAIM | MDBX_NORDAHEAD);
|
||||
err = mdbx_env_openT(environment, db_filename.c_str(), flags, 0644);
|
||||
assert(err == MDBX_SUCCESS);
|
||||
|
||||
|
@@ -27,20 +27,16 @@ static buffer random(size_t length) {
|
||||
static bool basic() {
|
||||
bool ok = true;
|
||||
const char *const hex_dump = "1D58fa\n2e46E3\nBd9c7A\nC0bF";
|
||||
const uint8_t native[] = {0x1D, 0x58, 0xfa, 0x2e, 0x46, 0xE3,
|
||||
0xBd, 0x9c, 0x7A, 0xC0, 0xbF};
|
||||
const uint8_t native[] = {0x1D, 0x58, 0xfa, 0x2e, 0x46, 0xE3, 0xBd, 0x9c, 0x7A, 0xC0, 0xbF};
|
||||
|
||||
if (mdbx::slice(hex_dump).hex_decode(true) != mdbx::slice::wrap(native))
|
||||
std::cerr << "hex_decode() failed\n";
|
||||
else if (mdbx::slice::wrap(native).encode_hex(true, 4).hex_decode(true) !=
|
||||
mdbx::slice::wrap(native))
|
||||
else if (mdbx::slice::wrap(native).encode_hex(true, 4).hex_decode(true) != mdbx::slice::wrap(native))
|
||||
std::cerr << "hex_encode(UPPERCASE) failed\n";
|
||||
else if (mdbx::slice::wrap(native).encode_hex(false).hex_decode(true) !=
|
||||
mdbx::slice::wrap(native))
|
||||
else if (mdbx::slice::wrap(native).encode_hex(false).hex_decode(true) != mdbx::slice::wrap(native))
|
||||
std::cerr << "hex_encode(lowercase) failed\n";
|
||||
|
||||
if (mdbx::slice("").as_base64_string() != "" ||
|
||||
mdbx::slice(" ").encode_base64().as_string() != "IA==" ||
|
||||
if (mdbx::slice("").as_base64_string() != "" || mdbx::slice(" ").encode_base64().as_string() != "IA==" ||
|
||||
mdbx::slice("~0").encode_base64().as_string() != "fjA=" ||
|
||||
mdbx::slice("A_z").encode_base64().as_string() != "QV96" ||
|
||||
mdbx::slice("Ka9q").encode_base64().as_string() != "S2E5cQ==" ||
|
||||
@@ -50,12 +46,9 @@ static bool basic() {
|
||||
}
|
||||
|
||||
const uint8_t base58_rfc[] = {0x00, 0x00, 0x28, 0x7f, 0xb4, 0xcd};
|
||||
if (mdbx::slice("").as_base58_string() != "" ||
|
||||
mdbx::slice(" ").encode_base58().as_string() != "Z" ||
|
||||
if (mdbx::slice("").as_base58_string() != "" || mdbx::slice(" ").encode_base58().as_string() != "Z" ||
|
||||
mdbx::slice("Hello World!").as_base58_string() != "2NEpo7TZRRrLZSi2U" ||
|
||||
mdbx::slice("The quick brown fox jumps over the lazy dog.")
|
||||
.encode_base58()
|
||||
.as_string() !=
|
||||
mdbx::slice("The quick brown fox jumps over the lazy dog.").encode_base58().as_string() !=
|
||||
"USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z" ||
|
||||
mdbx::slice::wrap(base58_rfc).as_base58_string() != "11233QC4" ||
|
||||
mdbx::slice("~0").encode_base58().as_string() != "Aby" ||
|
||||
@@ -66,15 +59,11 @@ static bool basic() {
|
||||
ok = false;
|
||||
}
|
||||
|
||||
if (mdbx::slice("").base58_decode() != mdbx::slice() ||
|
||||
mdbx::slice("Z").base58_decode() != mdbx::slice(" ") ||
|
||||
if (mdbx::slice("").base58_decode() != mdbx::slice() || mdbx::slice("Z").base58_decode() != mdbx::slice(" ") ||
|
||||
mdbx::slice("2NEpo7TZRRrLZSi2U").base58_decode() != "Hello World!" ||
|
||||
mdbx::slice(
|
||||
"USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z")
|
||||
.base58_decode() !=
|
||||
mdbx::slice("USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z").base58_decode() !=
|
||||
mdbx::slice("The quick brown fox jumps over the lazy dog.") ||
|
||||
mdbx::slice("11233QC4").base58_decode() !=
|
||||
mdbx::slice::wrap(base58_rfc) ||
|
||||
mdbx::slice("11233QC4").base58_decode() != mdbx::slice::wrap(base58_rfc) ||
|
||||
mdbx::slice("Aby").base58_decode() != mdbx::slice("~0") ||
|
||||
mdbx::slice("NxZw").base58_decode() != mdbx::slice("A_z") ||
|
||||
mdbx::slice("2vkjDi").base58_decode() != mdbx::slice("Ka9q") ||
|
||||
@@ -94,28 +83,19 @@ int main(int argc, const char *argv[]) {
|
||||
for (size_t n = 0; n < 1000; ++n) {
|
||||
for (size_t length = 0; ok && length < 111; ++length) {
|
||||
const auto pattern = random(length);
|
||||
if (pattern != pattern.encode_hex(bool(prng() & 1), prng() % 111)
|
||||
.hex_decode(true)
|
||||
.encode_hex()
|
||||
.hex_decode(false)) {
|
||||
std::cerr << "hex encode/decode failed: n " << n << ", length "
|
||||
<< length << std::endl;
|
||||
if (pattern !=
|
||||
pattern.encode_hex(bool(prng() & 1), prng() % 111).hex_decode(true).encode_hex().hex_decode(false)) {
|
||||
std::cerr << "hex encode/decode failed: n " << n << ", length " << length << std::endl;
|
||||
ok = false;
|
||||
}
|
||||
if (pattern != pattern.encode_base64(unsigned(prng() % 111))
|
||||
.base64_decode(true)
|
||||
.encode_base64()
|
||||
.base64_decode(false)) {
|
||||
std::cerr << "base64 encode/decode failed: n " << n << ", length "
|
||||
<< length << std::endl;
|
||||
if (pattern !=
|
||||
pattern.encode_base64(unsigned(prng() % 111)).base64_decode(true).encode_base64().base64_decode(false)) {
|
||||
std::cerr << "base64 encode/decode failed: n " << n << ", length " << length << std::endl;
|
||||
ok = false;
|
||||
}
|
||||
if (pattern != pattern.encode_base58(unsigned(prng() % 111))
|
||||
.base58_decode(true)
|
||||
.encode_base58()
|
||||
.base58_decode(false)) {
|
||||
std::cerr << "base58 encode/decode failed: n " << n << ", length "
|
||||
<< length << std::endl;
|
||||
if (pattern !=
|
||||
pattern.encode_base58(unsigned(prng() % 111)).base58_decode(true).encode_base58().base58_decode(false)) {
|
||||
std::cerr << "base58 encode/decode failed: n " << n << ", length " << length << std::endl;
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
|
@@ -10,14 +10,11 @@ int main(int argc, const char *argv[]) {
|
||||
|
||||
mdbx::path db_filename = "test-dupfix-multiple";
|
||||
mdbx::env_managed::remove(db_filename);
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(),
|
||||
mdbx::env::operate_parameters());
|
||||
mdbx::env_managed env(db_filename, mdbx::env_managed::create_parameters(), mdbx::env::operate_parameters());
|
||||
|
||||
using buffer =
|
||||
mdbx::buffer<mdbx::default_allocator, mdbx::default_capacity_policy>;
|
||||
using buffer = mdbx::buffer<mdbx::default_allocator, mdbx::default_capacity_policy>;
|
||||
auto txn = env.start_write();
|
||||
auto map = txn.create_map(nullptr, mdbx::key_mode::ordinal,
|
||||
mdbx::value_mode::single);
|
||||
auto map = txn.create_map(nullptr, mdbx::key_mode::ordinal, mdbx::value_mode::single);
|
||||
#if 0 /* workaround */
|
||||
txn.commit();
|
||||
env.close();
|
||||
@@ -39,14 +36,10 @@ int main(int argc, const char *argv[]) {
|
||||
txn = env.start_read();
|
||||
auto cursor = txn.open_cursor(map);
|
||||
#if defined(__cpp_lib_string_view) && __cpp_lib_string_view >= 201606L
|
||||
if (cursor.to_first().value.string_view() == "a" &&
|
||||
cursor.to_next().value.string_view() == "b" &&
|
||||
cursor.to_next().value.string_view() == "c" &&
|
||||
cursor.to_next().value.string_view() == "d" &&
|
||||
cursor.to_next().value.string_view() == "e" &&
|
||||
cursor.to_next().value.string_view() == "f" &&
|
||||
cursor.to_next().value.string_view() == "g" &&
|
||||
cursor.to_next().value.string_view() == "h" &&
|
||||
if (cursor.to_first().value.string_view() == "a" && cursor.to_next().value.string_view() == "b" &&
|
||||
cursor.to_next().value.string_view() == "c" && cursor.to_next().value.string_view() == "d" &&
|
||||
cursor.to_next().value.string_view() == "e" && cursor.to_next().value.string_view() == "f" &&
|
||||
cursor.to_next().value.string_view() == "g" && cursor.to_next().value.string_view() == "h" &&
|
||||
!cursor.to_next(false).done && cursor.eof()) {
|
||||
std::cout << "OK\n";
|
||||
return EXIT_SUCCESS;
|
||||
|
@@ -18,8 +18,8 @@ int main(int argc, const char *argv[]) {
|
||||
|
||||
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 {
|
||||
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);
|
||||
@@ -29,8 +29,7 @@ int main(int argc, const char *argv[]) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_VERBOSE, MDBX_DBG_ASSERT, logger_nofmt,
|
||||
log_buffer, sizeof(log_buffer));
|
||||
mdbx_setup_debug_nofmt(MDBX_LOG_VERBOSE, MDBX_DBG_ASSERT, logger_nofmt, log_buffer, sizeof(log_buffer));
|
||||
|
||||
mdbx::path path = "test-open";
|
||||
mdbx::env::remove(path);
|
||||
@@ -41,19 +40,16 @@ int main(int argc, const char *argv[]) {
|
||||
createParameters2.geometry.make_fixed(42 * mdbx::env::geometry::MiB);
|
||||
mdbx::env_managed env2(path, createParameters2, operateParameters2);
|
||||
mdbx::txn_managed txn2 = env2.start_write(false);
|
||||
/* mdbx::map_handle testHandle2 = */ txn2.create_map(
|
||||
"fap1", mdbx::key_mode::reverse, mdbx::value_mode::single);
|
||||
/* mdbx::map_handle testHandle2 = */ txn2.create_map("fap1", mdbx::key_mode::reverse, mdbx::value_mode::single);
|
||||
txn2.commit();
|
||||
}
|
||||
|
||||
mdbx::env::operate_parameters operateParameters(100, 10);
|
||||
mdbx::env_managed::create_parameters createParameters;
|
||||
createParameters.geometry.make_dynamic(21 * mdbx::env::geometry::MiB,
|
||||
84 * mdbx::env::geometry::MiB);
|
||||
createParameters.geometry.make_dynamic(21 * mdbx::env::geometry::MiB, 84 * mdbx::env::geometry::MiB);
|
||||
mdbx::env_managed env(path, 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);
|
||||
/* mdbx::map_handle testHandle = */ txn.create_map("fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
txn.commit();
|
||||
|
||||
std::latch starter(1);
|
||||
@@ -62,8 +58,7 @@ int main(int argc, const char *argv[]) {
|
||||
starter.wait();
|
||||
// mdbx::env_managed env(path, 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);
|
||||
/* mdbx::map_handle testHandle = */ txn.create_map("fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
txn.commit();
|
||||
});
|
||||
|
||||
@@ -71,8 +66,7 @@ int main(int argc, const char *argv[]) {
|
||||
starter.wait();
|
||||
// mdbx::env_managed env(path, 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);
|
||||
/* mdbx::map_handle testHandle = */ txn.create_map("fap1", mdbx::key_mode::usual, mdbx::value_mode::single);
|
||||
txn.commit();
|
||||
});
|
||||
|
||||
|
@@ -32,9 +32,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define IP_PRINTF_ARG_HOST(addr) \
|
||||
(int)((addr) >> 24), (int)((addr) >> 16 & 0xff), (int)((addr) >> 8 & 0xff), \
|
||||
(int)((addr) & 0xff)
|
||||
#define IP_PRINTF_ARG_HOST(addr) \
|
||||
(int)((addr) >> 24), (int)((addr) >> 16 & 0xff), (int)((addr) >> 8 & 0xff), (int)((addr) & 0xff)
|
||||
|
||||
char opt_db_path[PATH_MAX] = "./mdbx_bench2";
|
||||
static MDBX_env *env;
|
||||
@@ -88,14 +87,13 @@ static int64_t get_id_from_pool() {
|
||||
return id;
|
||||
}
|
||||
|
||||
#define MDBX_CHECK(x) \
|
||||
do { \
|
||||
const int rc = (x); \
|
||||
if (rc != MDBX_SUCCESS) { \
|
||||
printf("Error [%d] %s in %s at %s:%d\n", rc, mdbx_strerror(rc), #x, \
|
||||
__FILE__, __LINE__); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
#define MDBX_CHECK(x) \
|
||||
do { \
|
||||
const int rc = (x); \
|
||||
if (rc != MDBX_SUCCESS) { \
|
||||
printf("Error [%d] %s in %s at %s:%d\n", rc, mdbx_strerror(rc), #x, __FILE__, __LINE__); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static void db_connect() {
|
||||
@@ -105,13 +103,10 @@ static void db_connect() {
|
||||
MDBX_dbi dbi_ip;
|
||||
|
||||
MDBX_CHECK(mdbx_env_create(&env));
|
||||
MDBX_CHECK(mdbx_env_set_geometry(
|
||||
env, 0, 0, REC_COUNT * sizeof(session_data_t) * 10, -1, -1, -1));
|
||||
MDBX_CHECK(mdbx_env_set_geometry(env, 0, 0, REC_COUNT * sizeof(session_data_t) * 10, -1, -1, -1));
|
||||
MDBX_CHECK(mdbx_env_set_maxdbs(env, 30));
|
||||
MDBX_CHECK(mdbx_env_open(env, opt_db_path,
|
||||
MDBX_CREATE | MDBX_WRITEMAP | MDBX_UTTERLY_NOSYNC |
|
||||
MDBX_LIFORECLAIM,
|
||||
0664));
|
||||
MDBX_CHECK(
|
||||
mdbx_env_open(env, opt_db_path, MDBX_CREATE | MDBX_WRITEMAP | MDBX_UTTERLY_NOSYNC | MDBX_LIFORECLAIM, 0664));
|
||||
MDBX_txn *txn;
|
||||
|
||||
// transaction init
|
||||
@@ -135,16 +130,11 @@ static void create_record(uint64_t record_id) {
|
||||
MDBX_txn *txn;
|
||||
session_data_t data;
|
||||
// transaction init
|
||||
snprintf(data.session_id1, sizeof(data.session_id1),
|
||||
"prefix%02u_%02u.fill.fill.fill.fill.fill.fill;%" PRIu64,
|
||||
(unsigned)(record_id % 3) + 1, (unsigned)(record_id % 9) + 1,
|
||||
record_id);
|
||||
snprintf(data.session_id2, sizeof(data.session_id2),
|
||||
"dprefix%" PRIu64 ";%" PRIu64 ".fill.fill.;suffix", record_id,
|
||||
(record_id + UINT64_C(1442695040888963407)) %
|
||||
UINT64_C(6364136223846793005));
|
||||
snprintf(data.ip, sizeof(data.ip), "%d.%d.%d.%d",
|
||||
IP_PRINTF_ARG_HOST(record_id & 0xFFFFFFFF));
|
||||
snprintf(data.session_id1, sizeof(data.session_id1), "prefix%02u_%02u.fill.fill.fill.fill.fill.fill;%" PRIu64,
|
||||
(unsigned)(record_id % 3) + 1, (unsigned)(record_id % 9) + 1, record_id);
|
||||
snprintf(data.session_id2, sizeof(data.session_id2), "dprefix%" PRIu64 ";%" PRIu64 ".fill.fill.;suffix", record_id,
|
||||
(record_id + UINT64_C(1442695040888963407)) % UINT64_C(6364136223846793005));
|
||||
snprintf(data.ip, sizeof(data.ip), "%d.%d.%d.%d", IP_PRINTF_ARG_HOST(record_id & 0xFFFFFFFF));
|
||||
event.obj_id = record_id;
|
||||
event.event_type = 1;
|
||||
|
||||
@@ -152,8 +142,7 @@ static void create_record(uint64_t record_id) {
|
||||
MDBX_val _session_id2_rec = {data.session_id2, strlen(data.session_id2)};
|
||||
MDBX_val _ip_rec = {data.ip, strlen(data.ip)};
|
||||
MDBX_val _obj_id_rec = {&record_id, sizeof(record_id)};
|
||||
MDBX_val _data_rec = {&data, offsetof(session_data_t, fill) +
|
||||
(rand() % sizeof(data.fill))};
|
||||
MDBX_val _data_rec = {&data, offsetof(session_data_t, fill) + (rand() % sizeof(data.fill))};
|
||||
MDBX_val _event_rec = {&event, sizeof(event)};
|
||||
|
||||
uint64_t start = getClockUs();
|
||||
@@ -162,20 +151,16 @@ static void create_record(uint64_t record_id) {
|
||||
MDBX_CHECK(mdbx_dbi_open(txn, "session_id", MDBX_CREATE, &dbi_session_id));
|
||||
MDBX_CHECK(mdbx_dbi_open(txn, "event", MDBX_CREATE, &dbi_event));
|
||||
MDBX_CHECK(mdbx_dbi_open(txn, "ip", MDBX_CREATE, &dbi_ip));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session, &_obj_id_rec, &_data_rec,
|
||||
MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session_id, &_session_id1_rec, &_obj_id_rec,
|
||||
MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session_id, &_session_id2_rec, &_obj_id_rec,
|
||||
MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session, &_obj_id_rec, &_data_rec, MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session_id, &_session_id1_rec, &_obj_id_rec, MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_session_id, &_session_id2_rec, &_obj_id_rec, MDBX_NOOVERWRITE | MDBX_NODUPDATA));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_ip, &_ip_rec, &_obj_id_rec, 0));
|
||||
MDBX_CHECK(mdbx_put(txn, dbi_event, &_event_rec, &_obj_id_rec, 0));
|
||||
MDBX_CHECK(mdbx_txn_commit(txn));
|
||||
|
||||
mdbx_data_size += (_data_rec.iov_len + _obj_id_rec.iov_len * 4);
|
||||
mdbx_key_size +=
|
||||
(_obj_id_rec.iov_len + _session_id1_rec.iov_len +
|
||||
_session_id2_rec.iov_len + _ip_rec.iov_len + _event_rec.iov_len);
|
||||
mdbx_key_size += (_obj_id_rec.iov_len + _session_id1_rec.iov_len + _session_id2_rec.iov_len + _ip_rec.iov_len +
|
||||
_event_rec.iov_len);
|
||||
|
||||
// transaction commit
|
||||
mdbx_add_count++;
|
||||
@@ -218,9 +203,8 @@ static void delete_record(int64_t record_id) {
|
||||
MDBX_CHECK(mdbx_del(txn, dbi_session, &_obj_id_rec, NULL));
|
||||
|
||||
mdbx_data_size -= (_data_rec.iov_len + _obj_id_rec.iov_len * 4);
|
||||
mdbx_key_size -=
|
||||
(_obj_id_rec.iov_len + _session_id1_rec.iov_len +
|
||||
_session_id2_rec.iov_len + _ip_rec.iov_len + _event_rec.iov_len);
|
||||
mdbx_key_size -= (_obj_id_rec.iov_len + _session_id1_rec.iov_len + _session_id2_rec.iov_len + _ip_rec.iov_len +
|
||||
_event_rec.iov_len);
|
||||
|
||||
// transaction commit
|
||||
MDBX_CHECK(mdbx_txn_commit(txn));
|
||||
@@ -233,8 +217,7 @@ static void db_disconnect() {
|
||||
printf("Connection closed\n");
|
||||
}
|
||||
|
||||
static void get_db_stat(const char *db, int64_t *ms_branch_pages,
|
||||
int64_t *ms_leaf_pages) {
|
||||
static void get_db_stat(const char *db, int64_t *ms_branch_pages, int64_t *ms_leaf_pages) {
|
||||
MDBX_txn *txn;
|
||||
MDBX_stat stat;
|
||||
MDBX_dbi dbi;
|
||||
@@ -243,10 +226,8 @@ static void get_db_stat(const char *db, int64_t *ms_branch_pages,
|
||||
MDBX_CHECK(mdbx_dbi_open(txn, db, MDBX_CREATE, &dbi));
|
||||
MDBX_CHECK(mdbx_dbi_stat(txn, dbi, &stat, sizeof(stat)));
|
||||
mdbx_txn_abort(txn);
|
||||
printf("%15s | %15" PRIu64 " | %5u | %10" PRIu64 " | %10" PRIu64
|
||||
" | %11" PRIu64 " |\n",
|
||||
db, stat.ms_branch_pages, stat.ms_depth, stat.ms_entries,
|
||||
stat.ms_leaf_pages, stat.ms_overflow_pages);
|
||||
printf("%15s | %15" PRIu64 " | %5u | %10" PRIu64 " | %10" PRIu64 " | %11" PRIu64 " |\n", db, stat.ms_branch_pages,
|
||||
stat.ms_depth, stat.ms_entries, stat.ms_leaf_pages, stat.ms_overflow_pages);
|
||||
(*ms_branch_pages) += stat.ms_branch_pages;
|
||||
(*ms_leaf_pages) += stat.ms_leaf_pages;
|
||||
}
|
||||
@@ -261,25 +242,20 @@ static void periodic_stat(void) {
|
||||
printf("Environment Info\n");
|
||||
printf(" Pagesize: %u\n", mst.ms_psize);
|
||||
if (mei.mi_geo.lower != mei.mi_geo.upper) {
|
||||
printf(" Dynamic datafile: %" PRIu64 "..%" PRIu64 " bytes (+%" PRIu64
|
||||
"/-%" PRIu64 "), %" PRIu64 "..%" PRIu64 " pages (+%" PRIu64
|
||||
"/-%" PRIu64 ")\n",
|
||||
mei.mi_geo.lower, mei.mi_geo.upper, mei.mi_geo.grow,
|
||||
mei.mi_geo.shrink, mei.mi_geo.lower / mst.ms_psize,
|
||||
mei.mi_geo.upper / mst.ms_psize, mei.mi_geo.grow / mst.ms_psize,
|
||||
mei.mi_geo.shrink / mst.ms_psize);
|
||||
printf(" Current datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||
mei.mi_geo.current, mei.mi_geo.current / mst.ms_psize);
|
||||
printf(" Dynamic datafile: %" PRIu64 "..%" PRIu64 " bytes (+%" PRIu64 "/-%" PRIu64 "), %" PRIu64 "..%" PRIu64
|
||||
" pages (+%" PRIu64 "/-%" PRIu64 ")\n",
|
||||
mei.mi_geo.lower, mei.mi_geo.upper, mei.mi_geo.grow, mei.mi_geo.shrink, mei.mi_geo.lower / mst.ms_psize,
|
||||
mei.mi_geo.upper / mst.ms_psize, mei.mi_geo.grow / mst.ms_psize, mei.mi_geo.shrink / mst.ms_psize);
|
||||
printf(" Current datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n", mei.mi_geo.current,
|
||||
mei.mi_geo.current / mst.ms_psize);
|
||||
} else {
|
||||
printf(" Fixed datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||
mei.mi_geo.current, mei.mi_geo.current / mst.ms_psize);
|
||||
printf(" Fixed datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n", mei.mi_geo.current,
|
||||
mei.mi_geo.current / mst.ms_psize);
|
||||
}
|
||||
printf(" Current mapsize: %" PRIu64 " bytes, %" PRIu64 " pages \n",
|
||||
mei.mi_mapsize, mei.mi_mapsize / mst.ms_psize);
|
||||
printf(" Current mapsize: %" PRIu64 " bytes, %" PRIu64 " pages \n", mei.mi_mapsize, mei.mi_mapsize / mst.ms_psize);
|
||||
printf(" Number of pages used: %" PRIu64 "\n", mei.mi_last_pgno + 1);
|
||||
printf(" Last transaction ID: %" PRIu64 "\n", mei.mi_recent_txnid);
|
||||
printf(" Tail transaction ID: %" PRIu64 " (%" PRIi64 ")\n",
|
||||
mei.mi_latter_reader_txnid,
|
||||
printf(" Tail transaction ID: %" PRIu64 " (%" PRIi64 ")\n", mei.mi_latter_reader_txnid,
|
||||
mei.mi_latter_reader_txnid - mei.mi_recent_txnid);
|
||||
printf(" Max readers: %u\n", mei.mi_maxreaders);
|
||||
printf(" Number of readers used: %u\n", mei.mi_numreaders);
|
||||
@@ -290,8 +266,8 @@ static void periodic_stat(void) {
|
||||
get_db_stat("session_id", &ms_branch_pages, &ms_leaf_pages);
|
||||
get_db_stat("event", &ms_branch_pages, &ms_leaf_pages);
|
||||
get_db_stat("ip", &ms_branch_pages, &ms_leaf_pages);
|
||||
printf("%15s | %15" PRIu64 " | %5s | %10s | %10" PRIu64 " | %11s |\n", "",
|
||||
ms_branch_pages, "", "", ms_leaf_pages, "");
|
||||
printf("%15s | %15" PRIu64 " | %5s | %10s | %10" PRIu64 " | %11s |\n", "", ms_branch_pages, "", "", ms_leaf_pages,
|
||||
"");
|
||||
|
||||
static int64_t prev_add_count;
|
||||
static int64_t prev_del_count;
|
||||
@@ -300,32 +276,23 @@ static void periodic_stat(void) {
|
||||
static int64_t t = -1;
|
||||
if (t > 0) {
|
||||
int64_t delta = (getClockUs() - t);
|
||||
printf("CPS: add %" PRIu64 ", delete %" PRIu64
|
||||
", items processed - %" PRIu64 "K data=%" PRIu64 "K key=%" PRIu64
|
||||
printf("CPS: add %" PRIu64 ", delete %" PRIu64 ", items processed - %" PRIu64 "K data=%" PRIu64 "K key=%" PRIu64
|
||||
"K\n",
|
||||
(mdbx_add_count - prev_add_count) * 1000000 / delta,
|
||||
(mdbx_del_count - prev_del_count) * 1000000 / delta, obj_id / 1024,
|
||||
mdbx_data_size / 1024, mdbx_key_size / 1024);
|
||||
(mdbx_add_count - prev_add_count) * 1000000 / delta, (mdbx_del_count - prev_del_count) * 1000000 / delta,
|
||||
obj_id / 1024, mdbx_data_size / 1024, mdbx_key_size / 1024);
|
||||
printf("usage data=%" PRIu64 "%%",
|
||||
((mdbx_data_size + mdbx_key_size) * 100) /
|
||||
((ms_leaf_pages + ms_branch_pages) * 4096));
|
||||
((mdbx_data_size + mdbx_key_size) * 100) / ((ms_leaf_pages + ms_branch_pages) * 4096));
|
||||
if (prev_add_time != mdbx_add_time) {
|
||||
printf(" Add : %" PRIu64 " c/s", (mdbx_add_count - prev_add_count) *
|
||||
1000000 /
|
||||
(mdbx_add_time - prev_add_time));
|
||||
printf(" Add : %" PRIu64 " c/s", (mdbx_add_count - prev_add_count) * 1000000 / (mdbx_add_time - prev_add_time));
|
||||
}
|
||||
if (prev_del_time != mdbx_del_time) {
|
||||
printf(" Del : %" PRIu64 " c/s", (mdbx_del_count - prev_del_count) *
|
||||
1000000 /
|
||||
(mdbx_del_time - prev_del_time));
|
||||
printf(" Del : %" PRIu64 " c/s", (mdbx_del_count - prev_del_count) * 1000000 / (mdbx_del_time - prev_del_time));
|
||||
}
|
||||
if (mdbx_add_time) {
|
||||
printf(" tAdd : %" PRIu64 " c/s",
|
||||
mdbx_add_count * 1000000 / mdbx_add_time);
|
||||
printf(" tAdd : %" PRIu64 " c/s", mdbx_add_count * 1000000 / mdbx_add_time);
|
||||
}
|
||||
if (mdbx_del_time) {
|
||||
printf(" tDel : %" PRIu64 " c/s",
|
||||
mdbx_del_count * 1000000 / mdbx_del_time);
|
||||
printf(" tDel : %" PRIu64 " c/s", mdbx_del_count * 1000000 / mdbx_del_time);
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
|
@@ -5,7 +5,6 @@
|
||||
int main(int argc, const char *argv[]) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
std::cout
|
||||
<< "OK (but this is do-nothing test just for a check for compilation)\n";
|
||||
std::cout << "OK (but this is do-nothing test just for a check for compilation)\n";
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@@ -17,8 +17,8 @@ static int dump(MDBX_cursor *cur) {
|
||||
int rc = mdbx_cursor_get(cur, &key, &data, MDBX_FIRST);
|
||||
|
||||
while (rc == 0) {
|
||||
printf("(%.*s) = (%.*s)\n", (int)key.iov_len, (const char *)key.iov_base,
|
||||
(int)data.iov_len, (const char *)data.iov_base);
|
||||
printf("(%.*s) = (%.*s)\n", (int)key.iov_len, (const char *)key.iov_base, (int)data.iov_len,
|
||||
(const char *)data.iov_base);
|
||||
rc = mdbx_cursor_get(cur, &key, &data, MDBX_NEXT);
|
||||
}
|
||||
return rc;
|
||||
@@ -38,8 +38,7 @@ static int clear(MDBX_cursor *cur) {
|
||||
return (rc == MDBX_NOTFOUND) ? 0 : rc;
|
||||
}
|
||||
|
||||
static int put(MDBX_txn *txn, MDBX_dbi dbi, const char *k, const char *v,
|
||||
MDBX_put_flags_t flags) {
|
||||
static int put(MDBX_txn *txn, MDBX_dbi dbi, const char *k, const char *v, MDBX_put_flags_t flags) {
|
||||
MDBX_val key = {.iov_base = (void *)k, .iov_len = strlen(k)};
|
||||
MDBX_val data = {.iov_base = (void *)v, .iov_len = strlen(v)};
|
||||
return mdbx_put(txn, dbi, &key, &data, flags);
|
||||
@@ -79,21 +78,21 @@ int main(int argc, const char *argv[]) {
|
||||
goto Fail;
|
||||
}
|
||||
|
||||
#define DUMP() \
|
||||
do { \
|
||||
if ((rc = dump(cur)) && rc != MDBX_NOTFOUND) { \
|
||||
errmsg = "failed to mdbx_cursor_get(FIRST): %s\n"; \
|
||||
goto Fail; \
|
||||
} \
|
||||
puts(""); \
|
||||
#define DUMP() \
|
||||
do { \
|
||||
if ((rc = dump(cur)) && rc != MDBX_NOTFOUND) { \
|
||||
errmsg = "failed to mdbx_cursor_get(FIRST): %s\n"; \
|
||||
goto Fail; \
|
||||
} \
|
||||
puts(""); \
|
||||
} while (0)
|
||||
|
||||
#define PUTVAL(k, v, flags) \
|
||||
do { \
|
||||
if ((rc = put(txn, dbi, k, v, flags))) { \
|
||||
errmsg = "failed to mdbx_put: %s\n"; \
|
||||
goto Fail; \
|
||||
} \
|
||||
#define PUTVAL(k, v, flags) \
|
||||
do { \
|
||||
if ((rc = put(txn, dbi, k, v, flags))) { \
|
||||
errmsg = "failed to mdbx_put: %s\n"; \
|
||||
goto Fail; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
puts("TEST WITH MULTIPLE KEYS ====================");
|
||||
|
Reference in New Issue
Block a user