mdbxmou 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/async/envmou_keys.cpp +4 -4
- package/src/async/envmou_query.cpp +1 -1
- package/src/cursormou.cpp +5 -5
- package/src/dbi.cpp +2 -2
- package/src/dbi.hpp +1 -1
- package/src/dbimou.cpp +25 -20
- package/src/querymou.cpp +1 -1
- package/src/txnmou.cpp +89 -22
- package/src/txnmou.hpp +4 -1
- package/src/typemou.hpp +2 -2
package/package.json
CHANGED
|
@@ -30,7 +30,7 @@ static Napi::Value write_row(Napi::Env env, const keys_line& row)
|
|
|
30
30
|
for (std::uint32_t j = 0; j < param.size(); ++j) {
|
|
31
31
|
const auto& item = param[j];
|
|
32
32
|
Napi::Value key_value;
|
|
33
|
-
if (key_mode
|
|
33
|
+
if (mdbx::is_ordinal(key_mode)) {
|
|
34
34
|
if (key_flag.val & base_flag::number) {
|
|
35
35
|
key_value = Napi::Number::New(env, static_cast<double>(item.id_buf));
|
|
36
36
|
} else {
|
|
@@ -105,9 +105,9 @@ void async_keys::do_keys_batch(txnmou_managed& txn,
|
|
|
105
105
|
mdbx::map_handle dbi, keys_line& arg0)
|
|
106
106
|
{
|
|
107
107
|
auto& item = arg0.item;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
auto cursor = dbi::
|
|
108
|
+
auto is_ordinal = mdbx::is_ordinal(arg0.key_mod);
|
|
109
|
+
|
|
110
|
+
auto cursor = dbi::open_cursor(txn, dbi);
|
|
111
111
|
|
|
112
112
|
// Буфер для batch - MDBXMOU_BATCH_LIMIT/2 пар (key, value)
|
|
113
113
|
#ifndef MDBXMOU_BATCH_LIMIT
|
|
@@ -39,7 +39,7 @@ static Napi::Value write_row(Napi::Env env, const query_line& row)
|
|
|
39
39
|
const auto& item = param[j];
|
|
40
40
|
Napi::Value key_value;
|
|
41
41
|
Napi::Object js_item = Napi::Object::New(env);
|
|
42
|
-
if (key_mode
|
|
42
|
+
if (mdbx::is_ordinal(key_mode)) {
|
|
43
43
|
if (key_flag.val & base_flag::number) {
|
|
44
44
|
key_value = Napi::Number::New(env, static_cast<double>(item.id_buf));
|
|
45
45
|
} else {
|
package/src/cursormou.cpp
CHANGED
|
@@ -80,7 +80,7 @@ namespace mdbxmou
|
|
|
80
80
|
auto value_flag = dbi_->get_value_flag();
|
|
81
81
|
|
|
82
82
|
// Ключ
|
|
83
|
-
if (key_mode
|
|
83
|
+
if (mdbx::is_ordinal(key_mode)) {
|
|
84
84
|
if (key_flag.val & base_flag::bigint) {
|
|
85
85
|
result.Set("key", key.to_bigint(env));
|
|
86
86
|
} else {
|
|
@@ -210,7 +210,7 @@ namespace mdbxmou
|
|
|
210
210
|
|
|
211
211
|
auto key_mode = dbi_->get_key_mode();
|
|
212
212
|
|
|
213
|
-
keymou key = (key_mode
|
|
213
|
+
keymou key = (mdbx::is_ordinal(key_mode)) ?
|
|
214
214
|
keymou::from(info[0], env, key_num_) :
|
|
215
215
|
keymou::from(info[0], env, key_buf_);
|
|
216
216
|
|
|
@@ -231,7 +231,7 @@ namespace mdbxmou
|
|
|
231
231
|
auto value_flag = dbi_->get_value_flag();
|
|
232
232
|
|
|
233
233
|
// Ключ
|
|
234
|
-
if (key_mode
|
|
234
|
+
if (mdbx::is_ordinal(key_mode)) {
|
|
235
235
|
if (key_flag.val & base_flag::bigint) {
|
|
236
236
|
result.Set("key", key.to_bigint(env));
|
|
237
237
|
} else {
|
|
@@ -275,7 +275,7 @@ namespace mdbxmou
|
|
|
275
275
|
|
|
276
276
|
auto key_mode = dbi_->get_key_mode();
|
|
277
277
|
|
|
278
|
-
keymou key = (key_mode
|
|
278
|
+
keymou key = (mdbx::is_ordinal(key_mode)) ?
|
|
279
279
|
keymou::from(info[0], env, key_num_) :
|
|
280
280
|
keymou::from(info[0], env, key_buf_);
|
|
281
281
|
|
|
@@ -354,7 +354,7 @@ namespace mdbxmou
|
|
|
354
354
|
auto result = Napi::Object::New(env);
|
|
355
355
|
|
|
356
356
|
// Ключ
|
|
357
|
-
if (key_mode
|
|
357
|
+
if (mdbx::is_ordinal(key_mode)) {
|
|
358
358
|
if (key_flag.val & base_flag::bigint) {
|
|
359
359
|
result.Set("key", key.to_bigint(env));
|
|
360
360
|
} else {
|
package/src/dbi.cpp
CHANGED
|
@@ -47,10 +47,10 @@ bool dbi::del(MDBX_txn* txn, const keymou& key)
|
|
|
47
47
|
|
|
48
48
|
cursormou_managed dbi::open_cursor(MDBX_txn* txn) const
|
|
49
49
|
{
|
|
50
|
-
return
|
|
50
|
+
return open_cursor(txn, mdbx::map_handle{id_});
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
cursormou_managed dbi::
|
|
53
|
+
cursormou_managed dbi::open_cursor(MDBX_txn *txn, mdbx::map_handle dbi)
|
|
54
54
|
{
|
|
55
55
|
MDBX_cursor* cursor_ptr;
|
|
56
56
|
auto rc = mdbx_cursor_open(txn, dbi.dbi, &cursor_ptr);
|
package/src/dbi.hpp
CHANGED
|
@@ -39,7 +39,7 @@ public:
|
|
|
39
39
|
cursormou_managed open_cursor(MDBX_txn* txn) const;
|
|
40
40
|
|
|
41
41
|
// Static version for map_handle
|
|
42
|
-
static cursormou_managed
|
|
42
|
+
static cursormou_managed open_cursor(MDBX_txn *txn, mdbx::map_handle dbi);
|
|
43
43
|
|
|
44
44
|
// Drop database or delete it
|
|
45
45
|
void drop(MDBX_txn* txn, bool delete_db = false);
|
package/src/dbimou.cpp
CHANGED
|
@@ -48,7 +48,7 @@ Napi::Value dbimou::put(const Napi::CallbackInfo& info)
|
|
|
48
48
|
auto txn = Napi::ObjectWrap<txnmou>::Unwrap(arg0);
|
|
49
49
|
try {
|
|
50
50
|
std::uint64_t t;
|
|
51
|
-
auto key = (key_mode_
|
|
51
|
+
auto key = mdbx::is_ordinal(key_mode_) ?
|
|
52
52
|
keymou::from(info[1], env, t) :
|
|
53
53
|
keymou::from(info[1], env, key_buf_);
|
|
54
54
|
|
|
@@ -77,7 +77,7 @@ Napi::Value dbimou::get(const Napi::CallbackInfo& info)
|
|
|
77
77
|
|
|
78
78
|
try {
|
|
79
79
|
std::uint64_t t;
|
|
80
|
-
auto key = (key_mode_
|
|
80
|
+
auto key = mdbx::is_ordinal(key_mode_) ?
|
|
81
81
|
keymou::from(info[1], env, t) :
|
|
82
82
|
keymou::from(info[1], env, key_buf_);
|
|
83
83
|
|
|
@@ -111,7 +111,7 @@ Napi::Value dbimou::del(const Napi::CallbackInfo& info)
|
|
|
111
111
|
|
|
112
112
|
try {
|
|
113
113
|
std::uint64_t t;
|
|
114
|
-
auto key = (key_mode_
|
|
114
|
+
auto key = mdbx::is_ordinal(key_mode_) ?
|
|
115
115
|
keymou::from(info[1], env, t) :
|
|
116
116
|
keymou::from(info[1], env, key_buf_);
|
|
117
117
|
|
|
@@ -140,7 +140,7 @@ Napi::Value dbimou::has(const Napi::CallbackInfo& info)
|
|
|
140
140
|
|
|
141
141
|
try {
|
|
142
142
|
std::uint64_t t;
|
|
143
|
-
auto key = (key_mode_
|
|
143
|
+
auto key = mdbx::is_ordinal(key_mode_) ?
|
|
144
144
|
keymou::from(info[1], env, t) :
|
|
145
145
|
keymou::from(info[1], env, key_buf_);
|
|
146
146
|
|
|
@@ -173,16 +173,16 @@ Napi::Value dbimou::for_each(const Napi::CallbackInfo& info)
|
|
|
173
173
|
auto fn = info[1].As<Napi::Function>();
|
|
174
174
|
|
|
175
175
|
try {
|
|
176
|
-
auto
|
|
177
|
-
auto stat = dbi::get_stat(*txn);
|
|
176
|
+
auto stat = get_stat(*txn);
|
|
178
177
|
|
|
179
178
|
// Проверяем, есть ли записи в базе данных
|
|
180
179
|
if (stat.ms_entries == 0) {
|
|
181
180
|
return Napi::Number::New(env, 0);
|
|
182
181
|
}
|
|
183
|
-
|
|
182
|
+
|
|
183
|
+
auto cursor = open_cursor(*txn);
|
|
184
184
|
uint32_t index{};
|
|
185
|
-
if (key_mode_
|
|
185
|
+
if (mdbx::is_ordinal(key_mode_)) {
|
|
186
186
|
cursor.scan([&](const mdbx::pair& f) {
|
|
187
187
|
keymou key{f.key};
|
|
188
188
|
valuemou val{f.value};
|
|
@@ -238,7 +238,8 @@ Napi::Value dbimou::for_each(const Napi::CallbackInfo& info)
|
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
Napi::Value dbimou::for_each_from(const Napi::CallbackInfo& info)
|
|
241
|
+
Napi::Value dbimou::for_each_from(const Napi::CallbackInfo& info)
|
|
242
|
+
{
|
|
242
243
|
Napi::Env env = info.Env();
|
|
243
244
|
auto arg_len = info.Length();
|
|
244
245
|
|
|
@@ -274,7 +275,7 @@ Napi::Value dbimou::for_each_from(const Napi::CallbackInfo& info) {
|
|
|
274
275
|
|
|
275
276
|
// Парсим начальный ключ
|
|
276
277
|
std::uint64_t t;
|
|
277
|
-
keymou from_key = (key_mode_
|
|
278
|
+
keymou from_key = (mdbx::is_ordinal(key_mode_)) ?
|
|
278
279
|
keymou::from(info[1], env, t) :
|
|
279
280
|
keymou::from(info[1], env, key_buf_);
|
|
280
281
|
|
|
@@ -308,7 +309,7 @@ Napi::Value dbimou::for_each_from(const Napi::CallbackInfo& info) {
|
|
|
308
309
|
std::size_t index{};
|
|
309
310
|
bool is_key_equal_mode = (cursor_mode == move_operation::key_equal ||
|
|
310
311
|
cursor_mode == move_operation::multi_exactkey_value_equal);
|
|
311
|
-
if (key_mode_
|
|
312
|
+
if (mdbx::is_ordinal(key_mode_)) {
|
|
312
313
|
cursor.scan_from([&](const mdbx::pair& f) {
|
|
313
314
|
keymou key{f.key};
|
|
314
315
|
valuemou val{f.value};
|
|
@@ -367,7 +368,8 @@ Napi::Value dbimou::for_each_from(const Napi::CallbackInfo& info) {
|
|
|
367
368
|
}
|
|
368
369
|
}
|
|
369
370
|
|
|
370
|
-
Napi::Value dbimou::stat(const Napi::CallbackInfo& info)
|
|
371
|
+
Napi::Value dbimou::stat(const Napi::CallbackInfo& info)
|
|
372
|
+
{
|
|
371
373
|
Napi::Env env = info.Env();
|
|
372
374
|
auto arg_len = info.Length();
|
|
373
375
|
if (arg_len < 1) {
|
|
@@ -405,7 +407,8 @@ Napi::Value dbimou::stat(const Napi::CallbackInfo& info) {
|
|
|
405
407
|
return env.Undefined();
|
|
406
408
|
}
|
|
407
409
|
|
|
408
|
-
Napi::Value dbimou::keys(const Napi::CallbackInfo& info)
|
|
410
|
+
Napi::Value dbimou::keys(const Napi::CallbackInfo& info)
|
|
411
|
+
{
|
|
409
412
|
Napi::Env env = info.Env();
|
|
410
413
|
auto arg_len = info.Length();
|
|
411
414
|
if (arg_len < 1) {
|
|
@@ -437,9 +440,9 @@ Napi::Value dbimou::keys(const Napi::CallbackInfo& info) {
|
|
|
437
440
|
std::array<mdbx::slice, MDBXMOU_BATCH_LIMIT> pairs;
|
|
438
441
|
|
|
439
442
|
uint32_t index{};
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
+
auto is_ordinal = mdbx::is_ordinal(key_mode_);
|
|
444
|
+
auto is_bigint = key_flag_.val & base_flag::bigint;
|
|
445
|
+
auto is_string = key_flag_.val & base_flag::string;
|
|
443
446
|
|
|
444
447
|
// Первый вызов с MDBX_FIRST
|
|
445
448
|
size_t count = cursor.get_batch(pairs, MDBX_FIRST);
|
|
@@ -469,7 +472,8 @@ Napi::Value dbimou::keys(const Napi::CallbackInfo& info) {
|
|
|
469
472
|
return env.Undefined();
|
|
470
473
|
}
|
|
471
474
|
|
|
472
|
-
Napi::Value dbimou::keys_from(const Napi::CallbackInfo& info)
|
|
475
|
+
Napi::Value dbimou::keys_from(const Napi::CallbackInfo& info)
|
|
476
|
+
{
|
|
473
477
|
Napi::Env env = info.Env();
|
|
474
478
|
auto arg_len = info.Length();
|
|
475
479
|
if (arg_len < 2) {
|
|
@@ -487,7 +491,7 @@ Napi::Value dbimou::keys_from(const Napi::CallbackInfo& info) {
|
|
|
487
491
|
|
|
488
492
|
// Парсим аргументы: txn, from, limit, cursorMode
|
|
489
493
|
std::uint64_t t;
|
|
490
|
-
keymou from_key = (key_mode_
|
|
494
|
+
keymou from_key = (mdbx::is_ordinal(key_mode_)) ?
|
|
491
495
|
keymou::from(info[1], env, t) :
|
|
492
496
|
keymou::from(info[1], env, key_buf_);
|
|
493
497
|
|
|
@@ -528,7 +532,7 @@ Napi::Value dbimou::keys_from(const Napi::CallbackInfo& info) {
|
|
|
528
532
|
bool is_key_equal_mode = (cursor_mode == move_operation::key_equal ||
|
|
529
533
|
cursor_mode == move_operation::multi_exactkey_value_equal);
|
|
530
534
|
|
|
531
|
-
if (key_mode_
|
|
535
|
+
if (mdbx::is_ordinal(key_mode_)) {
|
|
532
536
|
cursor.scan_from([&](const mdbx::pair& f) {
|
|
533
537
|
if (index >= count) {
|
|
534
538
|
return true; // останавливаем сканирование
|
|
@@ -580,7 +584,8 @@ Napi::Value dbimou::keys_from(const Napi::CallbackInfo& info) {
|
|
|
580
584
|
return env.Undefined();
|
|
581
585
|
}
|
|
582
586
|
|
|
583
|
-
Napi::Value dbimou::drop(const Napi::CallbackInfo& info)
|
|
587
|
+
Napi::Value dbimou::drop(const Napi::CallbackInfo& info)
|
|
588
|
+
{
|
|
584
589
|
Napi::Env env = info.Env();
|
|
585
590
|
if (info.Length() < 1) {
|
|
586
591
|
throw Napi::TypeError::New(env, "First argument must be a transaction");
|
package/src/querymou.cpp
CHANGED
|
@@ -27,7 +27,7 @@ void async_key::parse(const async_common& common, const Napi::Value& item)
|
|
|
27
27
|
auto key_flag = common.key_flag;
|
|
28
28
|
|
|
29
29
|
keymou key{};
|
|
30
|
-
if (common.key_mod
|
|
30
|
+
if (mdbx::is_ordinal(common.key_mod)) {
|
|
31
31
|
if (item.IsBigInt()) {
|
|
32
32
|
key = keymou{item.As<Napi::BigInt>(), id_buf};
|
|
33
33
|
} else if (item.IsNumber()) {
|
package/src/txnmou.cpp
CHANGED
|
@@ -70,21 +70,102 @@ void txnmou::dec_counter() noexcept
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
Napi::Value txnmou::get_dbi(const
|
|
73
|
+
Napi::Value txnmou::get_dbi(const char* name, base_flag key_flag,
|
|
74
|
+
base_flag value_flag, key_mode key_mode, value_mode value_mode,
|
|
75
|
+
db_mode db_mode)
|
|
74
76
|
{
|
|
75
|
-
Napi::Env env =
|
|
77
|
+
Napi::Env env = Env();
|
|
76
78
|
|
|
77
79
|
if ((mode_.val & txn_mode::ro) && (db_mode.val & db_mode::create)) {
|
|
78
80
|
throw Napi::Error::New(env, "dbi: cannot open DB in read-only transaction");
|
|
79
81
|
}
|
|
80
82
|
|
|
83
|
+
if (!txn_) {
|
|
84
|
+
throw Napi::Error::New(env, "txn already completed");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
MDBX_dbi dbi{};
|
|
88
|
+
auto flags = static_cast<MDBX_db_flags_t>(db_mode.val|key_mode.val|value_mode.val);
|
|
89
|
+
auto rc = mdbx_dbi_open(*this, (name && name[0]) ? name : nullptr, flags, &dbi);
|
|
90
|
+
if (rc != MDBX_SUCCESS) {
|
|
91
|
+
throw Napi::Error::New(env, std::string("mdbx_dbi_open: ") + mdbx_strerror(rc));
|
|
92
|
+
}
|
|
93
|
+
// создаем новый объект dbi
|
|
94
|
+
auto obj = dbimou::ctor.New({});
|
|
95
|
+
auto ptr = dbimou::Unwrap(obj);
|
|
96
|
+
ptr->attach(dbi, db_mode, key_mode,
|
|
97
|
+
value_mode, key_flag, value_flag);
|
|
98
|
+
return obj;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Napi::Value txnmou::get_dbi(const Napi::Object& arg0, db_mode db_mode)
|
|
102
|
+
{
|
|
103
|
+
auto env = arg0.Env();
|
|
104
|
+
auto conf = get_env_userctx(*env_);
|
|
105
|
+
auto key_flag = conf->key_flag;
|
|
106
|
+
auto value_flag = conf->value_flag;
|
|
81
107
|
key_mode key_mode{};
|
|
82
108
|
value_mode value_mode{};
|
|
83
109
|
std::string db_name{};
|
|
110
|
+
|
|
111
|
+
if (arg0.Has("name")) {
|
|
112
|
+
auto value = arg0.Get("name");
|
|
113
|
+
if (!value.IsUndefined() && !value.IsNull()) {
|
|
114
|
+
if (!value.IsString()) {
|
|
115
|
+
throw Napi::Error::New(env, "dbi: name must be string");
|
|
116
|
+
}
|
|
117
|
+
db_name = value.As<Napi::String>().Utf8Value();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (arg0.Has("keyFlag")) {
|
|
122
|
+
auto value = arg0.Get("keyFlag");
|
|
123
|
+
if (!value.IsUndefined() && !value.IsNull()) {
|
|
124
|
+
key_flag = base_flag::parse_key(value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (arg0.Has("valueFlag")) {
|
|
129
|
+
auto value = arg0.Get("valueFlag");
|
|
130
|
+
if (!value.IsUndefined() && !value.IsNull()) {
|
|
131
|
+
value_flag = base_flag::parse_value(value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (arg0.Has("keyMode")) {
|
|
136
|
+
auto value = arg0.Get("keyMode");
|
|
137
|
+
if (!value.IsUndefined() && !value.IsNull()) {
|
|
138
|
+
key_mode = parse_key_mode(env, value, key_flag);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (arg0.Has("valueMode")) {
|
|
143
|
+
auto value = arg0.Get("valueMode");
|
|
144
|
+
if (!value.IsUndefined() && !value.IsNull()) {
|
|
145
|
+
value_mode = value_mode::parse(value);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return get_dbi(db_name.empty() ? nullptr : db_name.c_str(),
|
|
150
|
+
key_flag, value_flag, key_mode, value_mode, db_mode);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
Napi::Value txnmou::get_dbi(const Napi::CallbackInfo& info, db_mode db_mode)
|
|
154
|
+
{
|
|
155
|
+
Napi::Env env = info.Env();
|
|
156
|
+
|
|
84
157
|
auto conf = get_env_userctx(*env_);
|
|
85
158
|
auto key_flag = conf->key_flag;
|
|
86
159
|
auto value_flag = conf->value_flag;
|
|
160
|
+
key_mode key_mode{};
|
|
161
|
+
value_mode value_mode{};
|
|
162
|
+
std::string db_name{};
|
|
87
163
|
auto arg_count = info.Length();
|
|
164
|
+
|
|
165
|
+
if (arg_count == 1 && info[0].IsObject()) {
|
|
166
|
+
return get_dbi(info[0].As<Napi::Object>(), db_mode);
|
|
167
|
+
}
|
|
168
|
+
|
|
88
169
|
if (arg_count == 3) {
|
|
89
170
|
auto arg0 = info[0]; // db_name
|
|
90
171
|
auto arg1 = info[1]; // key_mode
|
|
@@ -94,8 +175,8 @@ Napi::Value txnmou::get_dbi(const Napi::CallbackInfo& info, db_mode db_mode)
|
|
|
94
175
|
value_mode = value_mode::parse(arg2);
|
|
95
176
|
} else if (arg_count == 2) {
|
|
96
177
|
// db_name + key_mode || key_mode + value_mode
|
|
97
|
-
auto arg0 = info[0];
|
|
98
|
-
auto arg1 = info[1];
|
|
178
|
+
auto arg0 = info[0];
|
|
179
|
+
auto arg1 = info[1];
|
|
99
180
|
if (arg0.IsString()) {
|
|
100
181
|
db_name = arg0.As<Napi::String>().Utf8Value();
|
|
101
182
|
key_mode = parse_key_mode(env, arg1, key_flag);
|
|
@@ -116,24 +197,10 @@ Napi::Value txnmou::get_dbi(const Napi::CallbackInfo& info, db_mode db_mode)
|
|
|
116
197
|
throw Napi::Error::New(env, "Invalid argument type: expected string (db_name) or number (key_mode)");
|
|
117
198
|
}
|
|
118
199
|
}
|
|
119
|
-
// arg_count == 0:
|
|
120
|
-
|
|
121
|
-
if (!txn_) {
|
|
122
|
-
throw Napi::Error::New(env, "txn already completed");
|
|
123
|
-
}
|
|
200
|
+
// arg_count == 0: значения по умолчанию (key/value = buffer, если env не задавал флаги)
|
|
124
201
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
auto rc = mdbx_dbi_open(*this, db_name.empty() ? nullptr : db_name.c_str(), flags, &dbi);
|
|
128
|
-
if (rc != MDBX_SUCCESS) {
|
|
129
|
-
throw Napi::Error::New(env, std::string("mdbx_dbi_open: ") + mdbx_strerror(rc));
|
|
130
|
-
}
|
|
131
|
-
// создаем новый объект dbi
|
|
132
|
-
auto obj = dbimou::ctor.New({});
|
|
133
|
-
auto ptr = dbimou::Unwrap(obj);
|
|
134
|
-
ptr->attach(dbi, db_mode, key_mode,
|
|
135
|
-
value_mode, key_flag, value_flag);
|
|
136
|
-
return obj;
|
|
202
|
+
return get_dbi(db_name.empty() ? nullptr : db_name.c_str(),
|
|
203
|
+
key_flag, value_flag, key_mode, value_mode, db_mode);
|
|
137
204
|
}
|
|
138
205
|
|
|
139
206
|
Napi::Value txnmou::open_cursor(const Napi::CallbackInfo& info) {
|
|
@@ -178,4 +245,4 @@ void txnmou::attach(envmou& env, MDBX_txn* txn, txn_mode mode)
|
|
|
178
245
|
txn_.reset(txn);
|
|
179
246
|
}
|
|
180
247
|
|
|
181
|
-
} // namespace mdbxmou
|
|
248
|
+
} // namespace mdbxmou
|
package/src/txnmou.hpp
CHANGED
|
@@ -27,7 +27,10 @@ private:
|
|
|
27
27
|
// Уменьшает счетчик транзакций
|
|
28
28
|
void dec_counter() noexcept;
|
|
29
29
|
|
|
30
|
-
Napi::Value get_dbi(const
|
|
30
|
+
Napi::Value get_dbi(const char* name, base_flag key_flag, base_flag value_flag,
|
|
31
|
+
key_mode key_mode, value_mode value_mode, db_mode db_mode);
|
|
32
|
+
Napi::Value get_dbi(const Napi::Object& arg0, db_mode db_mode);
|
|
33
|
+
Napi::Value get_dbi(const Napi::CallbackInfo& info, db_mode db_mode);
|
|
31
34
|
|
|
32
35
|
public:
|
|
33
36
|
static Napi::FunctionReference ctor;
|
package/src/typemou.hpp
CHANGED
|
@@ -246,7 +246,7 @@ static inline key_mode parse_key_mode(Napi::Env env, const Napi::Value& arg0, ba
|
|
|
246
246
|
throw Napi::Error::New(env, "BigInt value lossless conversion failed");
|
|
247
247
|
}
|
|
248
248
|
mode.val = static_cast<int>(value);
|
|
249
|
-
if (mode
|
|
249
|
+
if (mdbx::is_ordinal(mode)) {
|
|
250
250
|
// только если цифровой key_flag не был задан
|
|
251
251
|
if (key_flag.val <= base_flag::string) {
|
|
252
252
|
key_flag.val = base_flag::bigint;
|
|
@@ -254,7 +254,7 @@ static inline key_mode parse_key_mode(Napi::Env env, const Napi::Value& arg0, ba
|
|
|
254
254
|
}
|
|
255
255
|
} else if (arg0.IsNumber()) {
|
|
256
256
|
mode = key_mode::parse(arg0);
|
|
257
|
-
if (mode
|
|
257
|
+
if (mdbx::is_ordinal(mode)) {
|
|
258
258
|
// только если цифровой key_flag не был задан
|
|
259
259
|
if (key_flag.val <= base_flag::string) {
|
|
260
260
|
key_flag.val = base_flag::number;
|