rocksdb-native 3.11.2 → 3.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CMakeLists.txt CHANGED
@@ -9,7 +9,7 @@ project(rocksdb_native C CXX)
9
9
 
10
10
  bare_target(target)
11
11
 
12
- fetch_package("github:holepunchto/librocksdb#6a480d5")
12
+ fetch_package("github:holepunchto/librocksdb#d5b0f65")
13
13
  fetch_package("github:holepunchto/libjstl#098664c")
14
14
 
15
15
  add_bare_module(rocksdb_native_bare)
package/binding.cc CHANGED
@@ -73,6 +73,7 @@ struct rocksdb_native_close_t {
73
73
 
74
74
  js_env_t *env;
75
75
  js_persistent_t<js_receiver_t> ctx;
76
+ js_persistent_t<js_arraybuffer_t> self;
76
77
  js_persistent_t<rocksdb_native_on_close_t> on_close;
77
78
  };
78
79
 
@@ -104,7 +105,7 @@ struct rocksdb_native_iterator_t {
104
105
  js_persistent_t<rocksdb_native_on_iterator_close_t> on_close;
105
106
  js_persistent_t<rocksdb_native_on_iterator_read_t> on_read;
106
107
 
107
- bool active;
108
+ bool closing;
108
109
  bool exiting;
109
110
 
110
111
  js_deferred_teardown_t *teardown;
@@ -193,50 +194,43 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
193
194
  auto env = req->env;
194
195
 
195
196
  auto descriptors = handle->column_families;
196
-
197
197
  auto handles = handle->handles;
198
198
 
199
- if (db->exiting) {
200
- req->on_open.reset();
201
- req->ctx.reset();
202
- } else {
203
- js_handle_scope_t *scope;
204
- err = js_open_handle_scope(env, &scope);
205
- assert(err == 0);
206
-
207
- js_receiver_t ctx;
208
- err = js_get_reference_value(env, req->ctx, ctx);
209
- assert(err == 0);
210
-
211
- rocksdb_native_on_open_t cb;
212
- err = js_get_reference_value(env, req->on_open, cb);
213
- assert(err == 0);
199
+ js_handle_scope_t *scope;
200
+ err = js_open_handle_scope(env, &scope);
201
+ assert(err == 0);
214
202
 
215
- js_array_t column_families;
216
- err = js_get_reference_value(env, req->column_families, column_families);
217
- assert(err == 0);
203
+ js_receiver_t ctx;
204
+ err = js_get_reference_value(env, req->ctx, ctx);
205
+ assert(err == 0);
218
206
 
219
- req->on_open.reset();
220
- req->column_families.reset();
221
- req->ctx.reset();
207
+ rocksdb_native_on_open_t cb;
208
+ err = js_get_reference_value(env, req->on_open, cb);
209
+ assert(err == 0);
222
210
 
223
- std::optional<js_string_t> error;
211
+ js_array_t column_families;
212
+ err = js_get_reference_value(env, req->column_families, column_families);
213
+ assert(err == 0);
224
214
 
225
- if (req->handle.error) {
226
- err = js_create_string(env, req->handle.error, error.emplace());
227
- assert(err == 0);
228
- }
215
+ req->on_open.reset();
216
+ req->column_families.reset();
217
+ req->ctx.reset();
229
218
 
230
- rocksdb_column_family_t **handles = handle->handles;
219
+ std::optional<js_string_t> error;
231
220
 
232
- if (req->handle.error == nullptr) {
233
- std::vector<js_arraybuffer_t> elements;
234
- err = js_get_array_elements(env, column_families, elements);
235
- assert(err == 0);
221
+ if (req->handle.error) {
222
+ err = js_create_string(env, req->handle.error, error.emplace());
223
+ assert(err == 0);
224
+ } else {
225
+ std::vector<js_arraybuffer_t> elements;
226
+ err = js_get_array_elements(env, column_families, elements);
227
+ assert(err == 0);
236
228
 
237
- const auto len = elements.size();
229
+ const auto len = elements.size();
238
230
 
239
- for (uint32_t i = 0; i < len; i++) {
231
+ for (uint32_t i = 0; i < len; i++) {
232
+ if (db->exiting) rocksdb_column_family_destroy(&db->handle, handles[i]);
233
+ else {
240
234
  js_arraybuffer_t handle = elements[i];
241
235
 
242
236
  rocksdb_native_column_family_t *column_family;
@@ -251,15 +245,18 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
251
245
  db->column_families.insert(column_family);
252
246
  }
253
247
  }
248
+ }
254
249
 
255
- js_call_function_with_checkpoint(env, cb, ctx, error);
250
+ if (!db->exiting) {
251
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
252
+ (void) err;
253
+ }
256
254
 
257
- err = js_close_handle_scope(env, scope);
258
- assert(err == 0);
255
+ err = js_close_handle_scope(env, scope);
256
+ assert(err == 0);
259
257
 
260
- delete[] descriptors;
261
- delete[] handles;
262
- }
258
+ delete[] descriptors;
259
+ delete[] handles;
263
260
  }
264
261
 
265
262
  static void
@@ -277,14 +274,13 @@ rocksdb_native__on_idle(rocksdb_t *handle) {
277
274
  column_family->ctx.reset();
278
275
  }
279
276
 
280
- db->column_families.~set();
281
-
282
277
  for (auto &snapshot : db->snapshots) {
283
278
  rocksdb_snapshot_destroy(&snapshot->handle);
284
279
 
285
280
  snapshot->ctx.reset();
286
281
  }
287
282
 
283
+ db->column_families.~set();
288
284
  db->snapshots.~set();
289
285
  }
290
286
 
@@ -302,62 +298,83 @@ rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
302
298
 
303
299
  auto teardown = db->teardown;
304
300
 
305
- if (db->exiting) {
306
- if (db->closing) {
307
- req->on_close.reset();
308
- req->ctx.reset();
309
- } else {
310
- free(req);
311
- }
312
-
313
- db->ctx.reset();
314
- } else {
315
- js_handle_scope_t *scope;
316
- err = js_open_handle_scope(env, &scope);
317
- assert(err == 0);
318
-
319
- js_receiver_t ctx;
320
- err = js_get_reference_value(env, req->ctx, ctx);
321
- assert(err == 0);
301
+ js_handle_scope_t *scope;
302
+ err = js_open_handle_scope(env, &scope);
303
+ assert(err == 0);
322
304
 
323
- rocksdb_native_on_close_t cb;
324
- err = js_get_reference_value(env, req->on_close, cb);
325
- assert(err == 0);
305
+ js_receiver_t ctx;
306
+ err = js_get_reference_value(env, req->ctx, ctx);
307
+ assert(err == 0);
326
308
 
327
- req->on_close.reset();
328
- req->ctx.reset();
309
+ rocksdb_native_on_close_t cb;
310
+ err = js_get_reference_value(env, req->on_close, cb);
311
+ assert(err == 0);
329
312
 
330
- db->ctx.reset();
313
+ req->on_close.reset();
314
+ req->self.reset();
315
+ req->ctx.reset();
331
316
 
332
- js_call_function_with_checkpoint(env, cb, ctx);
317
+ db->ctx.reset();
333
318
 
334
- err = js_close_handle_scope(env, scope);
335
- assert(err == 0);
319
+ if (!db->exiting) {
320
+ err = js_call_function_with_checkpoint(env, cb, ctx);
321
+ (void) err;
336
322
  }
337
323
 
324
+ err = js_close_handle_scope(env, scope);
325
+ assert(err == 0);
326
+
338
327
  err = js_finish_deferred_teardown_callback(teardown);
339
328
  assert(err == 0);
340
329
  }
341
330
 
342
331
  static void
343
- rocksdb_native__on_teardown(js_deferred_teardown_t *handle, void *data) {
332
+ rocksdb_native__on_teardown(js_deferred_teardown_t *teardown, void *data) {
344
333
  int err;
345
334
 
346
335
  auto db = reinterpret_cast<rocksdb_native_t *>(data);
347
336
 
348
- auto env = db->env;
349
-
350
337
  db->exiting = true;
351
338
 
352
339
  if (db->closing) return;
353
340
 
354
- auto req = reinterpret_cast<rocksdb_native_close_t *>(malloc(sizeof(rocksdb_native_close_t)));
341
+ auto env = db->env;
342
+
343
+ js_handle_scope_t *scope;
344
+ err = js_open_handle_scope(env, &scope);
345
+ assert(err == 0);
346
+
347
+ js_arraybuffer_t handle;
348
+
349
+ rocksdb_native_close_t *req;
350
+ err = js_create_arraybuffer(env, req, handle);
351
+ assert(err == 0);
355
352
 
356
353
  req->env = env;
357
354
  req->handle.data = req;
358
355
 
359
356
  err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_idle, rocksdb_native__on_close);
360
357
  assert(err == 0);
358
+
359
+ js_receiver_t ctx;
360
+ err = js_get_null(env, static_cast<js_value_t **>(ctx));
361
+ assert(err == 0);
362
+
363
+ rocksdb_native_on_close_t on_close;
364
+ err = js_get_null(env, static_cast<js_value_t **>(on_close));
365
+ assert(err == 0);
366
+
367
+ err = js_create_reference(env, ctx, req->ctx);
368
+ assert(err == 0);
369
+
370
+ err = js_create_reference(env, handle, req->self);
371
+ assert(err == 0);
372
+
373
+ err = js_create_reference(env, on_close, req->on_close);
374
+ assert(err == 0);
375
+
376
+ err = js_close_handle_scope(env, scope);
377
+ assert(err == 0);
361
378
  }
362
379
 
363
380
  static js_arraybuffer_t
@@ -377,10 +394,6 @@ rocksdb_native_init(
377
394
  ) {
378
395
  int err;
379
396
 
380
- uv_loop_t *loop;
381
- err = js_get_env_loop(env, &loop);
382
- assert(err == 0);
383
-
384
397
  js_arraybuffer_t handle;
385
398
 
386
399
  rocksdb_native_t *db;
@@ -410,15 +423,6 @@ rocksdb_native_init(
410
423
  -1,
411
424
  };
412
425
 
413
- err = rocksdb_init(loop, &db->handle);
414
-
415
- if (err < 0) {
416
- err = js_throw_error(env, uv_err_name(err), uv_strerror(err));
417
- assert(err == 0);
418
-
419
- throw js_pending_exception;
420
- }
421
-
422
426
  return handle;
423
427
  }
424
428
 
@@ -457,6 +461,10 @@ rocksdb_native_open(
457
461
 
458
462
  auto handles = new rocksdb_column_family_t *[len];
459
463
 
464
+ uv_loop_t *loop;
465
+ err = js_get_env_loop(env, &loop);
466
+ assert(err == 0);
467
+
460
468
  js_arraybuffer_t handle;
461
469
 
462
470
  rocksdb_native_open_t *req;
@@ -468,7 +476,7 @@ rocksdb_native_open(
468
476
 
469
477
  db->options.lock = lock;
470
478
 
471
- err = rocksdb_open(&db->handle, &req->handle, path, &db->options, column_families, handles, len, nullptr, rocksdb_native__on_open);
479
+ err = rocksdb_open(loop, &db->handle, &req->handle, path, &db->options, column_families, handles, len, nullptr, rocksdb_native__on_open);
472
480
 
473
481
  if (err < 0) {
474
482
  err = js_throw_error(env, uv_err_name(err), uv_strerror(err));
@@ -531,6 +539,9 @@ rocksdb_native_close(
531
539
  err = js_create_reference(env, ctx, req->ctx);
532
540
  assert(err == 0);
533
541
 
542
+ err = js_create_reference(env, handle, req->self);
543
+ assert(err == 0);
544
+
534
545
  err = js_create_reference(env, on_close, req->on_close);
535
546
  assert(err == 0);
536
547
 
@@ -551,36 +562,35 @@ rocksdb_native__on_suspend(rocksdb_suspend_t *handle, int status) {
551
562
 
552
563
  auto env = req->env;
553
564
 
554
- auto teardown = db->teardown;
555
-
556
- if (db->exiting) {
557
- req->on_suspend.reset();
558
- req->ctx.reset();
559
- } else {
560
- js_handle_scope_t *scope;
561
- err = js_open_handle_scope(env, &scope);
562
- assert(err == 0);
565
+ js_handle_scope_t *scope;
566
+ err = js_open_handle_scope(env, &scope);
567
+ assert(err == 0);
563
568
 
564
- js_receiver_t ctx;
565
- err = js_get_reference_value(env, req->ctx, ctx);
566
- assert(err == 0);
569
+ js_receiver_t ctx;
570
+ err = js_get_reference_value(env, req->ctx, ctx);
571
+ assert(err == 0);
567
572
 
568
- rocksdb_native_on_suspend_t cb;
569
- err = js_get_reference_value(env, req->on_suspend, cb);
570
- assert(err == 0);
573
+ rocksdb_native_on_suspend_t cb;
574
+ err = js_get_reference_value(env, req->on_suspend, cb);
575
+ assert(err == 0);
571
576
 
572
- std::optional<js_string_t> error;
577
+ req->on_suspend.reset();
578
+ req->ctx.reset();
573
579
 
574
- if (req->handle.error) {
575
- err = js_create_string(env, req->handle.error, error.emplace());
576
- assert(err == 0);
577
- }
578
-
579
- js_call_function_with_checkpoint(env, cb, ctx, error);
580
+ std::optional<js_string_t> error;
580
581
 
581
- err = js_close_handle_scope(env, scope);
582
+ if (req->handle.error) {
583
+ err = js_create_string(env, req->handle.error, error.emplace());
582
584
  assert(err == 0);
583
585
  }
586
+
587
+ if (!db->exiting) {
588
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
589
+ (void) err;
590
+ }
591
+
592
+ err = js_close_handle_scope(env, scope);
593
+ assert(err == 0);
584
594
  }
585
595
 
586
596
  static js_arraybuffer_t
@@ -631,39 +641,35 @@ rocksdb_native__on_resume(rocksdb_resume_t *handle, int status) {
631
641
 
632
642
  auto env = req->env;
633
643
 
634
- auto teardown = db->teardown;
635
-
636
- if (db->exiting) {
637
- req->on_resume.reset();
638
- req->ctx.reset();
639
- } else {
640
- js_handle_scope_t *scope;
641
- err = js_open_handle_scope(env, &scope);
642
- assert(err == 0);
644
+ js_handle_scope_t *scope;
645
+ err = js_open_handle_scope(env, &scope);
646
+ assert(err == 0);
643
647
 
644
- js_receiver_t ctx;
645
- err = js_get_reference_value(env, req->ctx, ctx);
646
- assert(err == 0);
648
+ js_receiver_t ctx;
649
+ err = js_get_reference_value(env, req->ctx, ctx);
650
+ assert(err == 0);
647
651
 
648
- rocksdb_native_on_resume_t cb;
649
- err = js_get_reference_value(env, req->on_resume, cb);
650
- assert(err == 0);
652
+ rocksdb_native_on_resume_t cb;
653
+ err = js_get_reference_value(env, req->on_resume, cb);
654
+ assert(err == 0);
651
655
 
652
- req->on_resume.reset();
653
- req->ctx.reset();
656
+ req->on_resume.reset();
657
+ req->ctx.reset();
654
658
 
655
- std::optional<js_string_t> error;
659
+ std::optional<js_string_t> error;
656
660
 
657
- if (req->handle.error) {
658
- err = js_create_string(env, req->handle.error, error.emplace());
659
- assert(err == 0);
660
- }
661
-
662
- js_call_function_with_checkpoint(env, cb, ctx, error);
663
-
664
- err = js_close_handle_scope(env, scope);
661
+ if (req->handle.error) {
662
+ err = js_create_string(env, req->handle.error, error.emplace());
665
663
  assert(err == 0);
666
664
  }
665
+
666
+ if (!db->exiting) {
667
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
668
+ (void) err;
669
+ }
670
+
671
+ err = js_close_handle_scope(env, scope);
672
+ assert(err == 0);
667
673
  }
668
674
 
669
675
  static js_arraybuffer_t
@@ -816,7 +822,7 @@ rocksdb_native_iterator_init(js_env_t *env) {
816
822
  assert(err == 0);
817
823
 
818
824
  req->env = env;
819
- req->active = false;
825
+ req->closing = false;
820
826
  req->exiting = false;
821
827
  req->handle.data = req;
822
828
 
@@ -856,48 +862,42 @@ rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
856
862
 
857
863
  auto req = reinterpret_cast<rocksdb_native_iterator_t *>(handle->data);
858
864
 
859
- req->active = false;
860
-
861
865
  auto env = req->env;
862
866
 
863
867
  auto teardown = req->teardown;
864
868
 
865
- if (req->exiting) {
866
- req->on_open.reset();
867
- req->on_close.reset();
868
- req->on_read.reset();
869
- req->ctx.reset();
870
- } else {
871
- js_handle_scope_t *scope;
872
- err = js_open_handle_scope(env, &scope);
873
- assert(err == 0);
874
-
875
- js_receiver_t ctx;
876
- err = js_get_reference_value(env, req->ctx, ctx);
877
- assert(err == 0);
878
-
879
- rocksdb_native_on_iterator_close_t cb;
880
- err = js_get_reference_value(env, req->on_close, cb);
881
- assert(err == 0);
869
+ js_handle_scope_t *scope;
870
+ err = js_open_handle_scope(env, &scope);
871
+ assert(err == 0);
882
872
 
883
- req->on_open.reset();
884
- req->on_close.reset();
885
- req->on_read.reset();
886
- req->ctx.reset();
873
+ js_receiver_t ctx;
874
+ err = js_get_reference_value(env, req->ctx, ctx);
875
+ assert(err == 0);
887
876
 
888
- std::optional<js_string_t> error;
877
+ rocksdb_native_on_iterator_close_t cb;
878
+ err = js_get_reference_value(env, req->on_close, cb);
879
+ assert(err == 0);
889
880
 
890
- if (req->handle.error) {
891
- err = js_create_string(env, req->handle.error, error.emplace());
892
- assert(err == 0);
893
- }
881
+ req->on_open.reset();
882
+ req->on_close.reset();
883
+ req->on_read.reset();
884
+ req->ctx.reset();
894
885
 
895
- js_call_function_with_checkpoint(env, cb, ctx, error);
886
+ std::optional<js_string_t> error;
896
887
 
897
- err = js_close_handle_scope(env, scope);
888
+ if (req->handle.error) {
889
+ err = js_create_string(env, req->handle.error, error.emplace());
898
890
  assert(err == 0);
899
891
  }
900
892
 
893
+ if (!req->exiting) {
894
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
895
+ (void) err;
896
+ }
897
+
898
+ err = js_close_handle_scope(env, scope);
899
+ assert(err == 0);
900
+
901
901
  err = js_finish_deferred_teardown_callback(teardown);
902
902
  assert(err == 0);
903
903
  }
@@ -910,49 +910,45 @@ rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
910
910
 
911
911
  auto req = reinterpret_cast<rocksdb_native_iterator_t *>(handle->data);
912
912
 
913
- req->active = false;
914
-
915
- if (req->exiting) {
916
- err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
917
- assert(err == 0);
918
- } else {
919
- auto env = req->env;
920
-
921
- js_handle_scope_t *scope;
922
- err = js_open_handle_scope(env, &scope);
923
- assert(err == 0);
924
-
925
- js_receiver_t ctx;
926
- err = js_get_reference_value(env, req->ctx, ctx);
927
- assert(err == 0);
913
+ auto env = req->env;
928
914
 
929
- rocksdb_native_on_iterator_open_t cb;
930
- err = js_get_reference_value(env, req->on_open, cb);
931
- assert(err == 0);
915
+ js_handle_scope_t *scope;
916
+ err = js_open_handle_scope(env, &scope);
917
+ assert(err == 0);
932
918
 
933
- std::optional<js_string_t> error;
919
+ js_receiver_t ctx;
920
+ err = js_get_reference_value(env, req->ctx, ctx);
921
+ assert(err == 0);
934
922
 
935
- if (req->handle.error) {
936
- err = js_create_string(env, req->handle.error, error.emplace());
937
- assert(err == 0);
938
- }
923
+ rocksdb_native_on_iterator_open_t cb;
924
+ err = js_get_reference_value(env, req->on_open, cb);
925
+ assert(err == 0);
939
926
 
940
- js_call_function_with_checkpoint(env, cb, ctx, error);
927
+ std::optional<js_string_t> error;
941
928
 
942
- err = js_close_handle_scope(env, scope);
929
+ if (req->handle.error) {
930
+ err = js_create_string(env, req->handle.error, error.emplace());
943
931
  assert(err == 0);
944
932
  }
933
+
934
+ if (!req->exiting) {
935
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
936
+ (void) err;
937
+ }
938
+
939
+ err = js_close_handle_scope(env, scope);
940
+ assert(err == 0);
945
941
  }
946
942
 
947
943
  static void
948
- rocksdb_native__on_iterator_teardown(js_deferred_teardown_t *handle, void *data) {
944
+ rocksdb_native__on_iterator_teardown(js_deferred_teardown_t *teardown, void *data) {
949
945
  int err;
950
946
 
951
947
  auto req = reinterpret_cast<rocksdb_native_iterator_t *>(data);
952
948
 
953
949
  req->exiting = true;
954
950
 
955
- if (req->active) return;
951
+ if (req->closing) return;
956
952
 
957
953
  err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
958
954
  assert(err == 0);
@@ -1009,8 +1005,6 @@ rocksdb_native_iterator_open(
1009
1005
  throw js_pending_exception;
1010
1006
  }
1011
1007
 
1012
- req->active = true;
1013
-
1014
1008
  err = js_create_reference(env, ctx, req->ctx);
1015
1009
  assert(err == 0);
1016
1010
 
@@ -1040,7 +1034,7 @@ rocksdb_native_iterator_close(js_env_t *env, js_arraybuffer_span_of_t<rocksdb_na
1040
1034
  throw js_pending_exception;
1041
1035
  }
1042
1036
 
1043
- req->active = true;
1037
+ req->closing = true;
1044
1038
  }
1045
1039
 
1046
1040
  static void
@@ -1051,76 +1045,66 @@ rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
1051
1045
 
1052
1046
  auto req = reinterpret_cast<rocksdb_native_iterator_t *>(handle->data);
1053
1047
 
1054
- req->active = false;
1055
-
1056
1048
  auto db = reinterpret_cast<rocksdb_native_t *>(req->handle.req.db);
1057
1049
 
1058
- size_t len = req->handle.len;
1059
-
1060
- if (db->exiting) {
1061
- if (status == 0 && req->handle.error == nullptr) {
1062
- for (size_t i = 0; i < len; i++) {
1063
- js_value_t *result;
1064
-
1065
- rocksdb_slice_destroy(&req->keys[i]);
1050
+ auto len = req->handle.len;
1066
1051
 
1067
- rocksdb_slice_destroy(&req->values[i]);
1068
- }
1069
- }
1052
+ auto env = req->env;
1070
1053
 
1071
- err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
1072
- assert(err == 0);
1073
- } else {
1074
- auto env = req->env;
1054
+ js_handle_scope_t *scope;
1055
+ err = js_open_handle_scope(env, &scope);
1056
+ assert(err == 0);
1075
1057
 
1076
- js_handle_scope_t *scope;
1077
- err = js_open_handle_scope(env, &scope);
1078
- assert(err == 0);
1058
+ js_receiver_t ctx;
1059
+ err = js_get_reference_value(env, req->ctx, ctx);
1060
+ assert(err == 0);
1079
1061
 
1080
- js_receiver_t ctx;
1081
- err = js_get_reference_value(env, req->ctx, ctx);
1082
- assert(err == 0);
1062
+ rocksdb_native_on_iterator_read_t cb;
1063
+ err = js_get_reference_value(env, req->on_read, cb);
1064
+ assert(err == 0);
1083
1065
 
1084
- rocksdb_native_on_iterator_read_t cb;
1085
- err = js_get_reference_value(env, req->on_read, cb);
1086
- assert(err == 0);
1066
+ std::optional<js_string_t> error;
1087
1067
 
1088
- std::optional<js_string_t> error;
1068
+ std::vector<js_arraybuffer_t> keys;
1069
+ keys.reserve(len);
1089
1070
 
1090
- std::vector<js_arraybuffer_t> keys;
1091
- keys.reserve(len);
1071
+ std::vector<js_arraybuffer_t> values;
1072
+ values.reserve(len);
1092
1073
 
1093
- std::vector<js_arraybuffer_t> values;
1094
- values.reserve(len);
1074
+ if (req->handle.error) {
1075
+ err = js_create_string(env, req->handle.error, error.emplace());
1076
+ assert(err == 0);
1077
+ } else {
1078
+ for (size_t i = 0; i < len; i++) {
1079
+ rocksdb_slice_t *key = &req->keys[i];
1080
+ rocksdb_slice_t *value = &req->values[i];
1095
1081
 
1096
- if (req->handle.error) {
1097
- err = js_create_string(env, req->handle.error, error.emplace());
1098
- assert(err == 0);
1099
- } else {
1100
- for (size_t i = 0; i < len; i++) {
1082
+ if (req->exiting) {
1083
+ rocksdb_slice_destroy(key);
1084
+ rocksdb_slice_destroy(value);
1085
+ } else {
1101
1086
  js_arraybuffer_t result;
1102
1087
 
1103
- rocksdb_slice_t *key = &req->keys[i];
1104
-
1105
1088
  err = rocksdb_native__try_create_external_arraybuffer(env, const_cast<char *>(key->data), key->len, result);
1106
1089
  assert(err == 0);
1107
1090
 
1108
1091
  keys.push_back(result);
1109
1092
 
1110
- rocksdb_slice_t *value = &req->values[i];
1111
-
1112
1093
  err = rocksdb_native__try_create_external_arraybuffer(env, const_cast<char *>(value->data), value->len, result);
1113
1094
  assert(err == 0);
1114
1095
 
1115
1096
  values.push_back(result);
1116
1097
  }
1117
1098
  }
1099
+ }
1118
1100
 
1119
- js_call_function_with_checkpoint(env, cb, ctx, error, keys, values);
1120
-
1121
- err = js_close_handle_scope(env, scope);
1122
- assert(err == 0);
1101
+ if (!req->exiting) {
1102
+ err = js_call_function_with_checkpoint(env, cb, ctx, error, keys, values);
1103
+ (void) err;
1123
1104
  }
1105
+
1106
+ err = js_close_handle_scope(env, scope);
1107
+ assert(err == 0);
1124
1108
  }
1125
1109
 
1126
1110
  static void
@@ -1139,8 +1123,6 @@ rocksdb_native_iterator_read(
1139
1123
 
1140
1124
  throw js_pending_exception;
1141
1125
  }
1142
-
1143
- req->active = true;
1144
1126
  }
1145
1127
 
1146
1128
  static js_arraybuffer_t
@@ -1189,57 +1171,56 @@ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
1189
1171
 
1190
1172
  auto db = reinterpret_cast<rocksdb_native_t *>(req->handle.req.db);
1191
1173
 
1174
+ auto len = req->handle.len;
1175
+
1192
1176
  auto env = req->env;
1193
1177
 
1194
- size_t len = req->handle.len;
1178
+ js_handle_scope_t *scope;
1179
+ err = js_open_handle_scope(env, &scope);
1180
+ assert(err == 0);
1195
1181
 
1196
- if (db->exiting) {
1197
- if (status == 0) {
1198
- for (size_t i = 0; i < len; i++) {
1199
- char *error = req->handle.errors[i];
1182
+ js_receiver_t ctx;
1183
+ err = js_get_reference_value(env, req->ctx, ctx);
1184
+ assert(err == 0);
1200
1185
 
1201
- if (error) continue;
1186
+ rocksdb_native_on_read_t cb;
1187
+ err = js_get_reference_value(env, req->on_read, cb);
1188
+ assert(err == 0);
1202
1189
 
1203
- rocksdb_slice_destroy(&req->reads[i].value);
1204
- }
1205
- }
1190
+ req->on_read.reset();
1191
+ req->ctx.reset();
1206
1192
 
1207
- req->on_read.reset();
1208
- req->ctx.reset();
1209
- } else {
1210
- js_handle_scope_t *scope;
1211
- err = js_open_handle_scope(env, &scope);
1212
- assert(err == 0);
1193
+ js_array_t errors;
1194
+ err = js_create_array(env, len, errors);
1195
+ assert(err == 0);
1213
1196
 
1214
- js_array_t errors;
1215
- err = js_create_array(env, len, errors);
1216
- assert(err == 0);
1197
+ js_array_t values;
1198
+ err = js_create_array(env, len, values);
1199
+ assert(err == 0);
1217
1200
 
1218
- js_array_t values;
1219
- err = js_create_array(env, len, values);
1220
- assert(err == 0);
1201
+ for (size_t i = 0; i < len; i++) {
1202
+ char *error = req->handle.errors[i];
1221
1203
 
1222
- for (size_t i = 0; i < len; i++) {
1223
- char *error = req->handle.errors[i];
1204
+ if (error) {
1205
+ js_string_t result;
1224
1206
 
1225
- if (error) {
1226
- js_string_t result;
1207
+ err = js_create_string(env, error, result);
1208
+ assert(err == 0);
1227
1209
 
1228
- err = js_create_string(env, error, result);
1229
- assert(err == 0);
1210
+ err = js_set_element(env, errors, i, result);
1211
+ assert(err == 0);
1212
+ } else {
1213
+ rocksdb_slice_t *value = &req->reads[i].value;
1230
1214
 
1231
- err = js_set_element(env, errors, i, result);
1232
- assert(err == 0);
1233
- } else {
1215
+ if (db->exiting) rocksdb_slice_destroy(value);
1216
+ else {
1234
1217
  js_arraybuffer_t result;
1235
1218
 
1236
- rocksdb_slice_t *slice = &req->reads[i].value;
1237
-
1238
- if (slice->data == nullptr && slice->len == size_t(-1)) {
1219
+ if (value->data == nullptr && value->len == size_t(-1)) {
1239
1220
  err = js_get_null(env, static_cast<js_value_t **>(result));
1240
1221
  assert(err == 0);
1241
1222
  } else {
1242
- err = rocksdb_native__try_create_external_arraybuffer(env, const_cast<char *>(slice->data), slice->len, result);
1223
+ err = rocksdb_native__try_create_external_arraybuffer(env, const_cast<char *>(value->data), value->len, result);
1243
1224
  assert(err == 0);
1244
1225
  }
1245
1226
 
@@ -1247,23 +1228,15 @@ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
1247
1228
  assert(err == 0);
1248
1229
  }
1249
1230
  }
1231
+ }
1250
1232
 
1251
- js_receiver_t ctx;
1252
- err = js_get_reference_value(env, req->ctx, ctx);
1253
- assert(err == 0);
1254
-
1255
- rocksdb_native_on_read_t cb;
1256
- err = js_get_reference_value(env, req->on_read, cb);
1257
- assert(err == 0);
1258
-
1259
- req->on_read.reset();
1260
- req->ctx.reset();
1261
-
1262
- js_call_function_with_checkpoint(env, cb, ctx, errors, values);
1263
-
1264
- err = js_close_handle_scope(env, scope);
1265
- assert(err == 0);
1233
+ if (!db->exiting) {
1234
+ err = js_call_function_with_checkpoint(env, cb, ctx, errors, values);
1235
+ (void) err;
1266
1236
  }
1237
+
1238
+ err = js_close_handle_scope(env, scope);
1239
+ assert(err == 0);
1267
1240
  }
1268
1241
 
1269
1242
  static void
@@ -1393,37 +1366,35 @@ rocksdb_native__on_write(rocksdb_write_batch_t *handle, int status) {
1393
1366
 
1394
1367
  auto env = req->env;
1395
1368
 
1396
- if (db->exiting) {
1397
- req->on_write.reset();
1398
- req->ctx.reset();
1399
- } else {
1400
- js_handle_scope_t *scope;
1401
- err = js_open_handle_scope(env, &scope);
1402
- assert(err == 0);
1403
-
1404
- std::optional<js_string_t> error;
1405
-
1406
- if (req->handle.error) {
1407
- err = js_create_string(env, req->handle.error, error.emplace());
1408
- assert(err == 0);
1409
- }
1369
+ js_handle_scope_t *scope;
1370
+ err = js_open_handle_scope(env, &scope);
1371
+ assert(err == 0);
1410
1372
 
1411
- js_receiver_t ctx;
1412
- err = js_get_reference_value(env, req->ctx, ctx);
1413
- assert(err == 0);
1373
+ js_receiver_t ctx;
1374
+ err = js_get_reference_value(env, req->ctx, ctx);
1375
+ assert(err == 0);
1414
1376
 
1415
- rocksdb_native_on_write_t cb;
1416
- err = js_get_reference_value(env, req->on_write, cb);
1417
- assert(err == 0);
1377
+ rocksdb_native_on_write_t cb;
1378
+ err = js_get_reference_value(env, req->on_write, cb);
1379
+ assert(err == 0);
1418
1380
 
1419
- req->on_write.reset();
1420
- req->ctx.reset();
1381
+ req->on_write.reset();
1382
+ req->ctx.reset();
1421
1383
 
1422
- js_call_function_with_checkpoint(env, cb, ctx, error);
1384
+ std::optional<js_string_t> error;
1423
1385
 
1424
- err = js_close_handle_scope(env, scope);
1386
+ if (req->handle.error) {
1387
+ err = js_create_string(env, req->handle.error, error.emplace());
1425
1388
  assert(err == 0);
1426
1389
  }
1390
+
1391
+ if (!db->exiting) {
1392
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
1393
+ (void) err;
1394
+ }
1395
+
1396
+ err = js_close_handle_scope(env, scope);
1397
+ assert(err == 0);
1427
1398
  }
1428
1399
 
1429
1400
  static void
@@ -1544,37 +1515,35 @@ rocksdb_native__on_flush(rocksdb_flush_t *handle, int status) {
1544
1515
 
1545
1516
  auto env = req->env;
1546
1517
 
1547
- if (db->exiting) {
1548
- req->on_flush.reset();
1549
- req->ctx.reset();
1550
- } else {
1551
- js_handle_scope_t *scope;
1552
- err = js_open_handle_scope(env, &scope);
1553
- assert(err == 0);
1554
-
1555
- std::optional<js_string_t> error;
1556
-
1557
- if (req->handle.error) {
1558
- err = js_create_string(env, req->handle.error, error.emplace());
1559
- assert(err == 0);
1560
- }
1518
+ js_handle_scope_t *scope;
1519
+ err = js_open_handle_scope(env, &scope);
1520
+ assert(err == 0);
1561
1521
 
1562
- js_receiver_t ctx;
1563
- err = js_get_reference_value(env, req->ctx, ctx);
1564
- assert(err == 0);
1522
+ js_receiver_t ctx;
1523
+ err = js_get_reference_value(env, req->ctx, ctx);
1524
+ assert(err == 0);
1565
1525
 
1566
- rocksdb_native_on_flush_t cb;
1567
- err = js_get_reference_value(env, req->on_flush, cb);
1568
- assert(err == 0);
1526
+ rocksdb_native_on_flush_t cb;
1527
+ err = js_get_reference_value(env, req->on_flush, cb);
1528
+ assert(err == 0);
1569
1529
 
1570
- req->on_flush.reset();
1571
- req->ctx.reset();
1530
+ req->on_flush.reset();
1531
+ req->ctx.reset();
1572
1532
 
1573
- js_call_function_with_checkpoint(env, cb, ctx, error);
1533
+ std::optional<js_string_t> error;
1574
1534
 
1575
- err = js_close_handle_scope(env, scope);
1535
+ if (req->handle.error) {
1536
+ err = js_create_string(env, req->handle.error, error.emplace());
1576
1537
  assert(err == 0);
1577
1538
  }
1539
+
1540
+ if (!db->exiting) {
1541
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
1542
+ (void) err;
1543
+ }
1544
+
1545
+ err = js_close_handle_scope(env, scope);
1546
+ assert(err == 0);
1578
1547
  }
1579
1548
 
1580
1549
  static js_arraybuffer_t
@@ -1626,37 +1595,35 @@ rocksdb_native__on_compact_range(rocksdb_compact_range_t *handle, int status) {
1626
1595
 
1627
1596
  auto env = req->env;
1628
1597
 
1629
- if (db->exiting) {
1630
- req->on_compact_range.reset();
1631
- req->ctx.reset();
1632
- } else {
1633
- js_handle_scope_t *scope;
1634
- err = js_open_handle_scope(env, &scope);
1635
- assert(err == 0);
1636
-
1637
- std::optional<js_string_t> error;
1638
-
1639
- if (req->handle.error) {
1640
- err = js_create_string(env, req->handle.error, error.emplace());
1641
- assert(err == 0);
1642
- }
1598
+ js_handle_scope_t *scope;
1599
+ err = js_open_handle_scope(env, &scope);
1600
+ assert(err == 0);
1643
1601
 
1644
- js_receiver_t ctx;
1645
- err = js_get_reference_value(env, req->ctx, ctx);
1646
- assert(err == 0);
1602
+ js_receiver_t ctx;
1603
+ err = js_get_reference_value(env, req->ctx, ctx);
1604
+ assert(err == 0);
1647
1605
 
1648
- rocksdb_native_on_compact_range_t cb;
1649
- err = js_get_reference_value(env, req->on_compact_range, cb);
1650
- assert(err == 0);
1606
+ rocksdb_native_on_compact_range_t cb;
1607
+ err = js_get_reference_value(env, req->on_compact_range, cb);
1608
+ assert(err == 0);
1651
1609
 
1652
- req->on_compact_range.reset();
1653
- req->ctx.reset();
1610
+ req->on_compact_range.reset();
1611
+ req->ctx.reset();
1654
1612
 
1655
- js_call_function_with_checkpoint(env, cb, ctx, error);
1613
+ std::optional<js_string_t> error;
1656
1614
 
1657
- err = js_close_handle_scope(env, scope);
1615
+ if (req->handle.error) {
1616
+ err = js_create_string(env, req->handle.error, error.emplace());
1658
1617
  assert(err == 0);
1659
1618
  }
1619
+
1620
+ if (!db->exiting) {
1621
+ err = js_call_function_with_checkpoint(env, cb, ctx, error);
1622
+ (void) err;
1623
+ }
1624
+
1625
+ err = js_close_handle_scope(env, scope);
1626
+ assert(err == 0);
1660
1627
  }
1661
1628
 
1662
1629
  static js_arraybuffer_t
@@ -1724,37 +1691,35 @@ rocksdb_native__on_approximate_size(rocksdb_approximate_size_t *handle, int stat
1724
1691
 
1725
1692
  auto env = req->env;
1726
1693
 
1727
- if (db->exiting) {
1728
- req->on_approximate_size.reset();
1729
- req->ctx.reset();
1730
- } else {
1731
- js_handle_scope_t *scope;
1732
- err = js_open_handle_scope(env, &scope);
1733
- assert(err == 0);
1734
-
1735
- std::optional<js_string_t> error;
1736
-
1737
- if (req->handle.error) {
1738
- err = js_create_string(env, req->handle.error, error.emplace());
1739
- assert(err == 0);
1740
- }
1694
+ js_handle_scope_t *scope;
1695
+ err = js_open_handle_scope(env, &scope);
1696
+ assert(err == 0);
1741
1697
 
1742
- js_receiver_t ctx;
1743
- err = js_get_reference_value(env, req->ctx, ctx);
1744
- assert(err == 0);
1698
+ js_receiver_t ctx;
1699
+ err = js_get_reference_value(env, req->ctx, ctx);
1700
+ assert(err == 0);
1745
1701
 
1746
- rocksdb_native_on_approximate_size_t cb;
1747
- err = js_get_reference_value(env, req->on_approximate_size, cb);
1748
- assert(err == 0);
1702
+ rocksdb_native_on_approximate_size_t cb;
1703
+ err = js_get_reference_value(env, req->on_approximate_size, cb);
1704
+ assert(err == 0);
1749
1705
 
1750
- req->on_approximate_size.reset();
1751
- req->ctx.reset();
1706
+ req->on_approximate_size.reset();
1707
+ req->ctx.reset();
1752
1708
 
1753
- js_call_function_with_checkpoint(env, cb, ctx, error, req->handle.result);
1709
+ std::optional<js_string_t> error;
1754
1710
 
1755
- err = js_close_handle_scope(env, scope);
1711
+ if (req->handle.error) {
1712
+ err = js_create_string(env, req->handle.error, error.emplace());
1756
1713
  assert(err == 0);
1757
1714
  }
1715
+
1716
+ if (!db->exiting) {
1717
+ err = js_call_function_with_checkpoint(env, cb, ctx, error, req->handle.result);
1718
+ (void) err;
1719
+ }
1720
+
1721
+ err = js_close_handle_scope(env, scope);
1722
+ assert(err == 0);
1758
1723
  }
1759
1724
 
1760
1725
  static js_arraybuffer_t
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rocksdb-native",
3
- "version": "3.11.2",
3
+ "version": "3.11.3",
4
4
  "description": "librocksdb bindings for JavaScript",
5
5
  "exports": {
6
6
  ".": "./index.js",