@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
package/binding.cc CHANGED
@@ -1,28 +1,27 @@
1
1
  #define NAPI_VERSION 8
2
2
 
3
+ #include <assert.h>
3
4
  #include <napi-macros.h>
4
5
  #include <node_api.h>
5
- #include <assert.h>
6
6
 
7
- #include <rocksdb/db.h>
8
- #include <rocksdb/write_batch.h>
9
- #include <rocksdb/cache.h>
10
- #include <rocksdb/filter_policy.h>
11
7
  #include <rocksdb/cache.h>
12
8
  #include <rocksdb/comparator.h>
9
+ #include <rocksdb/db.h>
13
10
  #include <rocksdb/env.h>
11
+ #include <rocksdb/filter_policy.h>
14
12
  #include <rocksdb/options.h>
15
13
  #include <rocksdb/table.h>
14
+ #include <rocksdb/write_batch.h>
16
15
 
17
- namespace leveldb = rocksdb;
18
-
19
- #include <set>
16
+ #include <array>
20
17
  #include <memory>
18
+ #include <optional>
19
+ #include <set>
21
20
  #include <string>
22
21
  #include <vector>
23
22
 
24
23
  class NullLogger : public rocksdb::Logger {
25
- public:
24
+ public:
26
25
  using rocksdb::Logger::Logv;
27
26
  virtual void Logv(const char* format, va_list ap) override {}
28
27
  virtual size_t GetLogFileSize() const override { return 0; }
@@ -30,9 +29,8 @@ public:
30
29
 
31
30
  struct Database;
32
31
  struct Iterator;
33
- static void iterator_do_close (napi_env env, Iterator* iterator, napi_value cb);
34
32
 
35
- #define NAPI_DB_CONTEXT() \
33
+ #define NAPI_DB_CONTEXT() \
36
34
  Database* database = nullptr; \
37
35
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&database));
38
36
 
@@ -40,29 +38,29 @@ static void iterator_do_close (napi_env env, Iterator* iterator, napi_value cb);
40
38
  Iterator* iterator = nullptr; \
41
39
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&iterator));
42
40
 
43
- #define NAPI_BATCH_CONTEXT() \
41
+ #define NAPI_BATCH_CONTEXT() \
44
42
  rocksdb::WriteBatch* batch = nullptr; \
45
43
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&batch));
46
44
 
47
- static bool IsString (napi_env env, napi_value value) {
45
+ static bool IsString(napi_env env, napi_value value) {
48
46
  napi_valuetype type;
49
47
  napi_typeof(env, value, &type);
50
48
  return type == napi_string;
51
49
  }
52
50
 
53
- static bool IsBuffer (napi_env env, napi_value value) {
51
+ static bool IsBuffer(napi_env env, napi_value value) {
54
52
  bool isBuffer;
55
53
  napi_is_buffer(env, value, &isBuffer);
56
54
  return isBuffer;
57
55
  }
58
56
 
59
- static bool IsObject (napi_env env, napi_value value) {
57
+ static bool IsObject(napi_env env, napi_value value) {
60
58
  napi_valuetype type;
61
59
  napi_typeof(env, value, &type);
62
60
  return type == napi_object;
63
61
  }
64
62
 
65
- static napi_value CreateError (napi_env env, const std::string& str) {
63
+ static napi_value CreateError(napi_env env, const std::string_view& str) {
66
64
  napi_value msg;
67
65
  napi_create_string_utf8(env, str.data(), str.size(), &msg);
68
66
  napi_value error;
@@ -70,7 +68,7 @@ static napi_value CreateError (napi_env env, const std::string& str) {
70
68
  return error;
71
69
  }
72
70
 
73
- static napi_value CreateCodeError (napi_env env, const std::string& code, const std::string& msg) {
71
+ static napi_value CreateCodeError(napi_env env, const std::string_view& code, const std::string_view& msg) {
74
72
  napi_value codeValue;
75
73
  napi_create_string_utf8(env, code.data(), code.size(), &codeValue);
76
74
  napi_value msgValue;
@@ -80,20 +78,19 @@ static napi_value CreateCodeError (napi_env env, const std::string& code, const
80
78
  return error;
81
79
  }
82
80
 
83
- static bool HasProperty (napi_env env, napi_value obj, const std::string& key) {
81
+ static bool HasProperty(napi_env env, napi_value obj, const std::string_view& key) {
84
82
  bool has = false;
85
83
  napi_has_named_property(env, obj, key.data(), &has);
86
84
  return has;
87
85
  }
88
86
 
89
- static napi_value GetProperty (napi_env env, napi_value obj, const std::string& key) {
87
+ static napi_value GetProperty(napi_env env, napi_value obj, const std::string_view& key) {
90
88
  napi_value value;
91
89
  napi_get_named_property(env, obj, key.data(), &value);
92
90
  return value;
93
91
  }
94
92
 
95
- static bool BooleanProperty (napi_env env, napi_value obj, const std::string& key,
96
- bool defaultValue) {
93
+ static bool BooleanProperty(napi_env env, napi_value obj, const std::string_view& key, bool defaultValue) {
97
94
  if (HasProperty(env, obj, key.data())) {
98
95
  const auto value = GetProperty(env, obj, key.data());
99
96
  bool result;
@@ -104,12 +101,12 @@ static bool BooleanProperty (napi_env env, napi_value obj, const std::string& ke
104
101
  return defaultValue;
105
102
  }
106
103
 
107
- static bool EncodingIsBuffer (napi_env env, napi_value obj, const std::string& option) {
104
+ static bool EncodingIsBuffer(napi_env env, napi_value obj, const std::string_view& option) {
108
105
  napi_value value;
109
106
  size_t size;
110
107
 
111
108
  if (napi_get_named_property(env, obj, option.data(), &value) == napi_ok &&
112
- napi_get_value_string_utf8(env, value, nullptr, 0, &size) == napi_ok) {
109
+ napi_get_value_string_utf8(env, value, nullptr, 0, &size) == napi_ok) {
113
110
  // Value is either "buffer" or "utf8" so we can tell them apart just by size
114
111
  return size == 6;
115
112
  }
@@ -117,8 +114,7 @@ static bool EncodingIsBuffer (napi_env env, napi_value obj, const std::string& o
117
114
  return false;
118
115
  }
119
116
 
120
- static uint32_t Uint32Property (napi_env env, napi_value obj, const std::string& key,
121
- uint32_t defaultValue) {
117
+ static uint32_t Uint32Property(napi_env env, napi_value obj, const std::string_view& key, uint32_t defaultValue) {
122
118
  if (HasProperty(env, obj, key.data())) {
123
119
  const auto value = GetProperty(env, obj, key.data());
124
120
  uint32_t result;
@@ -129,8 +125,7 @@ static uint32_t Uint32Property (napi_env env, napi_value obj, const std::string&
129
125
  return defaultValue;
130
126
  }
131
127
 
132
- static int Int32Property (napi_env env, napi_value obj, const std::string& key,
133
- int defaultValue) {
128
+ static int Int32Property(napi_env env, napi_value obj, const std::string_view& key, int defaultValue) {
134
129
  if (HasProperty(env, obj, key.data())) {
135
130
  const auto value = GetProperty(env, obj, key.data());
136
131
  int result;
@@ -141,24 +136,27 @@ static int Int32Property (napi_env env, napi_value obj, const std::string& key,
141
136
  return defaultValue;
142
137
  }
143
138
 
144
- static std::string ToString (napi_env env, napi_value from, const std::string& defaultValue = "") {
139
+ static std::string ToString(napi_env env, napi_value from, const std::string& defaultValue = "") {
145
140
  if (IsString(env, from)) {
146
141
  size_t length = 0;
147
142
  napi_get_value_string_utf8(env, from, nullptr, 0, &length);
148
143
  std::string value(length, '\0');
149
- napi_get_value_string_utf8( env, from, &value[0], value.length() + 1, &length);
144
+ napi_get_value_string_utf8(env, from, &value[0], value.length() + 1, &length);
150
145
  return value;
151
146
  } else if (IsBuffer(env, from)) {
152
147
  char* buf = nullptr;
153
148
  size_t length = 0;
154
- napi_get_buffer_info(env, from, reinterpret_cast<void **>(&buf), &length);
149
+ napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length);
155
150
  return std::string(buf, length);
156
151
  }
157
152
 
158
153
  return defaultValue;
159
154
  }
160
155
 
161
- static std::string StringProperty (napi_env env, napi_value obj, const std::string& key, const std::string& defaultValue = "") {
156
+ static std::string StringProperty(napi_env env,
157
+ napi_value obj,
158
+ const std::string_view& key,
159
+ const std::string& defaultValue = "") {
162
160
  if (HasProperty(env, obj, key)) {
163
161
  napi_value value = GetProperty(env, obj, key);
164
162
  if (IsString(env, value)) {
@@ -169,59 +167,62 @@ static std::string StringProperty (napi_env env, napi_value obj, const std::stri
169
167
  return defaultValue;
170
168
  }
171
169
 
172
- static size_t StringOrBufferLength (napi_env env, napi_value value) {
170
+ static size_t StringOrBufferLength(napi_env env, napi_value value) {
173
171
  size_t size = 0;
174
172
 
175
173
  if (IsString(env, value)) {
176
174
  napi_get_value_string_utf8(env, value, nullptr, 0, &size);
177
175
  } else if (IsBuffer(env, value)) {
178
176
  char* buf = nullptr;
179
- napi_get_buffer_info(env, value, (void **)&buf, &size);
177
+ napi_get_buffer_info(env, value, (void**)&buf, &size);
180
178
  }
181
179
 
182
180
  return size;
183
181
  }
184
182
 
185
- static std::string* RangeOption (napi_env env, napi_value opts, const std::string& name) {
183
+ static std::optional<std::string> RangeOption(napi_env env, napi_value opts, const std::string_view& name) {
186
184
  if (HasProperty(env, opts, name)) {
187
185
  const auto value = GetProperty(env, opts, name);
188
- return new std::string(ToString(env, value));
186
+ return ToString(env, value);
189
187
  }
190
188
 
191
- return nullptr;
189
+ return {};
192
190
  }
193
191
 
194
- static std::vector<std::string> KeyArray (napi_env env, napi_value arr) {
195
- uint32_t length;
196
- std::vector<std::string> result;
192
+ static napi_status CallFunction(napi_env env, napi_value callback, const int argc, napi_value* argv) {
193
+ napi_value global;
194
+ napi_get_global(env, &global);
195
+ return napi_call_function(env, global, callback, argc, argv, nullptr);
196
+ }
197
197
 
198
- if (napi_get_array_length(env, arr, &length) == napi_ok) {
199
- result.reserve(length);
198
+ static napi_value ToError(napi_env env, const rocksdb::Status& status) {
199
+ if (status.ok()) {
200
+ return 0;
201
+ }
200
202
 
201
- for (uint32_t i = 0; i < length; i++) {
202
- napi_value element;
203
+ const auto msg = status.ToString();
203
204
 
204
- if (napi_get_element(env, arr, i, &element) == napi_ok &&
205
- StringOrBufferLength(env, element) > 0) {
206
- result.push_back(ToString(env, element));
207
- }
205
+ if (status.IsNotFound()) {
206
+ return CreateCodeError(env, "LEVEL_NOT_FOUND", msg);
207
+ } else if (status.IsCorruption()) {
208
+ return CreateCodeError(env, "LEVEL_CORRUPTION", msg);
209
+ } else if (status.IsIOError()) {
210
+ if (msg.find("IO error: lock ") != std::string::npos) { // env_posix.cc
211
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
212
+ } else if (msg.find("IO error: LockFile ") != std::string::npos) { // env_win.cc
213
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
214
+ } else if (msg.find("IO error: While lock file") != std::string::npos) { // env_mac.cc
215
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
216
+ } else {
217
+ return CreateCodeError(env, "LEVEL_IO_ERROR", msg);
208
218
  }
209
219
  }
210
220
 
211
- return result;
212
- }
213
-
214
- static napi_status CallFunction (napi_env env,
215
- napi_value callback,
216
- const int argc,
217
- napi_value* argv) {
218
- napi_value global;
219
- napi_get_global(env, &global);
220
- return napi_call_function(env, global, callback, argc, argv, nullptr);
221
+ return CreateError(env, msg);
221
222
  }
222
223
 
223
224
  template <typename T>
224
- void Convert (napi_env env, const T& s, bool asBuffer, napi_value& result) {
225
+ void Convert(napi_env env, const T& s, bool asBuffer, napi_value& result) {
225
226
  if (asBuffer) {
226
227
  napi_create_buffer_copy(env, s.size(), s.data(), nullptr, &result);
227
228
  } else {
@@ -229,132 +230,101 @@ void Convert (napi_env env, const T& s, bool asBuffer, napi_value& result) {
229
230
  }
230
231
  }
231
232
 
233
+ struct NapiSlice : public rocksdb::Slice {
234
+ NapiSlice(napi_env env, napi_value from) {
235
+ if (IsString(env, from)) {
236
+ napi_get_value_string_utf8(env, from, nullptr, 0, &size_);
237
+ char* data;
238
+ if (size_ + 1 < stack_.size()) {
239
+ data = stack_.data();
240
+ } else {
241
+ heap_.reset(new char[size_ + 1]);
242
+ data = heap_.get();
243
+ }
244
+ data[size_] = 0;
245
+ napi_get_value_string_utf8(env, from, data, size_ + 1, &size_);
246
+ data_ = data;
247
+ } else if (IsBuffer(env, from)) {
248
+ void* data;
249
+ napi_get_buffer_info(env, from, &data, &size_);
250
+ data_ = static_cast<char*>(data);
251
+ }
252
+ }
253
+
254
+ std::unique_ptr<char[]> heap_;
255
+ std::array<char, 8192> stack_;
256
+ };
257
+
232
258
  /**
233
259
  * Base worker class. Handles the async work. Derived classes can override the
234
260
  * following virtual methods (listed in the order in which they're called):
235
261
  *
236
- * - DoExecute (abstract, worker pool thread): main work
237
- * - HandleOKCallback (main thread): call JS callback on success
238
- * - HandleErrorCallback (main thread): call JS callback on error
239
- * - DoFinally (main thread): do cleanup regardless of success
262
+ * - Execute (abstract, worker pool thread): main work
263
+ * - OnOk (main thread): call JS callback on success
264
+ * - OnError (main thread): call JS callback on error
265
+ * - Destroy (main thread): do cleanup regardless of success
240
266
  */
241
- struct BaseWorker {
242
- // Note: storing env is discouraged as we'd end up using it in unsafe places.
243
- BaseWorker (napi_env env,
244
- Database* database,
245
- napi_value callback,
246
- const char* resourceName)
247
- : database_(database) {
267
+ struct Worker {
268
+ Worker(napi_env env, Database* database, napi_value callback, const std::string& resourceName)
269
+ : database_(database) {
248
270
  NAPI_STATUS_THROWS_VOID(napi_create_reference(env, callback, 1, &callbackRef_));
249
271
  napi_value asyncResourceName;
250
- NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env, resourceName,
251
- NAPI_AUTO_LENGTH,
252
- &asyncResourceName));
253
- NAPI_STATUS_THROWS_VOID(napi_create_async_work(env, callback,
254
- asyncResourceName,
255
- BaseWorker::Execute,
256
- BaseWorker::Complete,
257
- this, &asyncWork_));
272
+ NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env, resourceName.data(), resourceName.size(), &asyncResourceName));
273
+ NAPI_STATUS_THROWS_VOID(napi_create_async_work(env, callback, asyncResourceName, Worker::Execute,
274
+ Worker::Complete, this, &asyncWork_));
258
275
  }
259
276
 
260
- virtual ~BaseWorker () {}
261
-
262
- static void Execute (napi_env env, void* data) {
263
- auto self = reinterpret_cast<BaseWorker*>(data);
277
+ virtual ~Worker() {}
264
278
 
265
- // Don't pass env to DoExecute() because use of Node-API
266
- // methods should generally be avoided in async work.
267
- self->DoExecute();
279
+ static void Execute(napi_env env, void* data) {
280
+ auto self = reinterpret_cast<Worker*>(data);
281
+ self->status_ = self->Execute(*self->database_);
268
282
  }
269
283
 
270
- bool SetStatus (const rocksdb::Status& status) {
271
- status_ = status;
272
- return status.ok();
273
- }
274
-
275
- virtual void DoExecute () = 0;
276
-
277
- static void Complete (napi_env env, napi_status status, void* data) {
278
- auto self = reinterpret_cast<BaseWorker*>(data);
284
+ static void Complete(napi_env env, napi_status status, void* data) {
285
+ auto self = reinterpret_cast<Worker*>(data);
279
286
 
280
- self->DoComplete(env);
281
- self->DoFinally(env);
282
- }
283
-
284
- void DoComplete (napi_env env) {
285
287
  napi_value callback;
286
- napi_get_reference_value(env, callbackRef_, &callback);
288
+ napi_get_reference_value(env, self->callbackRef_, &callback);
287
289
 
288
- if (status_.ok()) {
289
- HandleOKCallback(env, callback);
290
+ if (self->status_.ok()) {
291
+ self->OnOk(env, callback);
290
292
  } else {
291
- HandleErrorCallback(env, callback);
293
+ self->OnError(env, callback, ToError(env, self->status_));
292
294
  }
293
- }
294
295
 
295
- virtual void HandleOKCallback (napi_env env, napi_value callback) {
296
- napi_value argv;
297
- napi_get_null(env, &argv);
298
- CallFunction(env, callback, 1, &argv);
299
- }
296
+ self->Destroy(env);
300
297
 
301
- virtual void HandleErrorCallback (napi_env env, napi_value callback) {
302
- napi_value argv;
298
+ napi_delete_reference(env, self->callbackRef_);
299
+ napi_delete_async_work(env, self->asyncWork_);
303
300
 
304
- const auto msg = status_.ToString();
305
-
306
- if (status_.IsNotFound()) {
307
- argv = CreateCodeError(env, "LEVEL_NOT_FOUND", msg);
308
- } else if (status_.IsCorruption()) {
309
- argv = CreateCodeError(env, "LEVEL_CORRUPTION", msg);
310
- } else if (status_.IsIOError()) {
311
- if (msg.find("IO error: lock ") != std::string::npos) { // env_posix.cc
312
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
313
- } else if (msg.find("IO error: LockFile ") != std::string::npos) { // env_win.cc
314
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
315
- } else if (msg.find("IO error: While lock file") != std::string::npos) { // env_mac.cc
316
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
317
- } else {
318
- argv = CreateCodeError(env, "LEVEL_IO_ERROR", msg);
319
- }
320
- } else {
321
- argv = CreateError(env, msg);
322
- }
301
+ delete self;
302
+ }
303
+
304
+ virtual rocksdb::Status Execute(Database& database) = 0;
323
305
 
306
+ virtual void OnOk(napi_env env, napi_value callback) {
307
+ napi_value argv;
308
+ napi_get_null(env, &argv);
324
309
  CallFunction(env, callback, 1, &argv);
325
310
  }
326
311
 
327
- virtual void DoFinally (napi_env env) {
328
- napi_delete_reference(env, callbackRef_);
329
- napi_delete_async_work(env, asyncWork_);
312
+ virtual void OnError(napi_env env, napi_value callback, napi_value err) { CallFunction(env, callback, 1, &err); }
330
313
 
331
- delete this;
332
- }
314
+ virtual void Destroy(napi_env env) {}
333
315
 
334
- void Queue (napi_env env) {
335
- napi_queue_async_work(env, asyncWork_);
336
- }
316
+ void Queue(napi_env env) { napi_queue_async_work(env, asyncWork_); }
337
317
 
338
318
  Database* database_;
339
319
 
340
- private:
320
+ private:
341
321
  napi_ref callbackRef_;
342
322
  napi_async_work asyncWork_;
343
323
  rocksdb::Status status_;
344
324
  };
345
325
 
346
- /**
347
- * Owns the LevelDB storage, cache, filter policy and iterators.
348
- */
349
326
  struct Database {
350
- Database ()
351
- : pendingCloseWorker_(nullptr),
352
- ref_(nullptr),
353
- priorityWork_(0) {}
354
-
355
- rocksdb::Status Open (const rocksdb::Options& options,
356
- const bool readOnly,
357
- const char* location) {
327
+ rocksdb::Status Open(const rocksdb::Options& options, const bool readOnly, const char* location) {
358
328
  if (readOnly) {
359
329
  rocksdb::DB* db = nullptr;
360
330
  const auto status = rocksdb::DB::OpenForReadOnly(options, location, &db);
@@ -368,76 +338,20 @@ struct Database {
368
338
  }
369
339
  }
370
340
 
371
- void CloseDatabase () {
372
- db_.reset();
373
- }
374
-
375
- rocksdb::Status Put (const rocksdb::WriteOptions& options,
376
- const std::string& key,
377
- const std::string& value) {
378
- return db_->Put(options, db_->DefaultColumnFamily(), key, value);
379
- }
380
-
381
- rocksdb::Status Get (const rocksdb::ReadOptions& options,
382
- const std::string& key,
383
- rocksdb::PinnableSlice& value) {
384
- return db_->Get(options, db_->DefaultColumnFamily(), key, &value);
385
- }
386
-
387
- rocksdb::Status Del (const rocksdb::WriteOptions& options,
388
- const std::string& key) {
389
- return db_->Delete(options, db_->DefaultColumnFamily(), key);
390
- }
391
-
392
- rocksdb::Status WriteBatch (const rocksdb::WriteOptions& options,
393
- rocksdb::WriteBatch* batch) {
394
- return db_->Write(options, batch);
395
- }
396
-
397
- uint64_t ApproximateSize (const rocksdb::Range* range) {
398
- uint64_t size = 0;
399
- db_->GetApproximateSizes(range, 1, &size);
400
- return size;
401
- }
402
-
403
- void CompactRange (const rocksdb::Slice* start,
404
- const rocksdb::Slice* end) {
405
- rocksdb::CompactRangeOptions options;
406
- db_->CompactRange(options, start, end);
407
- }
408
-
409
- void GetProperty (const std::string& property, std::string& value) {
410
- db_->GetProperty(property, &value);
411
- }
412
-
413
- const rocksdb::Snapshot* NewSnapshot () {
414
- return db_->GetSnapshot();
415
- }
416
-
417
- rocksdb::Iterator* NewIterator (const rocksdb::ReadOptions& options) {
418
- return db_->NewIterator(options);
419
- }
420
-
421
- void ReleaseSnapshot (const rocksdb::Snapshot* snapshot) {
422
- return db_->ReleaseSnapshot(snapshot);
423
- }
424
-
425
- void AttachIterator (napi_env env, Iterator* iterator) {
341
+ void AttachIterator(napi_env env, Iterator* iterator) {
426
342
  iterators_.insert(iterator);
427
343
  IncrementPriorityWork(env);
428
344
  }
429
345
 
430
- void DetachIterator (napi_env env, Iterator* iterator) {
346
+ void DetachIterator(napi_env env, Iterator* iterator) {
431
347
  iterators_.erase(iterator);
432
348
  DecrementPriorityWork(env);
433
349
  }
434
350
 
435
- void IncrementPriorityWork (napi_env env) {
436
- napi_reference_ref(env, ref_, &priorityWork_);
437
- }
351
+ void IncrementPriorityWork(napi_env env) { napi_reference_ref(env, prioritRef_, &priorityWork_); }
438
352
 
439
- void DecrementPriorityWork (napi_env env) {
440
- napi_reference_unref(env, ref_, &priorityWork_);
353
+ void DecrementPriorityWork(napi_env env) {
354
+ napi_reference_unref(env, prioritRef_, &priorityWork_);
441
355
 
442
356
  if (priorityWork_ == 0 && pendingCloseWorker_) {
443
357
  pendingCloseWorker_->Queue(env);
@@ -445,290 +359,149 @@ struct Database {
445
359
  }
446
360
  }
447
361
 
448
- bool HasPriorityWork () const {
449
- return priorityWork_ > 0;
450
- }
362
+ bool HasPriorityWork() const { return priorityWork_ > 0; }
451
363
 
452
364
  std::unique_ptr<rocksdb::DB> db_;
453
- BaseWorker* pendingCloseWorker_;
365
+ Worker* pendingCloseWorker_;
454
366
  std::set<Iterator*> iterators_;
455
- napi_ref ref_;
367
+ napi_ref prioritRef_;
456
368
 
457
- private:
458
- uint32_t priorityWork_;
459
- };
460
-
461
- /**
462
- * Base worker class for doing async work that defers closing the database.
463
- */
464
- struct PriorityWorker : public BaseWorker {
465
- PriorityWorker (napi_env env, Database* database, napi_value callback, const char* resourceName)
466
- : BaseWorker(env, database, callback, resourceName) {
467
- database_->IncrementPriorityWork(env);
468
- }
469
-
470
- virtual ~PriorityWorker () {}
471
-
472
- void DoFinally (napi_env env) override {
473
- database_->DecrementPriorityWork(env);
474
- BaseWorker::DoFinally(env);
475
- }
369
+ private:
370
+ uint32_t priorityWork_ = 0;
476
371
  };
477
372
 
478
373
  struct BaseIterator {
479
374
  BaseIterator(Database* database,
480
375
  const bool reverse,
481
- const std::string* lt,
482
- const std::string* lte,
483
- const std::string* gt,
484
- const std::string* gte,
376
+ const std::optional<std::string>& lt,
377
+ const std::optional<std::string>& lte,
378
+ const std::optional<std::string>& gt,
379
+ const std::optional<std::string>& gte,
485
380
  const int limit,
486
381
  const bool fillCache)
487
- : database_(database),
488
- snapshot_(database->NewSnapshot()),
489
- dbIterator_(database->NewIterator([&]{
490
- rocksdb::ReadOptions options;
491
- options.fill_cache = fillCache;
492
- options.verify_checksums = false;
493
- options.snapshot = snapshot_;
494
- return options;
495
- }())),
496
- didSeek_(false),
497
- reverse_(reverse),
498
- lt_(lt),
499
- lte_(lte),
500
- gt_(gt),
501
- gte_(gte),
502
- limit_(limit),
503
- count_(0) {
504
- }
505
-
506
- virtual ~BaseIterator () {
507
- assert(!dbIterator_);
508
-
509
- delete lt_;
510
- delete lte_;
511
- delete gt_;
512
- delete gte_;
513
- }
514
-
515
- bool DidSeek () const {
516
- return didSeek_;
517
- }
518
-
519
- /**
520
- * Seek to the first relevant key based on range options.
521
- */
522
- void SeekToRange () {
382
+ : database_(database),
383
+ lt_(!lte ? lt : *lte + '\0'),
384
+ gte_(gte ? gte : (gt ? std::optional<std::string>(*gt + '\0') : std::nullopt)),
385
+ snapshot_(database_->db_->GetSnapshot(),
386
+ [this](const rocksdb::Snapshot* ptr) { database_->db_->ReleaseSnapshot(ptr); }),
387
+ iterator_(database->db_->NewIterator([&] {
388
+ rocksdb::ReadOptions options;
389
+ if (lt_) {
390
+ upper_bound_ = rocksdb::Slice(lt_->data(), lt_->size());
391
+ options.iterate_upper_bound = &upper_bound_;
392
+ }
393
+ if (gte_) {
394
+ lower_bound_ = rocksdb::Slice(gte_->data(), gte_->size());
395
+ options.iterate_lower_bound = &lower_bound_;
396
+ }
397
+ options.fill_cache = fillCache;
398
+ options.snapshot = snapshot_.get();
399
+ return options;
400
+ }())),
401
+ reverse_(reverse),
402
+ limit_(limit) {}
403
+
404
+ virtual ~BaseIterator() { assert(!iterator_); }
405
+
406
+ bool DidSeek() const { return didSeek_; }
407
+
408
+ void SeekToRange() {
523
409
  didSeek_ = true;
524
410
 
525
- if (!reverse_ && gte_) {
526
- dbIterator_->Seek(*gte_);
527
- } else if (!reverse_ && gt_) {
528
- dbIterator_->Seek(*gt_);
529
-
530
- if (dbIterator_->Valid() && dbIterator_->key().compare(*gt_) == 0) {
531
- dbIterator_->Next();
532
- }
533
- } else if (reverse_ && lte_) {
534
- dbIterator_->Seek(*lte_);
535
-
536
- if (!dbIterator_->Valid()) {
537
- dbIterator_->SeekToLast();
538
- } else if (dbIterator_->key().compare(*lte_) > 0) {
539
- dbIterator_->Prev();
540
- }
541
- } else if (reverse_ && lt_) {
542
- dbIterator_->Seek(*lt_);
543
-
544
- if (!dbIterator_->Valid()) {
545
- dbIterator_->SeekToLast();
546
- } else if (dbIterator_->key().compare(*lt_) >= 0) {
547
- dbIterator_->Prev();
548
- }
549
- } else if (reverse_) {
550
- dbIterator_->SeekToLast();
411
+ if (reverse_) {
412
+ iterator_->SeekToLast();
551
413
  } else {
552
- dbIterator_->SeekToFirst();
414
+ iterator_->SeekToFirst();
553
415
  }
554
416
  }
555
417
 
556
- /**
557
- * Seek manually (during iteration).
558
- */
559
- void Seek (const std::string& target) {
418
+ void Seek(const std::string& target) {
560
419
  didSeek_ = true;
561
420
 
562
- if (OutOfRange(target)) {
563
- return SeekToEnd();
564
- }
565
-
566
- dbIterator_->Seek(target);
567
-
568
- if (dbIterator_->Valid()) {
569
- const auto cmp = dbIterator_->key().compare(target);
570
- if (reverse_ ? cmp > 0 : cmp < 0) {
571
- Next();
421
+ if ((lt_ && target.compare(*lt_) >= 0) || (gte_ && target.compare(*gte_) < 0)) {
422
+ // TODO (fix): Why is this required? Seek should handle it?
423
+ // https://github.com/facebook/rocksdb/issues/9904
424
+ iterator_->SeekToLast();
425
+ if (iterator_->Valid()) {
426
+ iterator_->Next();
572
427
  }
428
+ } else if (reverse_) {
429
+ iterator_->SeekForPrev(target);
573
430
  } else {
574
- SeekToFirst();
575
- if (dbIterator_->Valid()) {
576
- const auto cmp = dbIterator_->key().compare(target);
577
- if (reverse_ ? cmp > 0 : cmp < 0) {
578
- SeekToEnd();
579
- }
580
- }
581
- }
582
- }
583
-
584
- void Close () {
585
- if (dbIterator_) {
586
- delete dbIterator_;
587
- dbIterator_ = nullptr;
588
- database_->ReleaseSnapshot(snapshot_);
431
+ iterator_->Seek(target);
589
432
  }
590
433
  }
591
434
 
592
- bool Valid () const {
593
- return dbIterator_->Valid() && !OutOfRange(dbIterator_->key());
594
- }
595
-
596
- bool Increment () {
597
- return limit_ < 0 || ++count_ <= limit_;
598
- }
599
-
600
- void Next () {
601
- if (reverse_) dbIterator_->Prev();
602
- else dbIterator_->Next();
435
+ void Close() {
436
+ snapshot_.reset();
437
+ iterator_.reset();
603
438
  }
604
439
 
605
- void SeekToFirst () {
606
- if (reverse_) dbIterator_->SeekToLast();
607
- else dbIterator_->SeekToFirst();
608
- }
609
-
610
- void SeekToLast () {
611
- if (reverse_) dbIterator_->SeekToFirst();
612
- else dbIterator_->SeekToLast();
613
- }
614
-
615
- void SeekToEnd () {
616
- SeekToLast();
617
- Next();
618
- }
619
-
620
- rocksdb::Slice CurrentKey () const {
621
- return dbIterator_->key();
622
- }
440
+ bool Valid() const { return iterator_->Valid(); }
623
441
 
624
- rocksdb::Slice CurrentValue () const {
625
- return dbIterator_->value();
626
- }
442
+ bool Increment() { return limit_ < 0 || ++count_ <= limit_; }
627
443
 
628
- rocksdb::Status Status () const {
629
- return dbIterator_->status();
444
+ void Next() {
445
+ if (reverse_)
446
+ iterator_->Prev();
447
+ else
448
+ iterator_->Next();
630
449
  }
631
450
 
632
- bool OutOfRange (const rocksdb::Slice& target) const {
633
- if (lte_) {
634
- if (target.compare(*lte_) > 0) return true;
635
- } else if (lt_) {
636
- if (target.compare(*lt_) >= 0) return true;
637
- }
451
+ rocksdb::Slice CurrentKey() const { return iterator_->key(); }
638
452
 
639
- if (gte_) {
640
- if (target.compare(*gte_) < 0) return true;
641
- } else if (gt_) {
642
- if (target.compare(*gt_) <= 0) return true;
643
- }
453
+ rocksdb::Slice CurrentValue() const { return iterator_->value(); }
644
454
 
645
- return false;
646
- }
455
+ rocksdb::Status Status() const { return iterator_->status(); }
647
456
 
648
457
  Database* database_;
649
458
 
650
- private:
651
- const rocksdb::Snapshot* snapshot_;
652
- rocksdb::Iterator* dbIterator_;
653
- bool didSeek_;
459
+ private:
460
+ const std::optional<std::string> lt_;
461
+ const std::optional<std::string> gte_;
462
+ rocksdb::Slice lower_bound_;
463
+ rocksdb::Slice upper_bound_;
464
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
465
+ std::unique_ptr<rocksdb::Iterator> iterator_;
466
+ bool didSeek_ = false;
654
467
  const bool reverse_;
655
- const std::string* lt_;
656
- const std::string* lte_;
657
- const std::string* gt_;
658
- const std::string* gte_;
659
468
  const int limit_;
660
- int count_;
469
+ int count_ = 0;
661
470
  };
662
471
 
663
472
  struct Iterator final : public BaseIterator {
664
- Iterator (Database* database,
665
- const bool reverse,
666
- const bool keys,
667
- const bool values,
668
- const int limit,
669
- const std::string* lt,
670
- const std::string* lte,
671
- const std::string* gt,
672
- const std::string* gte,
673
- const bool fillCache,
674
- const bool keyAsBuffer,
675
- const bool valueAsBuffer,
676
- const uint32_t highWaterMarkBytes)
677
- : BaseIterator(database, reverse, lt, lte, gt, gte, limit, fillCache),
678
- keys_(keys),
679
- values_(values),
680
- keyAsBuffer_(keyAsBuffer),
681
- valueAsBuffer_(valueAsBuffer),
682
- highWaterMarkBytes_(highWaterMarkBytes),
683
- first_(true),
684
- ref_(nullptr) {
685
- }
686
-
687
- void Attach (napi_env env, napi_value context) {
473
+ Iterator(Database* database,
474
+ const bool reverse,
475
+ const bool keys,
476
+ const bool values,
477
+ const int limit,
478
+ const std::optional<std::string>& lt,
479
+ const std::optional<std::string>& lte,
480
+ const std::optional<std::string>& gt,
481
+ const std::optional<std::string>& gte,
482
+ const bool fillCache,
483
+ const bool keyAsBuffer,
484
+ const bool valueAsBuffer,
485
+ const uint32_t highWaterMarkBytes)
486
+ : BaseIterator(database, reverse, lt, lte, gt, gte, limit, fillCache),
487
+ keys_(keys),
488
+ values_(values),
489
+ keyAsBuffer_(keyAsBuffer),
490
+ valueAsBuffer_(valueAsBuffer),
491
+ highWaterMarkBytes_(highWaterMarkBytes),
492
+ first_(true),
493
+ ref_(nullptr) {}
494
+
495
+ void Attach(napi_env env, napi_value context) {
688
496
  napi_create_reference(env, context, 1, &ref_);
689
497
  database_->AttachIterator(env, this);
690
498
  }
691
499
 
692
- void Detach (napi_env env) {
500
+ void Detach(napi_env env) {
693
501
  database_->DetachIterator(env, this);
694
- if (ref_) napi_delete_reference(env, ref_);
695
- }
696
-
697
- bool ReadMany (uint32_t size) {
698
- cache_.clear();
699
- cache_.reserve(size * 2);
700
- size_t bytesRead = 0;
701
-
702
- while (true) {
703
- if (!first_) Next();
704
- else first_ = false;
705
-
706
- if (!Valid() || !Increment()) break;
707
-
708
- if (keys_ && values_) {
709
- auto k = CurrentKey();
710
- auto v = CurrentValue();
711
- cache_.emplace_back(k.data(), k.size());
712
- cache_.emplace_back(v.data(), v.size());
713
- bytesRead += k.size() + v.size();
714
- } else if (keys_) {
715
- auto k = CurrentKey();
716
- cache_.emplace_back(k.data(), k.size());
717
- cache_.push_back({});
718
- bytesRead += k.size();
719
- } else if (values_) {
720
- auto v = CurrentValue();
721
- cache_.push_back({});
722
- cache_.emplace_back(v.data(), v.size());
723
- bytesRead += v.size();
724
- }
725
-
726
- if (bytesRead > highWaterMarkBytes_ || cache_.size() / 2 >= size) {
727
- return true;
728
- }
502
+ if (ref_) {
503
+ napi_delete_reference(env, ref_);
729
504
  }
730
-
731
- return false;
732
505
  }
733
506
 
734
507
  const bool keys_;
@@ -737,9 +510,8 @@ struct Iterator final : public BaseIterator {
737
510
  const bool valueAsBuffer_;
738
511
  const uint32_t highWaterMarkBytes_;
739
512
  bool first_;
740
- std::vector<std::string> cache_;
741
513
 
742
- private:
514
+ private:
743
515
  napi_ref ref_;
744
516
  };
745
517
 
@@ -748,15 +520,16 @@ private:
748
520
  * already-scheduled napi_async_work items have finished, which gives us
749
521
  * the guarantee that no db operations will be in-flight at this time.
750
522
  */
751
- static void env_cleanup_hook (void* arg) {
523
+ static void env_cleanup_hook(void* arg) {
752
524
  auto database = reinterpret_cast<Database*>(arg);
753
525
 
754
- // Do everything that db_close() does but synchronously. We're expecting that GC
755
- // did not (yet) collect the database because that would be a user mistake (not
756
- // closing their db) made during the lifetime of the environment. That's different
757
- // from an environment being torn down (like the main process or a worker thread)
758
- // where it's our responsibility to clean up. Note also, the following code must
759
- // be a safe noop if called before db_open() or after db_close().
526
+ // Do everything that db_close() does but synchronously. We're expecting that
527
+ // GC did not (yet) collect the database because that would be a user mistake
528
+ // (not closing their db) made during the lifetime of the environment. That's
529
+ // different from an environment being torn down (like the main process or a
530
+ // worker thread) where it's our responsibility to clean up. Note also, the
531
+ // following code must be a safe noop if called before db_open() or after
532
+ // db_close().
760
533
  if (database && database->db_) {
761
534
  // TODO: does not do `napi_delete_reference(env, iterator->ref_)`. Problem?
762
535
  for (auto it : database->iterators_) {
@@ -764,15 +537,16 @@ static void env_cleanup_hook (void* arg) {
764
537
  }
765
538
 
766
539
  // Having closed the iterators (and released snapshots) we can safely close.
767
- database->CloseDatabase();
540
+ database->db_->Close();
768
541
  }
769
542
  }
770
543
 
771
- static void FinalizeDatabase (napi_env env, void* data, void* hint) {
544
+ static void FinalizeDatabase(napi_env env, void* data, void* hint) {
772
545
  if (data) {
773
546
  auto database = reinterpret_cast<Database*>(data);
774
547
  napi_remove_env_cleanup_hook(env, env_cleanup_hook, database);
775
- if (database->ref_) napi_delete_reference(env, database->ref_);
548
+ if (database->prioritRef_)
549
+ napi_delete_reference(env, database->prioritRef_);
776
550
  delete database;
777
551
  }
778
552
  }
@@ -782,55 +556,55 @@ NAPI_METHOD(db_init) {
782
556
  napi_add_env_cleanup_hook(env, env_cleanup_hook, database);
783
557
 
784
558
  napi_value result;
785
- NAPI_STATUS_THROWS(napi_create_external(env, database,
786
- FinalizeDatabase,
787
- nullptr, &result));
559
+ NAPI_STATUS_THROWS(napi_create_external(env, database, FinalizeDatabase, nullptr, &result));
788
560
 
789
- // Reference counter to prevent GC of database while priority workers are active
790
- NAPI_STATUS_THROWS(napi_create_reference(env, result, 0, &database->ref_));
561
+ NAPI_STATUS_THROWS(napi_create_reference(env, result, 0, &database->prioritRef_));
791
562
 
792
563
  return result;
793
564
  }
794
565
 
795
- struct OpenWorker final : public PriorityWorker {
796
- OpenWorker (napi_env env,
797
- Database* database,
798
- napi_value callback,
799
- const std::string& location,
800
- const bool createIfMissing,
801
- const bool errorIfExists,
802
- const bool compression,
803
- const uint32_t writeBufferSize,
804
- const uint32_t blockSize,
805
- const uint32_t maxOpenFiles,
806
- const uint32_t blockRestartInterval,
807
- const uint32_t maxFileSize,
808
- const uint32_t cacheSize,
809
- const std::string& infoLogLevel,
810
- const bool readOnly)
811
- : PriorityWorker(env, database, callback, "leveldown.db.open"),
812
- readOnly_(readOnly),
813
- location_(location) {
566
+ struct OpenWorker final : public Worker {
567
+ OpenWorker(napi_env env,
568
+ Database* database,
569
+ napi_value callback,
570
+ const std::string& location,
571
+ const bool createIfMissing,
572
+ const bool errorIfExists,
573
+ const bool compression,
574
+ const uint32_t writeBufferSize,
575
+ const uint32_t blockSize,
576
+ const uint32_t maxOpenFiles,
577
+ const uint32_t blockRestartInterval,
578
+ const uint32_t maxFileSize,
579
+ const uint32_t cacheSize,
580
+ const std::string& infoLogLevel,
581
+ const bool readOnly)
582
+ : Worker(env, database, callback, "leveldown.db.open"), readOnly_(readOnly), location_(location) {
814
583
  options_.create_if_missing = createIfMissing;
815
584
  options_.error_if_exists = errorIfExists;
816
- options_.compression = compression
817
- ? rocksdb::kSnappyCompression
818
- : rocksdb::kNoCompression;
585
+ options_.compression = compression ? rocksdb::kSnappyCompression : rocksdb::kNoCompression;
819
586
  options_.write_buffer_size = writeBufferSize;
820
587
  options_.max_open_files = maxOpenFiles;
821
588
  options_.max_log_file_size = maxFileSize;
822
- options_.paranoid_checks = false;
589
+ options_.use_adaptive_mutex = true;
823
590
 
824
591
  if (infoLogLevel.size() > 0) {
825
592
  rocksdb::InfoLogLevel lvl = {};
826
593
 
827
- if (infoLogLevel == "debug") lvl = rocksdb::InfoLogLevel::DEBUG_LEVEL;
828
- else if (infoLogLevel == "info") lvl = rocksdb::InfoLogLevel::INFO_LEVEL;
829
- else if (infoLogLevel == "warn") lvl = rocksdb::InfoLogLevel::WARN_LEVEL;
830
- else if (infoLogLevel == "error") lvl = rocksdb::InfoLogLevel::ERROR_LEVEL;
831
- else if (infoLogLevel == "fatal") lvl = rocksdb::InfoLogLevel::FATAL_LEVEL;
832
- else if (infoLogLevel == "header") lvl = rocksdb::InfoLogLevel::HEADER_LEVEL;
833
- else napi_throw_error(env, nullptr, "invalid log level");
594
+ if (infoLogLevel == "debug")
595
+ lvl = rocksdb::InfoLogLevel::DEBUG_LEVEL;
596
+ else if (infoLogLevel == "info")
597
+ lvl = rocksdb::InfoLogLevel::INFO_LEVEL;
598
+ else if (infoLogLevel == "warn")
599
+ lvl = rocksdb::InfoLogLevel::WARN_LEVEL;
600
+ else if (infoLogLevel == "error")
601
+ lvl = rocksdb::InfoLogLevel::ERROR_LEVEL;
602
+ else if (infoLogLevel == "fatal")
603
+ lvl = rocksdb::InfoLogLevel::FATAL_LEVEL;
604
+ else if (infoLogLevel == "header")
605
+ lvl = rocksdb::InfoLogLevel::HEADER_LEVEL;
606
+ else
607
+ napi_throw_error(env, nullptr, "invalid log level");
834
608
 
835
609
  options_.info_log_level = lvl;
836
610
  } else {
@@ -854,14 +628,10 @@ struct OpenWorker final : public PriorityWorker {
854
628
  tableOptions.format_version = 5;
855
629
  tableOptions.checksum = rocksdb::kxxHash64;
856
630
 
857
- options_.table_factory.reset(
858
- rocksdb::NewBlockBasedTableFactory(tableOptions)
859
- );
631
+ options_.table_factory.reset(rocksdb::NewBlockBasedTableFactory(tableOptions));
860
632
  }
861
633
 
862
- void DoExecute () override {
863
- SetStatus(database_->Open(options_, readOnly_, location_.c_str()));
864
- }
634
+ rocksdb::Status Execute(Database& database) override { return database.Open(options_, readOnly_, location_.c_str()); }
865
635
 
866
636
  rocksdb::Options options_;
867
637
  const bool readOnly_;
@@ -882,38 +652,30 @@ NAPI_METHOD(db_open) {
882
652
  const auto infoLogLevel = StringProperty(env, options, "infoLogLevel");
883
653
 
884
654
  const auto cacheSize = Uint32Property(env, options, "cacheSize", 8 << 20);
885
- const auto writeBufferSize = Uint32Property(env, options , "writeBufferSize" , 4 << 20);
655
+ const auto writeBufferSize = Uint32Property(env, options, "writeBufferSize", 4 << 20);
886
656
  const auto blockSize = Uint32Property(env, options, "blockSize", 4096);
887
657
  const auto maxOpenFiles = Uint32Property(env, options, "maxOpenFiles", 1000);
888
- const auto blockRestartInterval = Uint32Property(env, options,
889
- "blockRestartInterval", 16);
658
+ const auto blockRestartInterval = Uint32Property(env, options, "blockRestartInterval", 16);
890
659
  const auto maxFileSize = Uint32Property(env, options, "maxFileSize", 2 << 20);
891
660
 
892
661
  const auto callback = argv[3];
893
662
 
894
- auto worker = new OpenWorker(env, database, callback, location,
895
- createIfMissing, errorIfExists,
896
- compression, writeBufferSize, blockSize,
897
- maxOpenFiles, blockRestartInterval,
898
- maxFileSize, cacheSize,
899
- infoLogLevel, readOnly);
663
+ auto worker =
664
+ new OpenWorker(env, database, callback, location, createIfMissing, errorIfExists, compression, writeBufferSize,
665
+ blockSize, maxOpenFiles, blockRestartInterval, maxFileSize, cacheSize, infoLogLevel, readOnly);
900
666
  worker->Queue(env);
901
667
 
902
668
  return 0;
903
669
  }
904
670
 
905
- struct CloseWorker final : public BaseWorker {
906
- CloseWorker (napi_env env,
907
- Database* database,
908
- napi_value callback)
909
- : BaseWorker(env, database, callback, "leveldown.db.close") {}
671
+ struct CloseWorker final : public Worker {
672
+ CloseWorker(napi_env env, Database* database, napi_value callback)
673
+ : Worker(env, database, callback, "leveldown.db.close") {}
910
674
 
911
- void DoExecute () override {
912
- database_->CloseDatabase();
913
- }
675
+ rocksdb::Status Execute(Database& database) override { return database.db_->Close(); }
914
676
  };
915
677
 
916
- napi_value noop_callback (napi_env env, napi_callback_info info) {
678
+ napi_value noop_callback(napi_env env, napi_callback_info info) {
917
679
  return 0;
918
680
  }
919
681
 
@@ -934,72 +696,62 @@ NAPI_METHOD(db_close) {
934
696
  return 0;
935
697
  }
936
698
 
937
- struct PutWorker final : public PriorityWorker {
938
- PutWorker (napi_env env,
939
- Database* database,
940
- napi_value callback,
941
- const std::string& key,
942
- const std::string& value,
943
- bool sync)
944
- : PriorityWorker(env, database, callback, "rocks_level.db.put"),
945
- key_(key), value_(value), sync_(sync) {
946
- }
947
-
948
- void DoExecute () override {
949
- rocksdb::WriteOptions options;
950
- options.sync = sync_;
951
- SetStatus(database_->Put(options, key_, value_));
952
- }
953
-
954
- const std::string key_;
955
- const std::string value_;
956
- const bool sync_;
957
- };
958
-
959
699
  NAPI_METHOD(db_put) {
960
- NAPI_ARGV(5);
700
+ NAPI_ARGV(4);
961
701
  NAPI_DB_CONTEXT();
962
702
 
963
703
  const auto key = ToString(env, argv[1]);
964
704
  const auto value = ToString(env, argv[2]);
965
- const auto sync = BooleanProperty(env, argv[3], "sync", false);
966
- const auto callback = argv[4];
967
705
 
968
- auto worker = new PutWorker(env, database, callback, key, value, sync);
969
- worker->Queue(env);
970
-
971
- return 0;
706
+ rocksdb::WriteOptions options;
707
+ return ToError(env, database->db_->Put(options, key, value));
972
708
  }
973
709
 
974
- struct GetWorker final : public PriorityWorker {
975
- GetWorker (napi_env env,
976
- Database* database,
977
- napi_value callback,
978
- const std::string& key,
979
- const bool asBuffer,
980
- const bool fillCache)
981
- : PriorityWorker(env, database, callback, "rocks_level.db.get"),
982
- key_(key), asBuffer_(asBuffer), fillCache_(fillCache) {
983
- }
984
-
985
- void DoExecute () override {
710
+ struct GetWorker final : public Worker {
711
+ GetWorker(napi_env env,
712
+ Database* database,
713
+ napi_value callback,
714
+ const std::string& key,
715
+ const bool asBuffer,
716
+ const bool fillCache)
717
+ : Worker(env, database, callback, "rocks_level.db.get"),
718
+ key_(key),
719
+ asBuffer_(asBuffer),
720
+ fillCache_(fillCache),
721
+ snapshot_(database_->db_->GetSnapshot(),
722
+ [this](const rocksdb::Snapshot* ptr) { database_->db_->ReleaseSnapshot(ptr); }) {
723
+ database_->IncrementPriorityWork(env);
724
+ }
725
+
726
+ rocksdb::Status Execute(Database& database) override {
986
727
  rocksdb::ReadOptions options;
987
728
  options.fill_cache = fillCache_;
988
- SetStatus(database_->Get(options, key_, value_));
729
+ options.snapshot = snapshot_.get();
730
+
731
+ auto status = database.db_->Get(options, database.db_->DefaultColumnFamily(), key_, &value_);
732
+ snapshot_ = nullptr;
733
+
734
+ return status;
989
735
  }
990
736
 
991
- void HandleOKCallback (napi_env env, napi_value callback) override {
737
+ void OnOk(napi_env env, napi_value callback) override {
992
738
  napi_value argv[2];
993
739
  napi_get_null(env, &argv[0]);
994
740
  Convert(env, std::move(value_), asBuffer_, argv[1]);
995
741
  CallFunction(env, callback, 2, argv);
996
742
  }
997
743
 
998
- private:
744
+ void Destroy(napi_env env) override {
745
+ database_->DecrementPriorityWork(env);
746
+ Worker::Destroy(env);
747
+ }
748
+
749
+ private:
999
750
  const std::string key_;
1000
751
  rocksdb::PinnableSlice value_;
1001
752
  const bool asBuffer_;
1002
753
  const bool fillCache_;
754
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
1003
755
  };
1004
756
 
1005
757
  NAPI_METHOD(db_get) {
@@ -1018,63 +770,49 @@ NAPI_METHOD(db_get) {
1018
770
  return 0;
1019
771
  }
1020
772
 
1021
- struct GetManyWorker final : public PriorityWorker {
1022
- GetManyWorker (napi_env env,
1023
- Database* database,
1024
- const std::vector<std::string>& keys,
1025
- napi_value callback,
1026
- const bool valueAsBuffer,
1027
- const bool fillCache)
1028
- : PriorityWorker(env, database, callback, "leveldown.get.many"),
1029
- keys_(keys), valueAsBuffer_(valueAsBuffer), fillCache_(fillCache),
1030
- snapshot_(database->NewSnapshot()) {
1031
- }
1032
-
1033
- ~GetManyWorker () {
1034
- if (snapshot_) {
1035
- database_->ReleaseSnapshot(snapshot_);
1036
- snapshot_ = nullptr;
1037
- }
1038
- }
1039
-
1040
- void DoExecute () override {
1041
- cache_.reserve(keys_.size());
1042
-
773
+ struct GetManyWorker final : public Worker {
774
+ GetManyWorker(napi_env env,
775
+ Database* database,
776
+ const std::vector<std::string>& keys,
777
+ napi_value callback,
778
+ const bool valueAsBuffer,
779
+ const bool fillCache)
780
+ : Worker(env, database, callback, "leveldown.get.many"),
781
+ keys_(keys),
782
+ valueAsBuffer_(valueAsBuffer),
783
+ fillCache_(fillCache),
784
+ snapshot_(database_->db_->GetSnapshot(),
785
+ [this](const rocksdb::Snapshot* ptr) { database_->db_->ReleaseSnapshot(ptr); }) {
786
+ database_->IncrementPriorityWork(env);
787
+ }
788
+
789
+ rocksdb::Status Execute(Database& database) override {
1043
790
  rocksdb::ReadOptions options;
1044
- options.snapshot = snapshot_;
1045
791
  options.fill_cache = fillCache_;
1046
-
1047
- rocksdb::PinnableSlice value;
792
+ options.snapshot = snapshot_.get();
1048
793
 
1049
- for (const auto& key: keys_) {
1050
- const auto status = database_->Get(options, key, value);
794
+ status_ = database.db_->MultiGet(options, std::vector<rocksdb::Slice>(keys_.begin(), keys_.end()), &values_);
795
+ snapshot_ = nullptr;
1051
796
 
1052
- if (status.ok()) {
1053
- cache_.emplace_back(std::move(value));
1054
- } else if (status.IsNotFound()) {
1055
- cache_.emplace_back(nullptr);
1056
- } else {
1057
- SetStatus(status);
1058
- break;
797
+ for (auto status : status_) {
798
+ if (!status.ok() && !status.IsNotFound()) {
799
+ return status;
1059
800
  }
1060
-
1061
- value.Reset();
1062
801
  }
1063
802
 
1064
- database_->ReleaseSnapshot(snapshot_);
1065
- snapshot_ = nullptr;
803
+ return rocksdb::Status::OK();
1066
804
  }
1067
805
 
1068
- void HandleOKCallback (napi_env env, napi_value callback) override {
1069
- const auto size = cache_.size();
806
+ void OnOk(napi_env env, napi_value callback) override {
807
+ const auto size = values_.size();
1070
808
 
1071
809
  napi_value array;
1072
810
  napi_create_array_with_length(env, size, &array);
1073
811
 
1074
812
  for (size_t idx = 0; idx < size; idx++) {
1075
813
  napi_value element;
1076
- if (cache_[idx].GetSelf() != nullptr) {
1077
- Convert(env, cache_[idx], valueAsBuffer_, element);
814
+ if (status_[idx].ok()) {
815
+ Convert(env, values_[idx], valueAsBuffer_, element);
1078
816
  } else {
1079
817
  napi_get_undefined(env, &element);
1080
818
  }
@@ -1087,19 +825,39 @@ struct GetManyWorker final : public PriorityWorker {
1087
825
  CallFunction(env, callback, 2, argv);
1088
826
  }
1089
827
 
1090
- private:
828
+ void Destroy(napi_env env) override {
829
+ database_->DecrementPriorityWork(env);
830
+ Worker::Destroy(env);
831
+ }
832
+
833
+ private:
1091
834
  const std::vector<std::string> keys_;
835
+ std::vector<std::string> values_;
836
+ std::vector<rocksdb::Status> status_;
1092
837
  const bool valueAsBuffer_;
1093
- std::vector<rocksdb::PinnableSlice> cache_;
1094
838
  const bool fillCache_;
1095
- const rocksdb::Snapshot* snapshot_;
839
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
1096
840
  };
1097
841
 
1098
842
  NAPI_METHOD(db_get_many) {
1099
843
  NAPI_ARGV(4);
1100
844
  NAPI_DB_CONTEXT();
1101
845
 
1102
- const auto keys = KeyArray(env, argv[1]);
846
+ std::vector<std::string> keys;
847
+ {
848
+ uint32_t length;
849
+ NAPI_STATUS_THROWS(napi_get_array_length(env, argv[1], &length));
850
+
851
+ keys.reserve(length);
852
+
853
+ for (uint32_t i = 0; i < length; i++) {
854
+ napi_value element;
855
+
856
+ NAPI_STATUS_THROWS(napi_get_element(env, argv[1], i, &element));
857
+ keys.push_back(ToString(env, element));
858
+ }
859
+ }
860
+
1103
861
  const auto options = argv[2];
1104
862
  const bool asBuffer = EncodingIsBuffer(env, options, "valueEncoding");
1105
863
  const bool fillCache = BooleanProperty(env, options, "fillCache", true);
@@ -1111,183 +869,67 @@ NAPI_METHOD(db_get_many) {
1111
869
  return 0;
1112
870
  }
1113
871
 
1114
- struct DelWorker final : public PriorityWorker {
1115
- DelWorker (napi_env env,
1116
- Database* database,
1117
- napi_value callback,
1118
- const std::string& key,
1119
- bool sync)
1120
- : PriorityWorker(env, database, callback, "rocks_level.db.del"),
1121
- key_(key), sync_(sync) {
1122
- }
1123
-
1124
- void DoExecute () override {
1125
- rocksdb::WriteOptions options;
1126
- options.sync = sync_;
1127
- SetStatus(database_->Del(options, key_));
1128
- }
1129
-
1130
- const std::string key_;
1131
- const bool sync_;
1132
- };
1133
-
1134
872
  NAPI_METHOD(db_del) {
1135
- NAPI_ARGV(4);
873
+ NAPI_ARGV(3);
1136
874
  NAPI_DB_CONTEXT();
1137
875
 
1138
876
  const auto key = ToString(env, argv[1]);
1139
- const auto sync = BooleanProperty(env, argv[2], "sync", false);
1140
- const auto callback = argv[3];
1141
-
1142
- auto worker = new DelWorker(env, database, callback, key, sync);
1143
- worker->Queue(env);
1144
877
 
1145
- return 0;
878
+ rocksdb::WriteOptions options;
879
+ return ToError(env, database->db_->Delete(options, key));
1146
880
  }
1147
881
 
1148
- struct ClearWorker final : public PriorityWorker {
1149
- ClearWorker (napi_env env,
1150
- Database* database,
1151
- napi_value callback,
1152
- const bool reverse,
1153
- const int limit,
1154
- const std::string* lt,
1155
- const std::string* lte,
1156
- const std::string* gt,
1157
- const std::string* gte)
1158
- : PriorityWorker(env, database, callback, "rocks_level.db.clear"),
1159
- iterator_(database, reverse, lt, lte, gt, gte, limit, false) {
1160
- }
1161
-
1162
- void DoExecute () override {
1163
- iterator_.SeekToRange();
1164
-
1165
- // TODO: add option
1166
- const uint32_t hwm = 16 * 1024;
1167
-
1168
- rocksdb::WriteBatch batch;
1169
- rocksdb::WriteOptions options;
1170
-
1171
- while (true) {
1172
- size_t bytesRead = 0;
1173
-
1174
- while (bytesRead <= hwm && iterator_.Valid() && iterator_.Increment()) {
1175
- const auto key = iterator_.CurrentKey();
1176
- batch.Delete(key);
1177
- bytesRead += key.size();
1178
- iterator_.Next();
1179
- }
1180
-
1181
- if (!SetStatus(iterator_.Status()) || bytesRead == 0) {
1182
- break;
1183
- }
1184
-
1185
- if (!SetStatus(database_->WriteBatch(options, &batch))) {
1186
- break;
1187
- }
1188
-
1189
- batch.Clear();
1190
- }
1191
-
1192
- iterator_.Close();
1193
- }
1194
-
1195
- private:
1196
- BaseIterator iterator_;
1197
- };
1198
-
1199
882
  NAPI_METHOD(db_clear) {
1200
- NAPI_ARGV(3);
883
+ NAPI_ARGV(2);
1201
884
  NAPI_DB_CONTEXT();
1202
885
 
1203
- napi_value options = argv[1];
1204
- napi_value callback = argv[2];
1205
-
1206
- const auto reverse = BooleanProperty(env, options, "reverse", false);
1207
- const auto limit = Int32Property(env, options, "limit", -1);
886
+ const auto reverse = BooleanProperty(env, argv[1], "reverse", false);
887
+ const auto limit = Int32Property(env, argv[1], "limit", -1);
1208
888
 
1209
- const auto lt = RangeOption(env, options, "lt");
1210
- const auto lte = RangeOption(env, options, "lte");
1211
- const auto gt = RangeOption(env, options, "gt");
1212
- const auto gte = RangeOption(env, options, "gte");
889
+ const auto lt = RangeOption(env, argv[1], "lt");
890
+ const auto lte = RangeOption(env, argv[1], "lte");
891
+ const auto gt = RangeOption(env, argv[1], "gt");
892
+ const auto gte = RangeOption(env, argv[1], "gte");
1213
893
 
1214
- auto worker = new ClearWorker(env, database, callback, reverse, limit, lt, lte, gt, gte);
1215
- worker->Queue(env);
894
+ // TODO (perf): Use DeleteRange.
1216
895
 
1217
- return 0;
1218
- }
896
+ BaseIterator it(database, reverse, lt, lte, gt, gte, limit, false);
1219
897
 
1220
- struct ApproximateSizeWorker final : public PriorityWorker {
1221
- ApproximateSizeWorker (napi_env env,
1222
- Database* database,
1223
- napi_value callback,
1224
- const std::string& start,
1225
- const std::string& end)
1226
- : PriorityWorker(env, database, callback, "rocks_level.db.approximate_size"),
1227
- start_(start), end_(end) {}
1228
-
1229
- void DoExecute () override {
1230
- rocksdb::Range range(start_, end_);
1231
- size_ = database_->ApproximateSize(&range);
1232
- }
898
+ it.SeekToRange();
1233
899
 
1234
- void HandleOKCallback (napi_env env, napi_value callback) override {
1235
- napi_value argv[2];
1236
- napi_get_null(env, &argv[0]);
1237
- napi_create_int64(env, size_, &argv[1]);
1238
- CallFunction(env, callback, 2, argv);
1239
- }
900
+ // TODO: add option
901
+ const uint32_t hwm = 16 * 1024;
1240
902
 
1241
- std::string start_;
1242
- std::string end_;
1243
- uint64_t size_;
1244
- };
903
+ rocksdb::WriteBatch batch;
904
+ rocksdb::WriteOptions options;
905
+ rocksdb::Status status;
1245
906
 
1246
- NAPI_METHOD(db_approximate_size) {
1247
- NAPI_ARGV(4);
1248
- NAPI_DB_CONTEXT();
907
+ while (true) {
908
+ size_t bytesRead = 0;
1249
909
 
1250
- const auto start = ToString(env, argv[1]);
1251
- const auto end = ToString(env, argv[2]);
1252
- const auto callback = argv[3];
910
+ while (bytesRead <= hwm && it.Valid() && it.Increment()) {
911
+ const auto key = it.CurrentKey();
912
+ batch.Delete(key);
913
+ bytesRead += key.size();
914
+ it.Next();
915
+ }
1253
916
 
1254
- auto worker = new ApproximateSizeWorker(env, database, callback, start, end);
1255
- worker->Queue(env);
917
+ status = it.Status();
918
+ if (!status.ok() || bytesRead == 0) {
919
+ break;
920
+ }
1256
921
 
1257
- return 0;
1258
- }
922
+ status = database->db_->Write(options, &batch);
923
+ if (!status.ok()) {
924
+ break;
925
+ }
1259
926
 
1260
- struct CompactRangeWorker final : public PriorityWorker {
1261
- CompactRangeWorker (napi_env env,
1262
- Database* database,
1263
- napi_value callback,
1264
- const std::string& start,
1265
- const std::string& end)
1266
- : PriorityWorker(env, database, callback, "rocks_level.db.compact_range"),
1267
- start_(start), end_(end) {}
1268
-
1269
- void DoExecute () override {
1270
- rocksdb::Slice start = start_;
1271
- rocksdb::Slice end = end_;
1272
- database_->CompactRange(&start, &end);
927
+ batch.Clear();
1273
928
  }
1274
929
 
1275
- const std::string start_;
1276
- const std::string end_;
1277
- };
1278
-
1279
- NAPI_METHOD(db_compact_range) {
1280
- NAPI_ARGV(4);
1281
- NAPI_DB_CONTEXT();
930
+ it.Close();
1282
931
 
1283
- const auto start = ToString(env, argv[1]);
1284
- const auto end = ToString(env, argv[2]);
1285
- const auto callback = argv[3];
1286
-
1287
- auto worker = new CompactRangeWorker(env, database, callback, start, end);
1288
- worker->Queue(env);
1289
-
1290
- return 0;
932
+ return ToError(env, status);
1291
933
  }
1292
934
 
1293
935
  NAPI_METHOD(db_get_property) {
@@ -1297,7 +939,7 @@ NAPI_METHOD(db_get_property) {
1297
939
  const auto property = ToString(env, argv[1]);
1298
940
 
1299
941
  std::string value;
1300
- database->GetProperty(property, value);
942
+ database->db_->GetProperty(property, &value);
1301
943
 
1302
944
  napi_value result;
1303
945
  napi_create_string_utf8(env, value.data(), value.size(), &result);
@@ -1305,63 +947,7 @@ NAPI_METHOD(db_get_property) {
1305
947
  return result;
1306
948
  }
1307
949
 
1308
- struct DestroyWorker final : public BaseWorker {
1309
- DestroyWorker (napi_env env,
1310
- const std::string& location,
1311
- napi_value callback)
1312
- : BaseWorker(env, nullptr, callback, "rocks_level.destroy_db"),
1313
- location_(location) {}
1314
-
1315
- ~DestroyWorker () {}
1316
-
1317
- void DoExecute () override {
1318
- rocksdb::Options options;
1319
- SetStatus(rocksdb::DestroyDB(location_, options));
1320
- }
1321
-
1322
- const std::string location_;
1323
- };
1324
-
1325
- NAPI_METHOD(destroy_db) {
1326
- NAPI_ARGV(2);
1327
-
1328
- const auto location = ToString(env, argv[0]);
1329
- const auto callback = argv[1];
1330
-
1331
- auto worker = new DestroyWorker(env, location, callback);
1332
- worker->Queue(env);
1333
-
1334
- return 0;
1335
- }
1336
-
1337
- struct RepairWorker final : public BaseWorker {
1338
- RepairWorker (napi_env env,
1339
- const std::string& location,
1340
- napi_value callback)
1341
- : BaseWorker(env, nullptr, callback, "rocks_level.repair_db"),
1342
- location_(location) {}
1343
-
1344
- void DoExecute () override {
1345
- rocksdb::Options options;
1346
- SetStatus(rocksdb::RepairDB(location_, options));
1347
- }
1348
-
1349
- const std::string location_;
1350
- };
1351
-
1352
- NAPI_METHOD(repair_db) {
1353
- NAPI_ARGV(2);
1354
-
1355
- const auto location = ToString(env, argv[1]);
1356
- const auto callback = argv[1];
1357
-
1358
- auto worker = new RepairWorker(env, location, callback);
1359
- worker->Queue(env);
1360
-
1361
- return 0;
1362
- }
1363
-
1364
- static void FinalizeIterator (napi_env env, void* data, void* hint) {
950
+ static void FinalizeIterator(napi_env env, void* data, void* hint) {
1365
951
  if (data) {
1366
952
  delete reinterpret_cast<Iterator*>(data);
1367
953
  }
@@ -1386,14 +972,11 @@ NAPI_METHOD(iterator_init) {
1386
972
  const auto gt = RangeOption(env, options, "gt");
1387
973
  const auto gte = RangeOption(env, options, "gte");
1388
974
 
1389
- auto iterator = new Iterator(database, reverse, keys,
1390
- values, limit, lt, lte, gt, gte, fillCache,
1391
- keyAsBuffer, valueAsBuffer, highWaterMarkBytes);
975
+ auto iterator = new Iterator(database, reverse, keys, values, limit, lt, lte, gt, gte, fillCache, keyAsBuffer,
976
+ valueAsBuffer, highWaterMarkBytes);
1392
977
  napi_value result;
1393
978
 
1394
- NAPI_STATUS_THROWS(napi_create_external(env, iterator,
1395
- FinalizeIterator,
1396
- nullptr, &result));
979
+ NAPI_STATUS_THROWS(napi_create_external(env, iterator, FinalizeIterator, nullptr, &result));
1397
980
 
1398
981
  // Prevent GC of JS object before the iterator is closed (explicitly or on
1399
982
  // db close) and keep track of non-closed iterators to end them on db close.
@@ -1413,23 +996,21 @@ NAPI_METHOD(iterator_seek) {
1413
996
  return 0;
1414
997
  }
1415
998
 
1416
- struct CloseIteratorWorker final : public BaseWorker {
1417
- CloseIteratorWorker (napi_env env,
1418
- Iterator* iterator,
1419
- napi_value callback)
1420
- : BaseWorker(env, iterator->database_, callback, "leveldown.iterator.end"),
1421
- iterator_(iterator) {}
999
+ struct CloseIteratorWorker final : public Worker {
1000
+ CloseIteratorWorker(napi_env env, Iterator* iterator, napi_value callback)
1001
+ : Worker(env, iterator->database_, callback, "leveldown.iterator.end"), iterator_(iterator) {}
1422
1002
 
1423
- void DoExecute () override {
1003
+ rocksdb::Status Execute(Database& database) override {
1424
1004
  iterator_->Close();
1005
+ return rocksdb::Status::OK();
1425
1006
  }
1426
1007
 
1427
- void DoFinally (napi_env env) override {
1008
+ void Destroy(napi_env env) override {
1428
1009
  iterator_->Detach(env);
1429
- BaseWorker::DoFinally(env);
1010
+ Worker::Destroy(env);
1430
1011
  }
1431
1012
 
1432
- private:
1013
+ private:
1433
1014
  Iterator* iterator_;
1434
1015
  };
1435
1016
 
@@ -1445,62 +1026,87 @@ NAPI_METHOD(iterator_close) {
1445
1026
  return 0;
1446
1027
  }
1447
1028
 
1448
- struct NextWorker final : public BaseWorker {
1449
- NextWorker (napi_env env,
1450
- Iterator* iterator,
1451
- uint32_t size,
1452
- napi_value callback)
1453
- : BaseWorker(env, iterator->database_, callback,
1454
- "leveldown.iterator.next"),
1455
- iterator_(iterator), size_(size), ok_() {}
1029
+ struct NextWorker final : public Worker {
1030
+ NextWorker(napi_env env, Iterator* iterator, uint32_t size, napi_value callback)
1031
+ : Worker(env, iterator->database_, callback, "leveldown.iterator.next"), iterator_(iterator), size_(size) {}
1456
1032
 
1457
- void DoExecute () override {
1033
+ rocksdb::Status Execute(Database& database) override {
1458
1034
  if (!iterator_->DidSeek()) {
1459
1035
  iterator_->SeekToRange();
1460
1036
  }
1461
1037
 
1462
1038
  // Limit the size of the cache to prevent starving the event loop
1463
1039
  // in JS-land while we're recursively calling process.nextTick().
1464
- ok_ = iterator_->ReadMany(size_);
1465
1040
 
1466
- if (!ok_) {
1467
- SetStatus(iterator_->Status());
1041
+ cache_.reserve(size_ * 2);
1042
+ size_t bytesRead = 0;
1043
+
1044
+ while (true) {
1045
+ if (!iterator_->first_)
1046
+ iterator_->Next();
1047
+ else
1048
+ iterator_->first_ = false;
1049
+
1050
+ if (!iterator_->Valid() || !iterator_->Increment())
1051
+ break;
1052
+
1053
+ if (iterator_->keys_ && iterator_->values_) {
1054
+ auto k = iterator_->CurrentKey();
1055
+ auto v = iterator_->CurrentValue();
1056
+ cache_.emplace_back(k.data(), k.size());
1057
+ cache_.emplace_back(v.data(), v.size());
1058
+ bytesRead += k.size() + v.size();
1059
+ } else if (iterator_->keys_) {
1060
+ auto k = iterator_->CurrentKey();
1061
+ cache_.emplace_back(k.data(), k.size());
1062
+ cache_.push_back({});
1063
+ bytesRead += k.size();
1064
+ } else if (iterator_->values_) {
1065
+ auto v = iterator_->CurrentValue();
1066
+ cache_.push_back({});
1067
+ cache_.emplace_back(v.data(), v.size());
1068
+ bytesRead += v.size();
1069
+ }
1070
+
1071
+ if (bytesRead > iterator_->highWaterMarkBytes_ || cache_.size() / 2 >= size_) {
1072
+ finished_ = true;
1073
+ return rocksdb::Status::OK();
1074
+ }
1468
1075
  }
1076
+
1077
+ return iterator_->Status();
1469
1078
  }
1470
1079
 
1471
- void HandleOKCallback (napi_env env, napi_value callback) override {
1472
- const auto size = iterator_->cache_.size();
1080
+ void OnOk(napi_env env, napi_value callback) override {
1081
+ const auto size = cache_.size();
1473
1082
  napi_value result;
1474
1083
  napi_create_array_with_length(env, size, &result);
1475
1084
 
1476
- for (size_t idx = 0; idx < iterator_->cache_.size(); idx += 2) {
1085
+ for (size_t idx = 0; idx < cache_.size(); idx += 2) {
1477
1086
  napi_value key;
1478
1087
  napi_value val;
1479
1088
 
1480
- Convert(env, iterator_->cache_[idx + 0], iterator_->keyAsBuffer_, key);
1481
- Convert(env, iterator_->cache_[idx + 1], iterator_->valueAsBuffer_, val);
1089
+ Convert(env, cache_[idx + 0], iterator_->keyAsBuffer_, key);
1090
+ Convert(env, cache_[idx + 1], iterator_->valueAsBuffer_, val);
1482
1091
 
1483
1092
  napi_set_element(env, result, static_cast<int>(idx + 0), key);
1484
1093
  napi_set_element(env, result, static_cast<int>(idx + 1), val);
1485
1094
  }
1486
1095
 
1487
- iterator_->cache_.clear();
1096
+ cache_.clear();
1488
1097
 
1489
1098
  napi_value argv[3];
1490
1099
  napi_get_null(env, &argv[0]);
1491
1100
  argv[1] = result;
1492
- napi_get_boolean(env, !ok_, &argv[2]);
1101
+ napi_get_boolean(env, !finished_, &argv[2]);
1493
1102
  CallFunction(env, callback, 3, argv);
1494
1103
  }
1495
1104
 
1496
- void DoFinally (napi_env env) override {
1497
- BaseWorker::DoFinally(env);
1498
- }
1499
-
1500
- private:
1501
- Iterator* iterator_;
1502
- uint32_t size_;
1503
- bool ok_;
1105
+ private:
1106
+ std::vector<std::string> cache_;
1107
+ Iterator* iterator_ = nullptr;
1108
+ uint32_t size_ = 0;
1109
+ bool finished_ = false;
1504
1110
  };
1505
1111
 
1506
1112
  NAPI_METHOD(iterator_nextv) {
@@ -1509,7 +1115,8 @@ NAPI_METHOD(iterator_nextv) {
1509
1115
 
1510
1116
  uint32_t size;
1511
1117
  NAPI_STATUS_THROWS(napi_get_value_uint32(env, argv[1], &size));
1512
- if (size == 0) size = 1;
1118
+ if (size == 0)
1119
+ size = 1;
1513
1120
 
1514
1121
  const auto callback = argv[2];
1515
1122
 
@@ -1519,74 +1126,51 @@ NAPI_METHOD(iterator_nextv) {
1519
1126
  return 0;
1520
1127
  }
1521
1128
 
1522
- struct BatchWorker final : public PriorityWorker {
1523
- BatchWorker (napi_env env,
1524
- Database* database,
1525
- napi_value callback,
1526
- napi_value array,
1527
- const bool sync)
1528
- : PriorityWorker(env, database, callback, "rocks_level.batch.do"), sync_(sync) {
1529
- uint32_t length;
1530
- NAPI_STATUS_THROWS_VOID(napi_get_array_length(env, array, &length));
1531
-
1532
- for (uint32_t i = 0; i < length; i++) {
1533
- napi_value element;
1534
- NAPI_STATUS_THROWS_VOID(napi_get_element(env, array, i, &element));
1129
+ NAPI_METHOD(batch_do) {
1130
+ NAPI_ARGV(3);
1131
+ NAPI_DB_CONTEXT();
1535
1132
 
1536
- if (!IsObject(env, element)) continue;
1133
+ const auto operations = argv[1];
1537
1134
 
1538
- const auto type = StringProperty(env, element, "type");
1135
+ rocksdb::WriteBatch batch;
1539
1136
 
1540
- if (type == "del") {
1541
- if (!HasProperty(env, element, "key")) continue;
1542
- const auto key = ToString(env, GetProperty(env, element, "key"));
1137
+ uint32_t length;
1138
+ NAPI_STATUS_THROWS(napi_get_array_length(env, operations, &length));
1543
1139
 
1544
- batch_.Delete(key);
1545
- if (!hasData_) hasData_ = true;
1546
- } else if (type == "put") {
1547
- if (!HasProperty(env, element, "key")) continue;
1548
- if (!HasProperty(env, element, "value")) continue;
1140
+ for (uint32_t i = 0; i < length; i++) {
1141
+ napi_value element;
1142
+ NAPI_STATUS_THROWS(napi_get_element(env, operations, i, &element));
1549
1143
 
1550
- const auto key = ToString(env, GetProperty(env, element, "key"));
1551
- const auto value = ToString(env, GetProperty(env, element, "value"));
1144
+ if (!IsObject(env, element))
1145
+ continue;
1552
1146
 
1553
- batch_.Put(key, value);
1554
- if (!hasData_) hasData_ = true;
1555
- }
1556
- }
1557
- }
1147
+ const auto type = StringProperty(env, element, "type");
1558
1148
 
1559
- void DoExecute () override {
1560
- if (hasData_) {
1561
- rocksdb::WriteOptions options;
1562
- options.sync = sync_;
1563
- SetStatus(database_->WriteBatch(options, &batch_));
1564
- } else {
1565
- SetStatus(rocksdb::Status::OK());
1566
- }
1567
- }
1149
+ if (type == "del") {
1150
+ if (!HasProperty(env, element, "key"))
1151
+ continue;
1568
1152
 
1569
- private:
1570
- rocksdb::WriteBatch batch_;
1571
- const bool sync_;
1572
- bool hasData_;
1573
- };
1153
+ const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1574
1154
 
1575
- NAPI_METHOD(batch_do) {
1576
- NAPI_ARGV(4);
1577
- NAPI_DB_CONTEXT();
1155
+ batch.Delete(key);
1156
+ } else if (type == "put") {
1157
+ if (!HasProperty(env, element, "key"))
1158
+ continue;
1159
+ if (!HasProperty(env, element, "value"))
1160
+ continue;
1578
1161
 
1579
- const auto array = argv[1];
1580
- const auto sync = BooleanProperty(env, argv[2], "sync", false);
1581
- const auto callback = argv[3];
1162
+ const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1163
+ const auto value = NapiSlice(env, GetProperty(env, element, "value"));
1582
1164
 
1583
- auto worker = new BatchWorker(env, database, callback, array, sync);
1584
- worker->Queue(env);
1165
+ batch.Put(key, value);
1166
+ }
1167
+ }
1585
1168
 
1586
- return 0;
1169
+ rocksdb::WriteOptions options;
1170
+ return ToError(env, database->db_->Write(options, &batch));
1587
1171
  }
1588
1172
 
1589
- static void FinalizeBatch (napi_env env, void* data, void* hint) {
1173
+ static void FinalizeBatch(napi_env env, void* data, void* hint) {
1590
1174
  if (data) {
1591
1175
  delete reinterpret_cast<rocksdb::WriteBatch*>(data);
1592
1176
  }
@@ -1607,8 +1191,8 @@ NAPI_METHOD(batch_put) {
1607
1191
  NAPI_ARGV(3);
1608
1192
  NAPI_BATCH_CONTEXT();
1609
1193
 
1610
- const auto key = ToString(env, argv[1]);
1611
- const auto value = ToString(env, argv[2]);
1194
+ const auto key = NapiSlice(env, argv[1]);
1195
+ const auto value = NapiSlice(env, argv[2]);
1612
1196
 
1613
1197
  batch->Put(key, value);
1614
1198
 
@@ -1619,7 +1203,7 @@ NAPI_METHOD(batch_del) {
1619
1203
  NAPI_ARGV(2);
1620
1204
  NAPI_BATCH_CONTEXT();
1621
1205
 
1622
- const auto key = ToString(env, argv[1]);
1206
+ const auto key = NapiSlice(env, argv[1]);
1623
1207
 
1624
1208
  batch->Delete(key);
1625
1209
 
@@ -1635,51 +1219,15 @@ NAPI_METHOD(batch_clear) {
1635
1219
  return 0;
1636
1220
  }
1637
1221
 
1638
- struct BatchWriteWorker final : public PriorityWorker {
1639
- BatchWriteWorker (napi_env env,
1640
- Database* database,
1641
- napi_value batch,
1642
- napi_value callback,
1643
- const bool sync)
1644
- : PriorityWorker(env, database, callback, "leveldown.batch.write"),
1645
- sync_(sync) {
1646
-
1647
- NAPI_STATUS_THROWS_VOID(napi_get_value_external(env, batch, reinterpret_cast<void**>(&batch_)));
1648
-
1649
- // Prevent GC of batch object before we execute
1650
- NAPI_STATUS_THROWS_VOID(napi_create_reference(env, batch, 1, &batchRef_));
1651
- }
1652
-
1653
- void DoExecute () override {
1654
- rocksdb::WriteOptions options;
1655
- options.sync = sync_;
1656
- SetStatus(database_->WriteBatch(options, batch_));
1657
- }
1658
-
1659
- void DoFinally (napi_env env) override {
1660
- napi_delete_reference(env, batchRef_);
1661
- PriorityWorker::DoFinally(env);
1662
- }
1663
-
1664
- private:
1665
- rocksdb::WriteBatch* batch_;
1666
- const bool sync_;
1667
- napi_ref batchRef_;
1668
- };
1669
-
1670
1222
  NAPI_METHOD(batch_write) {
1671
- NAPI_ARGV(4);
1223
+ NAPI_ARGV(3);
1672
1224
  NAPI_DB_CONTEXT();
1673
1225
 
1674
- const auto batch = argv[1];
1675
- const auto options = argv[2];
1676
- const auto sync = BooleanProperty(env, options, "sync", false);
1677
- const auto callback = argv[3];
1678
-
1679
- auto worker = new BatchWriteWorker(env, database, batch, callback, sync);
1680
- worker->Queue(env);
1226
+ rocksdb::WriteBatch* batch;
1227
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[1], reinterpret_cast<void**>(&batch)));
1681
1228
 
1682
- return 0;
1229
+ rocksdb::WriteOptions options;
1230
+ return ToError(env, database->db_->Write(options, batch));
1683
1231
  }
1684
1232
 
1685
1233
  NAPI_INIT() {
@@ -1691,13 +1239,8 @@ NAPI_INIT() {
1691
1239
  NAPI_EXPORT_FUNCTION(db_get_many);
1692
1240
  NAPI_EXPORT_FUNCTION(db_del);
1693
1241
  NAPI_EXPORT_FUNCTION(db_clear);
1694
- NAPI_EXPORT_FUNCTION(db_approximate_size);
1695
- NAPI_EXPORT_FUNCTION(db_compact_range);
1696
1242
  NAPI_EXPORT_FUNCTION(db_get_property);
1697
1243
 
1698
- NAPI_EXPORT_FUNCTION(destroy_db);
1699
- NAPI_EXPORT_FUNCTION(repair_db);
1700
-
1701
1244
  NAPI_EXPORT_FUNCTION(iterator_init);
1702
1245
  NAPI_EXPORT_FUNCTION(iterator_seek);
1703
1246
  NAPI_EXPORT_FUNCTION(iterator_close);