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 CHANGED
@@ -65,7 +65,7 @@
65
65
  },
66
66
  "gypfile": true,
67
67
  "name": "mdbxmou",
68
- "version": "0.3.4",
68
+ "version": "0.3.5",
69
69
  "description": "Node bindings for mdbx",
70
70
  "repository": {
71
71
  "type": "git",
@@ -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.val & key_mode::ordinal) {
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
- const bool is_ordinal = mdbx::is_ordinal(arg0.key_mod);
109
-
110
- auto cursor = dbi::get_cursor(txn, 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.val & key_mode::ordinal) {
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.val & key_mode::ordinal) {
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.val & key_mode::ordinal) ?
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.val & key_mode::ordinal) {
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.val & key_mode::ordinal) ?
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.val & key_mode::ordinal) {
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 get_cursor(txn, mdbx::map_handle{ id_ });
50
+ return open_cursor(txn, mdbx::map_handle{id_});
51
51
  }
52
52
 
53
- cursormou_managed dbi::get_cursor(MDBX_txn* txn, mdbx::map_handle 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 get_cursor(MDBX_txn* txn, mdbx::map_handle dbi);
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_.val & key_mode::ordinal) ?
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_.val & key_mode::ordinal) ?
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_.val & key_mode::ordinal) ?
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_.val & key_mode::ordinal) ?
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 cursor = dbi::open_cursor(*txn);
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_.val & key_mode::ordinal) {
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_.val & key_mode::ordinal) ?
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_.val & key_mode::ordinal) {
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
- const bool is_ordinal = key_mode_.val & key_mode::ordinal;
441
- const bool is_bigint = key_flag_.val & base_flag::bigint;
442
- const bool is_string = key_flag_.val & base_flag::string;
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_.val & key_mode::ordinal) ?
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_.val & key_mode::ordinal) {
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.val & key_mode::ordinal) {
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 Napi::CallbackInfo& info, db_mode db_mode)
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 = info.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: используем значения по умолчанию (строковый ключ, default db)
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
- MDBX_dbi dbi{};
126
- auto flags = static_cast<MDBX_db_flags_t>(db_mode.val|key_mode.val|value_mode.val);
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 Napi::CallbackInfo&, db_mode);
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.val & key_mode::ordinal) {
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.val & key_mode::ordinal) {
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;