@nxtedition/rocksdb 5.2.37 → 5.2.40

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.
Files changed (189) hide show
  1. package/binding.cc +67 -82
  2. package/deps/liburing/liburing/COPYING +502 -0
  3. package/deps/liburing/liburing/COPYING.GPL +339 -0
  4. package/deps/liburing/liburing/LICENSE +7 -0
  5. package/deps/liburing/liburing/Makefile +84 -0
  6. package/deps/liburing/liburing/Makefile.quiet +11 -0
  7. package/deps/liburing/liburing/README +46 -0
  8. package/deps/liburing/liburing/configure +420 -0
  9. package/deps/liburing/liburing/debian/README.Debian +7 -0
  10. package/deps/liburing/liburing/debian/changelog +27 -0
  11. package/deps/liburing/liburing/debian/compat +1 -0
  12. package/deps/liburing/liburing/debian/control +48 -0
  13. package/deps/liburing/liburing/debian/copyright +49 -0
  14. package/deps/liburing/liburing/debian/liburing-dev.install +4 -0
  15. package/deps/liburing/liburing/debian/liburing-dev.manpages +6 -0
  16. package/deps/liburing/liburing/debian/liburing1-udeb.install +1 -0
  17. package/deps/liburing/liburing/debian/liburing1.install +1 -0
  18. package/deps/liburing/liburing/debian/liburing1.symbols +32 -0
  19. package/deps/liburing/liburing/debian/patches/series +1 -0
  20. package/deps/liburing/liburing/debian/rules +81 -0
  21. package/deps/liburing/liburing/debian/source/format +1 -0
  22. package/deps/liburing/liburing/debian/source/local-options +2 -0
  23. package/deps/liburing/liburing/debian/source/options +1 -0
  24. package/deps/liburing/liburing/debian/watch +3 -0
  25. package/deps/liburing/liburing/examples/Makefile +29 -0
  26. package/deps/liburing/liburing/examples/io_uring-cp.c +279 -0
  27. package/deps/liburing/liburing/examples/io_uring-test.c +112 -0
  28. package/deps/liburing/liburing/examples/link-cp.c +193 -0
  29. package/deps/liburing/liburing/examples/ucontext-cp.c +273 -0
  30. package/deps/liburing/liburing/liburing.pc.in +12 -0
  31. package/deps/liburing/liburing/liburing.spec +66 -0
  32. package/deps/liburing/liburing/make-debs.sh +53 -0
  33. package/deps/liburing/liburing/man/io_uring.7 +736 -0
  34. package/deps/liburing/liburing/man/io_uring_enter.2 +1403 -0
  35. package/deps/liburing/liburing/man/io_uring_get_sqe.3 +37 -0
  36. package/deps/liburing/liburing/man/io_uring_queue_exit.3 +27 -0
  37. package/deps/liburing/liburing/man/io_uring_queue_init.3 +44 -0
  38. package/deps/liburing/liburing/man/io_uring_register.2 +605 -0
  39. package/deps/liburing/liburing/man/io_uring_setup.2 +515 -0
  40. package/deps/liburing/liburing/src/Makefile +76 -0
  41. package/deps/liburing/liburing/src/include/liburing/barrier.h +73 -0
  42. package/deps/liburing/liburing/src/include/liburing/io_uring.h +422 -0
  43. package/deps/liburing/liburing/src/include/liburing.h +775 -0
  44. package/deps/liburing/liburing/src/liburing.map +46 -0
  45. package/deps/liburing/liburing/src/queue.c +403 -0
  46. package/deps/liburing/liburing/src/register.c +299 -0
  47. package/deps/liburing/liburing/src/setup.c +356 -0
  48. package/deps/liburing/liburing/src/syscall.c +73 -0
  49. package/deps/liburing/liburing/src/syscall.h +20 -0
  50. package/deps/liburing/liburing/test/232c93d07b74-test.c +305 -0
  51. package/deps/liburing/liburing/test/35fa71a030ca-test.c +329 -0
  52. package/deps/liburing/liburing/test/500f9fbadef8-test.c +89 -0
  53. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +93 -0
  54. package/deps/liburing/liburing/test/8a9973408177-test.c +106 -0
  55. package/deps/liburing/liburing/test/917257daa0fe-test.c +53 -0
  56. package/deps/liburing/liburing/test/Makefile +312 -0
  57. package/deps/liburing/liburing/test/a0908ae19763-test.c +58 -0
  58. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +180 -0
  59. package/deps/liburing/liburing/test/accept-link.c +251 -0
  60. package/deps/liburing/liburing/test/accept-reuse.c +164 -0
  61. package/deps/liburing/liburing/test/accept-test.c +79 -0
  62. package/deps/liburing/liburing/test/accept.c +476 -0
  63. package/deps/liburing/liburing/test/across-fork.c +283 -0
  64. package/deps/liburing/liburing/test/b19062a56726-test.c +53 -0
  65. package/deps/liburing/liburing/test/b5837bd5311d-test.c +77 -0
  66. package/deps/liburing/liburing/test/ce593a6c480a-test.c +135 -0
  67. package/deps/liburing/liburing/test/close-opath.c +122 -0
  68. package/deps/liburing/liburing/test/config +10 -0
  69. package/deps/liburing/liburing/test/connect.c +398 -0
  70. package/deps/liburing/liburing/test/cq-full.c +96 -0
  71. package/deps/liburing/liburing/test/cq-overflow.c +294 -0
  72. package/deps/liburing/liburing/test/cq-peek-batch.c +102 -0
  73. package/deps/liburing/liburing/test/cq-ready.c +94 -0
  74. package/deps/liburing/liburing/test/cq-size.c +58 -0
  75. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +96 -0
  76. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +65 -0
  77. package/deps/liburing/liburing/test/defer.c +307 -0
  78. package/deps/liburing/liburing/test/double-poll-crash.c +186 -0
  79. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +114 -0
  80. package/deps/liburing/liburing/test/empty-eownerdead.c +42 -0
  81. package/deps/liburing/liburing/test/eventfd-disable.c +151 -0
  82. package/deps/liburing/liburing/test/eventfd-ring.c +97 -0
  83. package/deps/liburing/liburing/test/eventfd.c +112 -0
  84. package/deps/liburing/liburing/test/fadvise.c +202 -0
  85. package/deps/liburing/liburing/test/fallocate.c +249 -0
  86. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +138 -0
  87. package/deps/liburing/liburing/test/file-register.c +843 -0
  88. package/deps/liburing/liburing/test/file-update.c +173 -0
  89. package/deps/liburing/liburing/test/files-exit-hang-poll.c +128 -0
  90. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +134 -0
  91. package/deps/liburing/liburing/test/fixed-link.c +90 -0
  92. package/deps/liburing/liburing/test/fsync.c +224 -0
  93. package/deps/liburing/liburing/test/hardlink.c +136 -0
  94. package/deps/liburing/liburing/test/helpers.c +135 -0
  95. package/deps/liburing/liburing/test/helpers.h +67 -0
  96. package/deps/liburing/liburing/test/io-cancel.c +537 -0
  97. package/deps/liburing/liburing/test/io_uring_enter.c +296 -0
  98. package/deps/liburing/liburing/test/io_uring_register.c +664 -0
  99. package/deps/liburing/liburing/test/io_uring_setup.c +192 -0
  100. package/deps/liburing/liburing/test/iopoll.c +366 -0
  101. package/deps/liburing/liburing/test/lfs-openat-write.c +117 -0
  102. package/deps/liburing/liburing/test/lfs-openat.c +273 -0
  103. package/deps/liburing/liburing/test/link-timeout.c +1107 -0
  104. package/deps/liburing/liburing/test/link.c +496 -0
  105. package/deps/liburing/liburing/test/link_drain.c +229 -0
  106. package/deps/liburing/liburing/test/madvise.c +195 -0
  107. package/deps/liburing/liburing/test/mkdir.c +108 -0
  108. package/deps/liburing/liburing/test/multicqes_drain.c +383 -0
  109. package/deps/liburing/liburing/test/nop-all-sizes.c +107 -0
  110. package/deps/liburing/liburing/test/nop.c +115 -0
  111. package/deps/liburing/liburing/test/open-close.c +146 -0
  112. package/deps/liburing/liburing/test/openat2.c +240 -0
  113. package/deps/liburing/liburing/test/personality.c +204 -0
  114. package/deps/liburing/liburing/test/pipe-eof.c +81 -0
  115. package/deps/liburing/liburing/test/pipe-reuse.c +105 -0
  116. package/deps/liburing/liburing/test/poll-cancel-ton.c +139 -0
  117. package/deps/liburing/liburing/test/poll-cancel.c +135 -0
  118. package/deps/liburing/liburing/test/poll-link.c +227 -0
  119. package/deps/liburing/liburing/test/poll-many.c +208 -0
  120. package/deps/liburing/liburing/test/poll-mshot-update.c +273 -0
  121. package/deps/liburing/liburing/test/poll-ring.c +48 -0
  122. package/deps/liburing/liburing/test/poll-v-poll.c +353 -0
  123. package/deps/liburing/liburing/test/poll.c +109 -0
  124. package/deps/liburing/liburing/test/probe.c +137 -0
  125. package/deps/liburing/liburing/test/read-write.c +876 -0
  126. package/deps/liburing/liburing/test/register-restrictions.c +633 -0
  127. package/deps/liburing/liburing/test/rename.c +134 -0
  128. package/deps/liburing/liburing/test/ring-leak.c +173 -0
  129. package/deps/liburing/liburing/test/ring-leak2.c +249 -0
  130. package/deps/liburing/liburing/test/rsrc_tags.c +449 -0
  131. package/deps/liburing/liburing/test/runtests-loop.sh +16 -0
  132. package/deps/liburing/liburing/test/runtests.sh +170 -0
  133. package/deps/liburing/liburing/test/rw_merge_test.c +97 -0
  134. package/deps/liburing/liburing/test/self.c +91 -0
  135. package/deps/liburing/liburing/test/send_recv.c +291 -0
  136. package/deps/liburing/liburing/test/send_recvmsg.c +345 -0
  137. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +198 -0
  138. package/deps/liburing/liburing/test/shared-wq.c +84 -0
  139. package/deps/liburing/liburing/test/short-read.c +75 -0
  140. package/deps/liburing/liburing/test/shutdown.c +163 -0
  141. package/deps/liburing/liburing/test/sigfd-deadlock.c +74 -0
  142. package/deps/liburing/liburing/test/socket-rw-eagain.c +156 -0
  143. package/deps/liburing/liburing/test/socket-rw.c +147 -0
  144. package/deps/liburing/liburing/test/splice.c +511 -0
  145. package/deps/liburing/liburing/test/sq-full-cpp.cc +45 -0
  146. package/deps/liburing/liburing/test/sq-full.c +45 -0
  147. package/deps/liburing/liburing/test/sq-poll-dup.c +200 -0
  148. package/deps/liburing/liburing/test/sq-poll-kthread.c +168 -0
  149. package/deps/liburing/liburing/test/sq-poll-share.c +137 -0
  150. package/deps/liburing/liburing/test/sq-space_left.c +159 -0
  151. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +159 -0
  152. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +195 -0
  153. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +77 -0
  154. package/deps/liburing/liburing/test/sqpoll-sleep.c +68 -0
  155. package/deps/liburing/liburing/test/statx.c +172 -0
  156. package/deps/liburing/liburing/test/stdout.c +232 -0
  157. package/deps/liburing/liburing/test/submit-link-fail.c +154 -0
  158. package/deps/liburing/liburing/test/submit-reuse.c +239 -0
  159. package/deps/liburing/liburing/test/symlink.c +116 -0
  160. package/deps/liburing/liburing/test/teardowns.c +58 -0
  161. package/deps/liburing/liburing/test/thread-exit.c +131 -0
  162. package/deps/liburing/liburing/test/timeout-new.c +246 -0
  163. package/deps/liburing/liburing/test/timeout-overflow.c +204 -0
  164. package/deps/liburing/liburing/test/timeout.c +1354 -0
  165. package/deps/liburing/liburing/test/unlink.c +111 -0
  166. package/deps/liburing/liburing/test/wakeup-hang.c +162 -0
  167. package/deps/liburing/liburing.gyp +20 -0
  168. package/deps/rocksdb/rocksdb/db/corruption_test.cc +62 -0
  169. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -62
  170. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +25 -11
  171. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +74 -155
  172. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  173. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  174. package/deps/rocksdb/rocksdb/env/fs_posix.cc +13 -0
  175. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +4 -2
  176. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +22 -4
  177. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +5 -0
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +15 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -0
  182. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +3 -7
  183. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -29
  185. package/deps/rocksdb/rocksdb.gyp +4 -3
  186. package/package.json +1 -1
  187. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  188. package/prebuilds/darwin-x64/node.napi.node +0 -0
  189. package/prebuilds/linux-x64/node.napi.node +0 -0
package/binding.cc CHANGED
@@ -18,6 +18,7 @@
18
18
  #include <optional>
19
19
  #include <set>
20
20
  #include <string>
21
+ #include <thread>
21
22
  #include <vector>
22
23
 
23
24
  class NullLogger : public rocksdb::Logger {
@@ -38,15 +39,6 @@ struct Iterator;
38
39
  } \
39
40
  }
40
41
 
41
- #define NAPI_PENDING_EXCEPTION() \
42
- { \
43
- bool result; \
44
- NAPI_STATUS_THROWS(napi_is_exception_pending(env, &result)); \
45
- if (result) { \
46
- return nullptr; \
47
- } \
48
- }
49
-
50
42
  #define NAPI_DB_CONTEXT() \
51
43
  Database* database = nullptr; \
52
44
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&database));
@@ -71,12 +63,6 @@ static bool IsBuffer(napi_env env, napi_value value) {
71
63
  return isBuffer;
72
64
  }
73
65
 
74
- static bool IsObject(napi_env env, napi_value value) {
75
- napi_valuetype type;
76
- napi_typeof(env, value, &type);
77
- return type == napi_object;
78
- }
79
-
80
66
  static napi_value CreateError(napi_env env, const std::optional<std::string_view>& code, const std::string_view& msg) {
81
67
  napi_value codeValue = nullptr;
82
68
  if (code) {
@@ -226,38 +212,39 @@ napi_status Convert(napi_env env, std::string s, bool asBuffer, napi_value& resu
226
212
  napi_status Convert(napi_env env, rocksdb::PinnableSlice s, bool asBuffer, napi_value& result) {
227
213
  if (asBuffer) {
228
214
  auto ptr = new rocksdb::PinnableSlice(std::move(s));
229
- return napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()), Finalize<rocksdb::PinnableSlice>, ptr,
230
- &result);
215
+ return napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()),
216
+ Finalize<rocksdb::PinnableSlice>, ptr, &result);
231
217
  } else {
232
218
  return napi_create_string_utf8(env, s.data(), s.size(), &result);
233
219
  }
234
220
  }
235
221
 
236
222
  struct NapiSlice : public rocksdb::Slice {
237
- NapiSlice(napi_env env, napi_value from) {
238
- if (IsString(env, from)) {
239
- NAPI_STATUS_THROWS_VOID(napi_get_value_string_utf8(env, from, nullptr, 0, &size_));
240
- char* data;
241
- if (size_ + 1 < stack_.size()) {
242
- data = stack_.data();
243
- } else {
244
- heap_.reset(new char[size_ + 1]);
245
- data = heap_.get();
246
- }
247
- data[size_] = 0;
248
- NAPI_STATUS_THROWS_VOID(napi_get_value_string_utf8(env, from, data, size_ + 1, &size_));
249
- data_ = data;
250
- } else if (IsBuffer(env, from)) {
251
- void* data;
252
- NAPI_STATUS_THROWS_VOID(napi_get_buffer_info(env, from, &data, &size_));
253
- data_ = static_cast<char*>(data);
254
- }
255
- }
256
-
257
223
  std::unique_ptr<char[]> heap_;
258
- std::array<char, 1024> stack_;
224
+ std::array<char, 128> stack_;
259
225
  };
260
226
 
227
+ napi_status ToNapiSlice(napi_env env, napi_value from, NapiSlice& slice) {
228
+ if (IsString(env, from)) {
229
+ NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, nullptr, 0, &slice.size_));
230
+ char* data;
231
+ if (slice.size_ + 1 < slice.stack_.size()) {
232
+ data = slice.stack_.data();
233
+ } else {
234
+ slice.heap_.reset(new char[slice.size_ + 1]);
235
+ data = slice.heap_.get();
236
+ }
237
+ data[slice.size_] = 0;
238
+ NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, data, slice.size_ + 1, &slice.size_));
239
+ slice.data_ = data;
240
+ } else if (IsBuffer(env, from)) {
241
+ void* data;
242
+ NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, &data, &slice.size_));
243
+ slice.data_ = static_cast<char*>(data);
244
+ }
245
+ return napi_ok;
246
+ }
247
+
261
248
  /**
262
249
  * Base worker class. Handles the async work. Derived classes can override the
263
250
  * following virtual methods (listed in the order in which they're called):
@@ -587,7 +574,7 @@ struct OpenWorker final : public Worker {
587
574
  location_(location) {}
588
575
 
589
576
  rocksdb::Status Execute(Database& database) override {
590
- rocksdb::DB* db;
577
+ rocksdb::DB* db = nullptr;
591
578
  const auto status = readOnly_ ? rocksdb::DB::OpenForReadOnly(options_, location_, &db)
592
579
  : rocksdb::DB::Open(options_, location_, &db);
593
580
  database.db_.reset(db);
@@ -605,7 +592,8 @@ NAPI_METHOD(db_open) {
605
592
 
606
593
  rocksdb::Options options;
607
594
 
608
- options.IncreaseParallelism(Uint32Property(env, argv[2], "parallelism").value_or(4));
595
+ options.IncreaseParallelism(
596
+ Uint32Property(env, argv[2], "parallelism").value_or(std::thread::hardware_concurrency() / 2));
609
597
 
610
598
  const auto location = ToString(env, argv[1]);
611
599
  options.create_if_missing = BooleanProperty(env, argv[2], "createIfMissing").value_or(true);
@@ -613,6 +601,12 @@ NAPI_METHOD(db_open) {
613
601
  options.compression = BooleanProperty(env, argv[2], "compression").value_or((true)) ? rocksdb::kSnappyCompression
614
602
  : rocksdb::kNoCompression;
615
603
  options.use_adaptive_mutex = true;
604
+ options.enable_pipelined_write = true;
605
+ options.max_background_jobs =
606
+ Uint32Property(env, argv[2], "maxBackgroundJobs").value_or(std::thread::hardware_concurrency() / 4);
607
+
608
+ // TODO: Consider direct IO (https://github.com/facebook/rocksdb/wiki/Direct-IO) once
609
+ // secondary compressed cache is stable.
616
610
 
617
611
  const auto infoLogLevel = StringProperty(env, argv[2], "infoLogLevel").value_or("");
618
612
  if (infoLogLevel.size() > 0) {
@@ -648,22 +642,24 @@ NAPI_METHOD(db_open) {
648
642
 
649
643
  if (cacheSize) {
650
644
  tableOptions.block_cache = rocksdb::NewLRUCache(cacheSize);
645
+ tableOptions.cache_index_and_filter_blocks =
646
+ BooleanProperty(env, argv[2], "cacheIndexAndFilterBlocks").value_or(true);
651
647
  } else {
652
648
  tableOptions.no_block_cache = true;
649
+ tableOptions.cache_index_and_filter_blocks = false;
653
650
  }
654
651
 
655
652
  tableOptions.block_size = Uint32Property(env, argv[2], "blockSize").value_or(4096);
656
653
  tableOptions.block_restart_interval = Uint32Property(env, argv[2], "blockRestartInterval").value_or(16);
657
- tableOptions.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10));
654
+ tableOptions.filter_policy.reset(rocksdb::NewRibbonFilterPolicy(10));
658
655
  tableOptions.format_version = 5;
659
- tableOptions.checksum = rocksdb::kxxHash64;
656
+ tableOptions.checksum = rocksdb::kXXH3;
657
+ tableOptions.optimize_filters_for_memory = BooleanProperty(env, argv[2], "optimizeFiltersForMemory").value_or(true);
660
658
 
661
659
  options.table_factory.reset(rocksdb::NewBlockBasedTableFactory(tableOptions));
662
660
 
663
661
  const auto callback = argv[3];
664
662
 
665
- NAPI_PENDING_EXCEPTION();
666
-
667
663
  auto worker = new OpenWorker(env, database, callback, location, options, readOnly);
668
664
  worker->Queue(env);
669
665
 
@@ -702,10 +698,11 @@ NAPI_METHOD(db_put) {
702
698
  NAPI_ARGV(4);
703
699
  NAPI_DB_CONTEXT();
704
700
 
705
- const auto key = NapiSlice(env, argv[1]);
706
- const auto val = NapiSlice(env, argv[2]);
701
+ NapiSlice key;
702
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], key));
707
703
 
708
- NAPI_PENDING_EXCEPTION();
704
+ NapiSlice val;
705
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[2], val));
709
706
 
710
707
  rocksdb::WriteOptions options;
711
708
  return ToError(env, database->db_->Put(options, key, val));
@@ -770,8 +767,6 @@ NAPI_METHOD(db_get) {
770
767
  const auto fillCache = BooleanProperty(env, options, "fillCache").value_or(true);
771
768
  const auto callback = argv[3];
772
769
 
773
- NAPI_PENDING_EXCEPTION();
774
-
775
770
  auto worker = new GetWorker(env, database, callback, key, asBuffer, fillCache);
776
771
  worker->Queue(env);
777
772
 
@@ -781,12 +776,12 @@ NAPI_METHOD(db_get) {
781
776
  struct GetManyWorker final : public Worker {
782
777
  GetManyWorker(napi_env env,
783
778
  Database* database,
784
- const std::vector<std::string>& keys,
779
+ std::vector<std::string> keys,
785
780
  napi_value callback,
786
781
  const bool valueAsBuffer,
787
782
  const bool fillCache)
788
783
  : Worker(env, database, callback, "leveldown.get.many"),
789
- keys_(keys),
784
+ keys_(std::move(keys)),
790
785
  valueAsBuffer_(valueAsBuffer),
791
786
  fillCache_(fillCache),
792
787
  snapshot_(database_->db_->GetSnapshot(),
@@ -888,9 +883,7 @@ NAPI_METHOD(db_get_many) {
888
883
  const bool fillCache = BooleanProperty(env, options, "fillCache").value_or(true);
889
884
  const auto callback = argv[3];
890
885
 
891
- NAPI_PENDING_EXCEPTION();
892
-
893
- auto worker = new GetManyWorker(env, database, keys, callback, asBuffer, fillCache);
886
+ auto worker = new GetManyWorker(env, database, std::move(keys), callback, asBuffer, fillCache);
894
887
  worker->Queue(env);
895
888
 
896
889
  return 0;
@@ -900,9 +893,8 @@ NAPI_METHOD(db_del) {
900
893
  NAPI_ARGV(3);
901
894
  NAPI_DB_CONTEXT();
902
895
 
903
- const auto key = NapiSlice(env, argv[1]);
904
-
905
- NAPI_PENDING_EXCEPTION();
896
+ NapiSlice key;
897
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], key));
906
898
 
907
899
  rocksdb::WriteOptions options;
908
900
  return ToError(env, database->db_->Delete(options, key));
@@ -965,9 +957,8 @@ NAPI_METHOD(db_get_property) {
965
957
  NAPI_ARGV(2);
966
958
  NAPI_DB_CONTEXT();
967
959
 
968
- const auto property = NapiSlice(env, argv[1]);
969
-
970
- NAPI_PENDING_EXCEPTION();
960
+ NapiSlice property;
961
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], property));
971
962
 
972
963
  std::string value;
973
964
  database->db_->GetProperty(property, &value);
@@ -1014,9 +1005,8 @@ NAPI_METHOD(iterator_seek) {
1014
1005
  NAPI_ARGV(2);
1015
1006
  NAPI_ITERATOR_CONTEXT();
1016
1007
 
1017
- const auto target = NapiSlice(env, argv[1]);
1018
-
1019
- NAPI_PENDING_EXCEPTION();
1008
+ NapiSlice target;
1009
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], target));
1020
1010
 
1021
1011
  iterator->first_ = true;
1022
1012
  iterator->Seek(target);
@@ -1144,23 +1134,18 @@ NAPI_METHOD(batch_do) {
1144
1134
  napi_value element;
1145
1135
  NAPI_STATUS_THROWS(napi_get_element(env, operations, i, &element));
1146
1136
 
1147
- if (!IsObject(env, element))
1148
- continue;
1149
-
1150
- const auto type = StringProperty(env, element, "type");
1137
+ NapiSlice type;
1138
+ NAPI_STATUS_THROWS(ToNapiSlice(env, GetProperty(env, element, "type"), type));
1151
1139
 
1152
1140
  if (type == "del") {
1153
- const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1154
-
1155
- NAPI_PENDING_EXCEPTION();
1156
-
1141
+ NapiSlice key;
1142
+ NAPI_STATUS_THROWS(ToNapiSlice(env, GetProperty(env, element, "key"), key));
1157
1143
  batch.Delete(key);
1158
1144
  } else if (type == "put") {
1159
- const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1160
- const auto value = NapiSlice(env, GetProperty(env, element, "value"));
1161
-
1162
- NAPI_PENDING_EXCEPTION();
1163
-
1145
+ NapiSlice key;
1146
+ NAPI_STATUS_THROWS(ToNapiSlice(env, GetProperty(env, element, "key"), key));
1147
+ NapiSlice value;
1148
+ NAPI_STATUS_THROWS(ToNapiSlice(env, GetProperty(env, element, "value"), value));
1164
1149
  batch.Put(key, value);
1165
1150
  }
1166
1151
  }
@@ -1184,10 +1169,11 @@ NAPI_METHOD(batch_put) {
1184
1169
  NAPI_ARGV(3);
1185
1170
  NAPI_BATCH_CONTEXT();
1186
1171
 
1187
- const auto key = NapiSlice(env, argv[1]);
1188
- const auto val = NapiSlice(env, argv[2]);
1172
+ NapiSlice key;
1173
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], key));
1189
1174
 
1190
- NAPI_PENDING_EXCEPTION();
1175
+ NapiSlice val;
1176
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[2], val));
1191
1177
 
1192
1178
  batch->Put(key, val);
1193
1179
 
@@ -1198,9 +1184,8 @@ NAPI_METHOD(batch_del) {
1198
1184
  NAPI_ARGV(2);
1199
1185
  NAPI_BATCH_CONTEXT();
1200
1186
 
1201
- const auto key = NapiSlice(env, argv[1]);
1202
-
1203
- NAPI_PENDING_EXCEPTION();
1187
+ NapiSlice key;
1188
+ NAPI_STATUS_THROWS(ToNapiSlice(env, argv[1], key));
1204
1189
 
1205
1190
  batch->Delete(key);
1206
1191