rocksdb-native 2.6.7 → 2.6.9

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/binding.c CHANGED
@@ -29,6 +29,7 @@ typedef struct {
29
29
  rocksdb_t handle;
30
30
 
31
31
  js_env_t *env;
32
+ js_ref_t *ctx;
32
33
 
33
34
  bool closing;
34
35
  bool exiting;
@@ -63,6 +64,11 @@ typedef struct {
63
64
  js_ref_t *on_open;
64
65
  js_ref_t *on_close;
65
66
  js_ref_t *on_read;
67
+
68
+ bool closing;
69
+ bool exiting;
70
+
71
+ js_deferred_teardown_t *teardown;
66
72
  } rocksdb_native_iterator_t;
67
73
 
68
74
  typedef struct {
@@ -114,30 +120,46 @@ rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
114
120
 
115
121
  js_deferred_teardown_t *teardown = db->teardown;
116
122
 
117
- js_handle_scope_t *scope;
118
- err = js_open_handle_scope(env, &scope);
119
- assert(err == 0);
123
+ if (db->exiting) {
124
+ if (db->closing) {
125
+ err = js_delete_reference(env, req->on_close);
126
+ assert(err == 0);
120
127
 
121
- js_value_t *ctx;
122
- err = js_get_reference_value(env, req->ctx, &ctx);
123
- assert(err == 0);
128
+ err = js_delete_reference(env, req->ctx);
129
+ assert(err == 0);
124
130
 
125
- js_value_t *cb;
126
- err = js_get_reference_value(env, req->on_close, &cb);
127
- assert(err == 0);
131
+ err = js_delete_reference(env, db->ctx);
132
+ assert(err == 0);
133
+ } else {
134
+ free(req);
135
+ }
136
+ } else {
137
+ js_handle_scope_t *scope;
138
+ err = js_open_handle_scope(env, &scope);
139
+ assert(err == 0);
128
140
 
129
- err = js_delete_reference(env, req->on_close);
130
- assert(err == 0);
141
+ js_value_t *ctx;
142
+ err = js_get_reference_value(env, req->ctx, &ctx);
143
+ assert(err == 0);
131
144
 
132
- err = js_delete_reference(env, req->ctx);
133
- assert(err == 0);
145
+ js_value_t *cb;
146
+ err = js_get_reference_value(env, req->on_close, &cb);
147
+ assert(err == 0);
148
+
149
+ err = js_delete_reference(env, req->on_close);
150
+ assert(err == 0);
151
+
152
+ err = js_delete_reference(env, req->ctx);
153
+ assert(err == 0);
154
+
155
+ err = js_delete_reference(env, db->ctx);
156
+ assert(err == 0);
134
157
 
135
- if (!db->exiting) {
136
158
  js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
137
- }
138
159
 
139
- err = js_close_handle_scope(env, scope);
140
- assert(err == 0);
160
+ err = js_close_handle_scope(env, scope);
161
+ assert(err == 0);
162
+ }
141
163
 
142
164
  err = js_finish_deferred_teardown_callback(teardown);
143
165
  assert(err == 0);
@@ -155,40 +177,46 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
155
177
 
156
178
  js_env_t *env = req->env;
157
179
 
158
- js_handle_scope_t *scope;
159
- err = js_open_handle_scope(env, &scope);
160
- assert(err == 0);
161
-
162
- js_value_t *ctx;
163
- err = js_get_reference_value(env, req->ctx, &ctx);
164
- assert(err == 0);
165
-
166
- js_value_t *cb;
167
- err = js_get_reference_value(env, req->on_open, &cb);
168
- assert(err == 0);
180
+ if (db->exiting) {
181
+ err = js_delete_reference(env, req->on_open);
182
+ assert(err == 0);
169
183
 
170
- err = js_delete_reference(env, req->on_open);
171
- assert(err == 0);
184
+ err = js_delete_reference(env, req->ctx);
185
+ assert(err == 0);
186
+ } else {
187
+ js_handle_scope_t *scope;
188
+ err = js_open_handle_scope(env, &scope);
189
+ assert(err == 0);
172
190
 
173
- err = js_delete_reference(env, req->ctx);
174
- assert(err == 0);
191
+ js_value_t *ctx;
192
+ err = js_get_reference_value(env, req->ctx, &ctx);
193
+ assert(err == 0);
175
194
 
176
- js_value_t *error;
195
+ js_value_t *cb;
196
+ err = js_get_reference_value(env, req->on_open, &cb);
197
+ assert(err == 0);
177
198
 
178
- if (req->handle.error) {
179
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
199
+ err = js_delete_reference(env, req->on_open);
180
200
  assert(err == 0);
181
- } else {
182
- err = js_get_null(env, &error);
201
+
202
+ err = js_delete_reference(env, req->ctx);
183
203
  assert(err == 0);
184
- }
185
204
 
186
- if (!db->exiting) {
205
+ js_value_t *error;
206
+
207
+ if (req->handle.error) {
208
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
209
+ assert(err == 0);
210
+ } else {
211
+ err = js_get_null(env, &error);
212
+ assert(err == 0);
213
+ }
214
+
187
215
  js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
188
- }
189
216
 
190
- err = js_close_handle_scope(env, scope);
191
- assert(err == 0);
217
+ err = js_close_handle_scope(env, scope);
218
+ assert(err == 0);
219
+ }
192
220
  }
193
221
 
194
222
  static void
@@ -203,36 +231,12 @@ rocksdb_native__on_teardown(js_deferred_teardown_t *handle, void *data) {
203
231
 
204
232
  if (db->closing) return;
205
233
 
206
- js_handle_scope_t *scope;
207
- err = js_open_handle_scope(env, &scope);
208
- assert(err == 0);
209
-
210
- js_value_t *ctx;
211
-
212
- rocksdb_native_close_t *req;
213
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_close_t), (void **) &req, &ctx);
214
- assert(err == 0);
234
+ rocksdb_native_close_t *req = malloc(sizeof(rocksdb_native_close_t));
215
235
 
216
- req->env = env;
217
236
  req->handle.data = (void *) req;
218
237
 
219
- err = js_create_reference(env, ctx, 1, &req->ctx);
220
- assert(err == 0);
221
-
222
- js_value_t *on_close;
223
- err = js_get_null(env, &on_close);
224
- assert(err == 0);
225
-
226
- err = js_create_reference(env, on_close, 1, &req->on_close);
227
- assert(err == 0);
228
-
229
- db->closing = true;
230
-
231
238
  err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_close);
232
239
  assert(err == 0);
233
-
234
- err = js_close_handle_scope(env, scope);
235
- assert(err == 0);
236
240
  }
237
241
 
238
242
  static js_value_t *
@@ -268,24 +272,24 @@ static js_value_t *
268
272
  rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
269
273
  int err;
270
274
 
271
- size_t argc = 5;
272
- js_value_t *argv[5];
275
+ size_t argc = 6;
276
+ js_value_t *argv[6];
273
277
 
274
278
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
275
279
  assert(err == 0);
276
280
 
277
- assert(argc == 5);
281
+ assert(argc == 6);
278
282
 
279
283
  rocksdb_native_t *db;
280
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
284
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &db, NULL);
281
285
  assert(err == 0);
282
286
 
283
287
  utf8_t path[4096 + 1 /* NULL */];
284
- err = js_get_value_string_utf8(env, argv[1], path, sizeof(path), NULL);
288
+ err = js_get_value_string_utf8(env, argv[2], path, sizeof(path), NULL);
285
289
  assert(err == 0);
286
290
 
287
291
  rocksdb_native_open_options_t *o;
288
- err = js_get_typedarray_info(env, argv[2], NULL, (void **) &o, NULL, NULL, NULL);
292
+ err = js_get_typedarray_info(env, argv[3], NULL, (void **) &o, NULL, NULL, NULL);
289
293
  assert(err == 0);
290
294
 
291
295
  rocksdb_options_t options = {
@@ -313,10 +317,13 @@ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
313
317
  req->env = env;
314
318
  req->handle.data = (void *) req;
315
319
 
316
- err = js_create_reference(env, argv[3], 1, &req->ctx);
320
+ err = js_create_reference(env, argv[0], 1, &db->ctx);
317
321
  assert(err == 0);
318
322
 
319
- err = js_create_reference(env, argv[4], 1, &req->on_open);
323
+ err = js_create_reference(env, argv[4], 1, &req->ctx);
324
+ assert(err == 0);
325
+
326
+ err = js_create_reference(env, argv[5], 1, &req->on_open);
320
327
  assert(err == 0);
321
328
 
322
329
  err = rocksdb_open(&db->handle, &req->handle, (const char *) path, &options, rocksdb_native__on_open);
@@ -371,14 +378,6 @@ static js_value_t *
371
378
  rocksdb_native_iterator_init(js_env_t *env, js_callback_info_t *info) {
372
379
  int err;
373
380
 
374
- size_t argc = 4;
375
- js_value_t *argv[4];
376
-
377
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
378
- assert(err == 0);
379
-
380
- assert(argc == 4);
381
-
382
381
  js_value_t *handle;
383
382
 
384
383
  rocksdb_native_iterator_t *req;
@@ -386,20 +385,10 @@ rocksdb_native_iterator_init(js_env_t *env, js_callback_info_t *info) {
386
385
  assert(err == 0);
387
386
 
388
387
  req->env = env;
388
+ req->closing = false;
389
+ req->exiting = false;
389
390
  req->handle.data = (void *) req;
390
391
 
391
- err = js_create_reference(env, argv[0], 1, &req->ctx);
392
- assert(err == 0);
393
-
394
- err = js_create_reference(env, argv[1], 1, &req->on_open);
395
- assert(err == 0);
396
-
397
- err = js_create_reference(env, argv[2], 1, &req->on_close);
398
- assert(err == 0);
399
-
400
- err = js_create_reference(env, argv[3], 1, &req->on_read);
401
- assert(err == 0);
402
-
403
392
  return handle;
404
393
  }
405
394
 
@@ -440,6 +429,75 @@ rocksdb_native_iterator_buffer(js_env_t *env, js_callback_info_t *info) {
440
429
  return handle;
441
430
  }
442
431
 
432
+ static void
433
+ rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
434
+ int err;
435
+
436
+ assert(status == 0);
437
+
438
+ rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
439
+
440
+ js_env_t *env = req->env;
441
+
442
+ js_deferred_teardown_t *teardown = req->teardown;
443
+
444
+ if (req->exiting) {
445
+ err = js_delete_reference(env, req->on_open);
446
+ assert(err == 0);
447
+
448
+ err = js_delete_reference(env, req->on_close);
449
+ assert(err == 0);
450
+
451
+ err = js_delete_reference(env, req->on_read);
452
+ assert(err == 0);
453
+
454
+ err = js_delete_reference(env, req->ctx);
455
+ assert(err == 0);
456
+ } else {
457
+ js_handle_scope_t *scope;
458
+ err = js_open_handle_scope(env, &scope);
459
+ assert(err == 0);
460
+
461
+ js_value_t *ctx;
462
+ err = js_get_reference_value(env, req->ctx, &ctx);
463
+ assert(err == 0);
464
+
465
+ js_value_t *cb;
466
+ err = js_get_reference_value(env, req->on_close, &cb);
467
+ assert(err == 0);
468
+
469
+ err = js_delete_reference(env, req->on_open);
470
+ assert(err == 0);
471
+
472
+ err = js_delete_reference(env, req->on_close);
473
+ assert(err == 0);
474
+
475
+ err = js_delete_reference(env, req->on_read);
476
+ assert(err == 0);
477
+
478
+ err = js_delete_reference(env, req->ctx);
479
+ assert(err == 0);
480
+
481
+ js_value_t *error;
482
+
483
+ if (req->handle.error) {
484
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
485
+ assert(err == 0);
486
+ } else {
487
+ err = js_get_null(env, &error);
488
+ assert(err == 0);
489
+ }
490
+
491
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
492
+
493
+ err = js_close_handle_scope(env, scope);
494
+ assert(err == 0);
495
+ }
496
+
497
+ err = js_finish_deferred_teardown_callback(teardown);
498
+ assert(err == 0);
499
+ }
500
+
443
501
  static void
444
502
  rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
445
503
  int err;
@@ -448,7 +506,7 @@ rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
448
506
 
449
507
  rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
450
508
 
451
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
509
+ if (req->exiting) return;
452
510
 
453
511
  js_env_t *env = req->env;
454
512
 
@@ -474,25 +532,37 @@ rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
474
532
  assert(err == 0);
475
533
  }
476
534
 
477
- if (!db->exiting) {
478
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
479
- }
535
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
480
536
 
481
537
  err = js_close_handle_scope(env, scope);
482
538
  assert(err == 0);
483
539
  }
484
540
 
541
+ static void
542
+ rocksdb_native__on_iterator_teardown(js_deferred_teardown_t *handle, void *data) {
543
+ int err;
544
+
545
+ rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) data;
546
+
547
+ req->exiting = true;
548
+
549
+ if (req->closing) return;
550
+
551
+ err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
552
+ assert(err == 0);
553
+ }
554
+
485
555
  static js_value_t *
486
556
  rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
487
557
  int err;
488
558
 
489
- size_t argc = 8;
490
- js_value_t *argv[8];
559
+ size_t argc = 12;
560
+ js_value_t *argv[12];
491
561
 
492
562
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
493
563
  assert(err == 0);
494
564
 
495
- assert(argc == 8);
565
+ assert(argc == 12);
496
566
 
497
567
  rocksdb_native_t *db;
498
568
  err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
@@ -533,64 +603,25 @@ rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
533
603
  assert(err == 0);
534
604
  }
535
605
 
536
- err = rocksdb_iterator_open(&db->handle, &req->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
606
+ err = js_create_reference(env, argv[8], 1, &req->ctx);
537
607
  assert(err == 0);
538
608
 
539
- return NULL;
540
- }
541
-
542
- static void
543
- rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
544
- int err;
545
-
546
- assert(status == 0);
547
-
548
- rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
549
-
550
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
551
-
552
- js_env_t *env = req->env;
553
-
554
- js_handle_scope_t *scope;
555
- err = js_open_handle_scope(env, &scope);
609
+ err = js_create_reference(env, argv[9], 1, &req->on_open);
556
610
  assert(err == 0);
557
611
 
558
- js_value_t *ctx;
559
- err = js_get_reference_value(env, req->ctx, &ctx);
612
+ err = js_create_reference(env, argv[10], 1, &req->on_close);
560
613
  assert(err == 0);
561
614
 
562
- js_value_t *cb;
563
- err = js_get_reference_value(env, req->on_close, &cb);
615
+ err = js_create_reference(env, argv[11], 1, &req->on_read);
564
616
  assert(err == 0);
565
617
 
566
- err = js_delete_reference(env, req->on_open);
567
- assert(err == 0);
568
-
569
- err = js_delete_reference(env, req->on_close);
570
- assert(err == 0);
571
-
572
- err = js_delete_reference(env, req->on_read);
618
+ err = rocksdb_iterator_open(&db->handle, &req->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
573
619
  assert(err == 0);
574
620
 
575
- err = js_delete_reference(env, req->ctx);
621
+ err = js_add_deferred_teardown_callback(env, rocksdb_native__on_iterator_teardown, (void *) req, &req->teardown);
576
622
  assert(err == 0);
577
623
 
578
- js_value_t *error;
579
-
580
- if (req->handle.error) {
581
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
582
- assert(err == 0);
583
- } else {
584
- err = js_get_null(env, &error);
585
- assert(err == 0);
586
- }
587
-
588
- if (!db->exiting) {
589
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
590
- }
591
-
592
- err = js_close_handle_scope(env, scope);
593
- assert(err == 0);
624
+ return NULL;
594
625
  }
595
626
 
596
627
  static js_value_t *
@@ -609,6 +640,8 @@ rocksdb_native_iterator_close(js_env_t *env, js_callback_info_t *info) {
609
640
  err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
610
641
  assert(err == 0);
611
642
 
643
+ req->closing = true;
644
+
612
645
  err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
613
646
  assert(err == 0);
614
647
 
@@ -625,66 +658,76 @@ rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
625
658
 
626
659
  rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
627
660
 
628
- js_env_t *env = req->env;
629
-
630
- js_handle_scope_t *scope;
631
- err = js_open_handle_scope(env, &scope);
632
- assert(err == 0);
633
-
634
- js_value_t *ctx;
635
- err = js_get_reference_value(env, req->ctx, &ctx);
636
- assert(err == 0);
661
+ size_t len = req->handle.len;
637
662
 
638
- js_value_t *cb;
639
- err = js_get_reference_value(env, req->on_read, &cb);
640
- assert(err == 0);
663
+ if (db->exiting) {
664
+ if (status == 0 && req->handle.error == NULL) {
665
+ for (size_t i = 0; i < len; i++) {
666
+ js_value_t *result;
641
667
 
642
- size_t len = req->handle.len;
668
+ rocksdb_slice_destroy(&req->keys[i]);
643
669
 
644
- js_value_t *keys;
645
- err = js_create_array_with_length(env, len, &keys);
646
- assert(err == 0);
670
+ rocksdb_slice_destroy(&req->values[i]);
671
+ }
672
+ }
673
+ } else {
674
+ js_env_t *env = req->env;
647
675
 
648
- js_value_t *values;
649
- err = js_create_array_with_length(env, len, &values);
650
- assert(err == 0);
676
+ js_handle_scope_t *scope;
677
+ err = js_open_handle_scope(env, &scope);
678
+ assert(err == 0);
651
679
 
652
- js_value_t *error;
680
+ js_value_t *ctx;
681
+ err = js_get_reference_value(env, req->ctx, &ctx);
682
+ assert(err == 0);
653
683
 
654
- if (req->handle.error) {
655
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
684
+ js_value_t *cb;
685
+ err = js_get_reference_value(env, req->on_read, &cb);
656
686
  assert(err == 0);
657
- } else {
658
- err = js_get_null(env, &error);
687
+
688
+ js_value_t *keys;
689
+ err = js_create_array_with_length(env, len, &keys);
659
690
  assert(err == 0);
660
691
 
661
- for (size_t i = 0; i < len; i++) {
662
- js_value_t *result;
692
+ js_value_t *values;
693
+ err = js_create_array_with_length(env, len, &values);
694
+ assert(err == 0);
663
695
 
664
- rocksdb_slice_t *key = &req->keys[i];
696
+ js_value_t *error;
665
697
 
666
- err = js_create_external_arraybuffer(env, (void *) key->data, key->len, rocksdb_native__on_free, NULL, &result);
698
+ if (req->handle.error) {
699
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
667
700
  assert(err == 0);
668
-
669
- err = js_set_element(env, keys, i, result);
701
+ } else {
702
+ err = js_get_null(env, &error);
670
703
  assert(err == 0);
671
704
 
672
- rocksdb_slice_t *value = &req->values[i];
705
+ for (size_t i = 0; i < len; i++) {
706
+ js_value_t *result;
673
707
 
674
- err = js_create_external_arraybuffer(env, (void *) value->data, value->len, rocksdb_native__on_free, NULL, &result);
675
- assert(err == 0);
708
+ rocksdb_slice_t *key = &req->keys[i];
676
709
 
677
- err = js_set_element(env, values, i, result);
678
- assert(err == 0);
710
+ err = js_create_external_arraybuffer(env, (void *) key->data, key->len, rocksdb_native__on_free, NULL, &result);
711
+ assert(err == 0);
712
+
713
+ err = js_set_element(env, keys, i, result);
714
+ assert(err == 0);
715
+
716
+ rocksdb_slice_t *value = &req->values[i];
717
+
718
+ err = js_create_external_arraybuffer(env, (void *) value->data, value->len, rocksdb_native__on_free, NULL, &result);
719
+ assert(err == 0);
720
+
721
+ err = js_set_element(env, values, i, result);
722
+ assert(err == 0);
723
+ }
679
724
  }
680
- }
681
725
 
682
- if (!db->exiting) {
683
726
  js_call_function_with_checkpoint(env, ctx, cb, 3, (js_value_t *[]) {error, keys, values}, NULL);
684
- }
685
727
 
686
- err = js_close_handle_scope(env, scope);
687
- assert(err == 0);
728
+ err = js_close_handle_scope(env, scope);
729
+ assert(err == 0);
730
+ }
688
731
  }
689
732
 
690
733
  static js_value_t *
@@ -780,62 +823,80 @@ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
780
823
 
781
824
  js_env_t *env = req->env;
782
825
 
783
- js_handle_scope_t *scope;
784
- err = js_open_handle_scope(env, &scope);
785
- assert(err == 0);
786
-
787
826
  size_t len = req->handle.len;
788
827
 
789
- js_value_t *errors;
790
- err = js_create_array_with_length(env, len, &errors);
791
- assert(err == 0);
828
+ if (db->exiting) {
829
+ if (status == 0) {
830
+ for (size_t i = 0; i < len; i++) {
831
+ js_value_t *result;
792
832
 
793
- js_value_t *values;
794
- err = js_create_array_with_length(env, len, &values);
795
- assert(err == 0);
833
+ char *error = req->errors[i];
796
834
 
797
- for (size_t i = 0; i < len; i++) {
798
- js_value_t *result;
835
+ if (error) continue;
799
836
 
800
- char *error = req->errors[i];
837
+ rocksdb_slice_destroy(&req->reads[i].value);
838
+ }
839
+ }
801
840
 
802
- if (error) {
803
- err = js_create_string_utf8(env, (utf8_t *) error, -1, &result);
804
- assert(err == 0);
841
+ err = js_delete_reference(env, req->on_status);
842
+ assert(err == 0);
805
843
 
806
- err = js_set_element(env, errors, i, result);
807
- assert(err == 0);
808
- } else {
809
- rocksdb_slice_t *slice = &req->reads[i].value;
844
+ err = js_delete_reference(env, req->ctx);
845
+ assert(err == 0);
846
+ } else {
847
+ js_handle_scope_t *scope;
848
+ err = js_open_handle_scope(env, &scope);
849
+ assert(err == 0);
810
850
 
811
- err = js_create_external_arraybuffer(env, (void *) slice->data, slice->len, rocksdb_native__on_free, NULL, &result);
812
- assert(err == 0);
851
+ js_value_t *errors;
852
+ err = js_create_array_with_length(env, len, &errors);
853
+ assert(err == 0);
813
854
 
814
- err = js_set_element(env, values, i, result);
815
- assert(err == 0);
855
+ js_value_t *values;
856
+ err = js_create_array_with_length(env, len, &values);
857
+ assert(err == 0);
858
+
859
+ for (size_t i = 0; i < len; i++) {
860
+ js_value_t *result;
861
+
862
+ char *error = req->errors[i];
863
+
864
+ if (error) {
865
+ err = js_create_string_utf8(env, (utf8_t *) error, -1, &result);
866
+ assert(err == 0);
867
+
868
+ err = js_set_element(env, errors, i, result);
869
+ assert(err == 0);
870
+ } else {
871
+ rocksdb_slice_t *slice = &req->reads[i].value;
872
+
873
+ err = js_create_external_arraybuffer(env, (void *) slice->data, slice->len, rocksdb_native__on_free, NULL, &result);
874
+ assert(err == 0);
875
+
876
+ err = js_set_element(env, values, i, result);
877
+ assert(err == 0);
878
+ }
816
879
  }
817
- }
818
880
 
819
- js_value_t *ctx;
820
- err = js_get_reference_value(env, req->ctx, &ctx);
821
- assert(err == 0);
881
+ js_value_t *ctx;
882
+ err = js_get_reference_value(env, req->ctx, &ctx);
883
+ assert(err == 0);
822
884
 
823
- js_value_t *cb;
824
- err = js_get_reference_value(env, req->on_status, &cb);
825
- assert(err == 0);
885
+ js_value_t *cb;
886
+ err = js_get_reference_value(env, req->on_status, &cb);
887
+ assert(err == 0);
826
888
 
827
- err = js_delete_reference(env, req->on_status);
828
- assert(err == 0);
889
+ err = js_delete_reference(env, req->on_status);
890
+ assert(err == 0);
829
891
 
830
- err = js_delete_reference(env, req->ctx);
831
- assert(err == 0);
892
+ err = js_delete_reference(env, req->ctx);
893
+ assert(err == 0);
832
894
 
833
- if (!db->exiting) {
834
895
  js_call_function_with_checkpoint(env, ctx, cb, 2, (js_value_t *[]) {errors, values}, NULL);
835
- }
836
896
 
837
- err = js_close_handle_scope(env, scope);
838
- assert(err == 0);
897
+ err = js_close_handle_scope(env, scope);
898
+ assert(err == 0);
899
+ }
839
900
  }
840
901
 
841
902
  static js_value_t *
@@ -983,40 +1044,46 @@ rocksdb_native__on_write(rocksdb_write_batch_t *handle, int status) {
983
1044
 
984
1045
  js_env_t *env = req->env;
985
1046
 
986
- js_handle_scope_t *scope;
987
- err = js_open_handle_scope(env, &scope);
988
- assert(err == 0);
989
-
990
- js_value_t *error;
1047
+ if (db->exiting) {
1048
+ err = js_delete_reference(env, req->on_status);
1049
+ assert(err == 0);
991
1050
 
992
- if (req->handle.error) {
993
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
1051
+ err = js_delete_reference(env, req->ctx);
994
1052
  assert(err == 0);
995
1053
  } else {
996
- err = js_get_null(env, &error);
1054
+ js_handle_scope_t *scope;
1055
+ err = js_open_handle_scope(env, &scope);
997
1056
  assert(err == 0);
998
- }
999
1057
 
1000
- js_value_t *ctx;
1001
- err = js_get_reference_value(env, req->ctx, &ctx);
1002
- assert(err == 0);
1058
+ js_value_t *error;
1003
1059
 
1004
- js_value_t *cb;
1005
- err = js_get_reference_value(env, req->on_status, &cb);
1006
- assert(err == 0);
1060
+ if (req->handle.error) {
1061
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
1062
+ assert(err == 0);
1063
+ } else {
1064
+ err = js_get_null(env, &error);
1065
+ assert(err == 0);
1066
+ }
1007
1067
 
1008
- err = js_delete_reference(env, req->on_status);
1009
- assert(err == 0);
1068
+ js_value_t *ctx;
1069
+ err = js_get_reference_value(env, req->ctx, &ctx);
1070
+ assert(err == 0);
1010
1071
 
1011
- err = js_delete_reference(env, req->ctx);
1012
- assert(err == 0);
1072
+ js_value_t *cb;
1073
+ err = js_get_reference_value(env, req->on_status, &cb);
1074
+ assert(err == 0);
1075
+
1076
+ err = js_delete_reference(env, req->on_status);
1077
+ assert(err == 0);
1078
+
1079
+ err = js_delete_reference(env, req->ctx);
1080
+ assert(err == 0);
1013
1081
 
1014
- if (!db->exiting) {
1015
1082
  js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
1016
- }
1017
1083
 
1018
- err = js_close_handle_scope(env, scope);
1019
- assert(err == 0);
1084
+ err = js_close_handle_scope(env, scope);
1085
+ assert(err == 0);
1086
+ }
1020
1087
  }
1021
1088
 
1022
1089
  static js_value_t *
package/index.js CHANGED
@@ -79,7 +79,7 @@ module.exports = class RocksDB extends ReadyResource {
79
79
  req.reject = reject
80
80
  })
81
81
 
82
- req.handle = binding.open(this._handle, this.path, opts, req, onopen)
82
+ req.handle = binding.open(this, this._handle, this.path, opts, req, onopen)
83
83
 
84
84
  await promise
85
85
 
package/lib/iterator.js CHANGED
@@ -99,12 +99,7 @@ module.exports = class RocksDBIterator extends Readable {
99
99
  }
100
100
 
101
101
  _init() {
102
- this._handle = binding.iteratorInit(
103
- this,
104
- this._onopen,
105
- this._onclose,
106
- this._onread
107
- )
102
+ this._handle = binding.iteratorInit()
108
103
  this._buffer = binding.iteratorBuffer(this._handle, this._capacity)
109
104
  }
110
105
 
@@ -121,7 +116,11 @@ module.exports = class RocksDBIterator extends Readable {
121
116
  this._lt,
122
117
  this._lte,
123
118
  this._reverse,
124
- this._snapshot ? this._snapshot._handle : null
119
+ this._snapshot ? this._snapshot._handle : null,
120
+ this,
121
+ this._onopen,
122
+ this._onclose,
123
+ this._onread
125
124
  )
126
125
  }
127
126
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rocksdb-native",
3
- "version": "2.6.7",
3
+ "version": "2.6.9",
4
4
  "description": "librocksdb bindings for JavaScript",
5
5
  "exports": {
6
6
  ".": "./index.js",