rocksdb-native 2.6.5 → 2.6.7

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
@@ -27,6 +27,13 @@ typedef struct {
27
27
 
28
28
  typedef struct {
29
29
  rocksdb_t handle;
30
+
31
+ js_env_t *env;
32
+
33
+ bool closing;
34
+ bool exiting;
35
+
36
+ js_deferred_teardown_t *teardown;
30
37
  } rocksdb_native_t;
31
38
 
32
39
  typedef struct {
@@ -89,43 +96,63 @@ typedef struct {
89
96
  } rocksdb_native_snapshot_t;
90
97
 
91
98
  static void
92
- rocksdb_native__on_free (js_env_t *env, void *data, void *finalize_hint) {
99
+ rocksdb_native__on_free(js_env_t *env, void *data, void *finalize_hint) {
93
100
  free(data);
94
101
  }
95
102
 
96
- static js_value_t *
97
- rocksdb_native_init (js_env_t *env, js_callback_info_t *info) {
103
+ static void
104
+ rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
98
105
  int err;
99
106
 
100
- uv_loop_t *loop;
101
- err = js_get_env_loop(env, &loop);
107
+ assert(status == 0);
108
+
109
+ rocksdb_native_close_t *req = (rocksdb_native_close_t *) handle->data;
110
+
111
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
112
+
113
+ js_env_t *env = req->env;
114
+
115
+ js_deferred_teardown_t *teardown = db->teardown;
116
+
117
+ js_handle_scope_t *scope;
118
+ err = js_open_handle_scope(env, &scope);
102
119
  assert(err == 0);
103
120
 
104
- js_value_t *handle;
121
+ js_value_t *ctx;
122
+ err = js_get_reference_value(env, req->ctx, &ctx);
123
+ assert(err == 0);
105
124
 
106
- rocksdb_native_t *db;
107
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_t), (void **) &db, &handle);
125
+ js_value_t *cb;
126
+ err = js_get_reference_value(env, req->on_close, &cb);
108
127
  assert(err == 0);
109
128
 
110
- err = rocksdb_init(loop, &db->handle);
129
+ err = js_delete_reference(env, req->on_close);
111
130
  assert(err == 0);
112
131
 
113
- return handle;
114
- }
132
+ err = js_delete_reference(env, req->ctx);
133
+ assert(err == 0);
115
134
 
116
- static inline uint64_t
117
- rocksdb_native__to_uint6 (rocksdb_native_uint64_t n) {
118
- return n.high * 0x100000000 + n.low;
135
+ if (!db->exiting) {
136
+ js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
137
+ }
138
+
139
+ err = js_close_handle_scope(env, scope);
140
+ assert(err == 0);
141
+
142
+ err = js_finish_deferred_teardown_callback(teardown);
143
+ assert(err == 0);
119
144
  }
120
145
 
121
146
  static void
122
- rocksdb_native__on_open (rocksdb_open_t *handle, int status) {
147
+ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
123
148
  int err;
124
149
 
125
150
  assert(status == 0);
126
151
 
127
152
  rocksdb_native_open_t *req = (rocksdb_native_open_t *) handle->data;
128
153
 
154
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
155
+
129
156
  js_env_t *env = req->env;
130
157
 
131
158
  js_handle_scope_t *scope;
@@ -140,6 +167,12 @@ rocksdb_native__on_open (rocksdb_open_t *handle, int status) {
140
167
  err = js_get_reference_value(env, req->on_open, &cb);
141
168
  assert(err == 0);
142
169
 
170
+ err = js_delete_reference(env, req->on_open);
171
+ assert(err == 0);
172
+
173
+ err = js_delete_reference(env, req->ctx);
174
+ assert(err == 0);
175
+
143
176
  js_value_t *error;
144
177
 
145
178
  if (req->handle.error) {
@@ -150,20 +183,89 @@ rocksdb_native__on_open (rocksdb_open_t *handle, int status) {
150
183
  assert(err == 0);
151
184
  }
152
185
 
153
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]){error}, NULL);
186
+ if (!db->exiting) {
187
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
188
+ }
154
189
 
155
190
  err = js_close_handle_scope(env, scope);
156
191
  assert(err == 0);
192
+ }
157
193
 
158
- err = js_delete_reference(env, req->on_open);
194
+ static void
195
+ rocksdb_native__on_teardown(js_deferred_teardown_t *handle, void *data) {
196
+ int err;
197
+
198
+ rocksdb_native_t *db = (rocksdb_native_t *) data;
199
+
200
+ js_env_t *env = db->env;
201
+
202
+ db->exiting = true;
203
+
204
+ if (db->closing) return;
205
+
206
+ js_handle_scope_t *scope;
207
+ err = js_open_handle_scope(env, &scope);
159
208
  assert(err == 0);
160
209
 
161
- err = js_delete_reference(env, req->ctx);
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);
215
+
216
+ req->env = env;
217
+ req->handle.data = (void *) req;
218
+
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
+ err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_close);
232
+ assert(err == 0);
233
+
234
+ err = js_close_handle_scope(env, scope);
162
235
  assert(err == 0);
163
236
  }
164
237
 
165
238
  static js_value_t *
166
- rocksdb_native_open (js_env_t *env, js_callback_info_t *info) {
239
+ rocksdb_native_init(js_env_t *env, js_callback_info_t *info) {
240
+ int err;
241
+
242
+ uv_loop_t *loop;
243
+ err = js_get_env_loop(env, &loop);
244
+ assert(err == 0);
245
+
246
+ js_value_t *handle;
247
+
248
+ rocksdb_native_t *db;
249
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_t), (void **) &db, &handle);
250
+ assert(err == 0);
251
+
252
+ db->env = env;
253
+ db->closing = false;
254
+ db->exiting = false;
255
+
256
+ err = rocksdb_init(loop, &db->handle);
257
+ assert(err == 0);
258
+
259
+ return handle;
260
+ }
261
+
262
+ static inline uint64_t
263
+ rocksdb_native__to_uint64(rocksdb_native_uint64_t n) {
264
+ return n.high * 0x100000000 + n.low;
265
+ }
266
+
267
+ static js_value_t *
268
+ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
167
269
  int err;
168
270
 
169
271
  size_t argc = 5;
@@ -191,13 +293,13 @@ rocksdb_native_open (js_env_t *env, js_callback_info_t *info) {
191
293
  o->read_only,
192
294
  o->create_if_missing,
193
295
  o->max_background_jobs,
194
- rocksdb_native__to_uint6(o->bytes_per_sync),
296
+ rocksdb_native__to_uint64(o->bytes_per_sync),
195
297
  o->compation_style,
196
298
  o->enable_blob_files,
197
- rocksdb_native__to_uint6(o->min_blob_size),
198
- rocksdb_native__to_uint6(o->blob_file_size),
299
+ rocksdb_native__to_uint64(o->min_blob_size),
300
+ rocksdb_native__to_uint64(o->blob_file_size),
199
301
  o->enable_blob_garbage_collection,
200
- rocksdb_native__to_uint6(o->table_block_size),
302
+ rocksdb_native__to_uint64(o->table_block_size),
201
303
  o->table_cache_index_and_filter_blocks,
202
304
  o->table_format_version
203
305
  };
@@ -220,45 +322,14 @@ rocksdb_native_open (js_env_t *env, js_callback_info_t *info) {
220
322
  err = rocksdb_open(&db->handle, &req->handle, (const char *) path, &options, rocksdb_native__on_open);
221
323
  assert(err == 0);
222
324
 
223
- return handle;
224
- }
225
-
226
- static void
227
- rocksdb_native__on_close (rocksdb_close_t *handle, int status) {
228
- int err;
229
-
230
- assert(status == 0);
231
-
232
- rocksdb_native_close_t *req = (rocksdb_native_close_t *) handle->data;
233
-
234
- js_env_t *env = req->env;
235
-
236
- js_handle_scope_t *scope;
237
- err = js_open_handle_scope(env, &scope);
238
- assert(err == 0);
239
-
240
- js_value_t *ctx;
241
- err = js_get_reference_value(env, req->ctx, &ctx);
325
+ err = js_add_deferred_teardown_callback(env, rocksdb_native__on_teardown, (void *) db, &db->teardown);
242
326
  assert(err == 0);
243
327
 
244
- js_value_t *cb;
245
- err = js_get_reference_value(env, req->on_close, &cb);
246
- assert(err == 0);
247
-
248
- js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
249
-
250
- err = js_close_handle_scope(env, scope);
251
- assert(err == 0);
252
-
253
- err = js_delete_reference(env, req->on_close);
254
- assert(err == 0);
255
-
256
- err = js_delete_reference(env, req->ctx);
257
- assert(err == 0);
328
+ return handle;
258
329
  }
259
330
 
260
331
  static js_value_t *
261
- rocksdb_native_close (js_env_t *env, js_callback_info_t *info) {
332
+ rocksdb_native_close(js_env_t *env, js_callback_info_t *info) {
262
333
  int err;
263
334
 
264
335
  size_t argc = 3;
@@ -288,6 +359,8 @@ rocksdb_native_close (js_env_t *env, js_callback_info_t *info) {
288
359
  err = js_create_reference(env, argv[2], 1, &req->on_close);
289
360
  assert(err == 0);
290
361
 
362
+ db->closing = true;
363
+
291
364
  err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_close);
292
365
  assert(err == 0);
293
366
 
@@ -295,7 +368,7 @@ rocksdb_native_close (js_env_t *env, js_callback_info_t *info) {
295
368
  }
296
369
 
297
370
  static js_value_t *
298
- rocksdb_native_iterator_init (js_env_t *env, js_callback_info_t *info) {
371
+ rocksdb_native_iterator_init(js_env_t *env, js_callback_info_t *info) {
299
372
  int err;
300
373
 
301
374
  size_t argc = 4;
@@ -308,30 +381,30 @@ rocksdb_native_iterator_init (js_env_t *env, js_callback_info_t *info) {
308
381
 
309
382
  js_value_t *handle;
310
383
 
311
- rocksdb_native_iterator_t *iterator;
312
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_iterator_t), (void **) &iterator, &handle);
384
+ rocksdb_native_iterator_t *req;
385
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_iterator_t), (void **) &req, &handle);
313
386
  assert(err == 0);
314
387
 
315
- iterator->env = env;
316
- iterator->handle.data = (void *) iterator;
388
+ req->env = env;
389
+ req->handle.data = (void *) req;
317
390
 
318
- err = js_create_reference(env, argv[0], 1, &iterator->ctx);
391
+ err = js_create_reference(env, argv[0], 1, &req->ctx);
319
392
  assert(err == 0);
320
393
 
321
- err = js_create_reference(env, argv[1], 1, &iterator->on_open);
394
+ err = js_create_reference(env, argv[1], 1, &req->on_open);
322
395
  assert(err == 0);
323
396
 
324
- err = js_create_reference(env, argv[2], 1, &iterator->on_close);
397
+ err = js_create_reference(env, argv[2], 1, &req->on_close);
325
398
  assert(err == 0);
326
399
 
327
- err = js_create_reference(env, argv[3], 1, &iterator->on_read);
400
+ err = js_create_reference(env, argv[3], 1, &req->on_read);
328
401
  assert(err == 0);
329
402
 
330
403
  return handle;
331
404
  }
332
405
 
333
406
  static js_value_t *
334
- rocksdb_native_iterator_buffer (js_env_t *env, js_callback_info_t *info) {
407
+ rocksdb_native_iterator_buffer(js_env_t *env, js_callback_info_t *info) {
335
408
  int err;
336
409
 
337
410
  size_t argc = 2;
@@ -342,8 +415,8 @@ rocksdb_native_iterator_buffer (js_env_t *env, js_callback_info_t *info) {
342
415
 
343
416
  assert(argc == 2);
344
417
 
345
- rocksdb_native_iterator_t *iterator;
346
- err = js_get_arraybuffer_info(env, argv[0], (void **) &iterator, NULL);
418
+ rocksdb_native_iterator_t *req;
419
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
347
420
  assert(err == 0);
348
421
 
349
422
  uint32_t capacity;
@@ -358,55 +431,59 @@ rocksdb_native_iterator_buffer (js_env_t *env, js_callback_info_t *info) {
358
431
 
359
432
  size_t offset = 0;
360
433
 
361
- iterator->keys = (rocksdb_slice_t *) &data[offset];
434
+ req->keys = (rocksdb_slice_t *) &data[offset];
362
435
 
363
436
  offset += capacity * sizeof(rocksdb_slice_t);
364
437
 
365
- iterator->values = (rocksdb_slice_t *) &data[offset];
438
+ req->values = (rocksdb_slice_t *) &data[offset];
366
439
 
367
440
  return handle;
368
441
  }
369
442
 
370
443
  static void
371
- rocksdb_native__on_iterator_open (rocksdb_iterator_t *handle, int status) {
444
+ rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
372
445
  int err;
373
446
 
374
447
  assert(status == 0);
375
448
 
376
- rocksdb_native_iterator_t *iterator = (rocksdb_native_iterator_t *) handle->data;
449
+ rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
377
450
 
378
- js_env_t *env = iterator->env;
451
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
452
+
453
+ js_env_t *env = req->env;
379
454
 
380
455
  js_handle_scope_t *scope;
381
456
  err = js_open_handle_scope(env, &scope);
382
457
  assert(err == 0);
383
458
 
384
459
  js_value_t *ctx;
385
- err = js_get_reference_value(env, iterator->ctx, &ctx);
460
+ err = js_get_reference_value(env, req->ctx, &ctx);
386
461
  assert(err == 0);
387
462
 
388
463
  js_value_t *cb;
389
- err = js_get_reference_value(env, iterator->on_open, &cb);
464
+ err = js_get_reference_value(env, req->on_open, &cb);
390
465
  assert(err == 0);
391
466
 
392
467
  js_value_t *error;
393
468
 
394
- if (iterator->handle.error) {
395
- err = js_create_string_utf8(env, (utf8_t *) iterator->handle.error, -1, &error);
469
+ if (req->handle.error) {
470
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
396
471
  assert(err == 0);
397
472
  } else {
398
473
  err = js_get_null(env, &error);
399
474
  assert(err == 0);
400
475
  }
401
476
 
402
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]){error}, NULL);
477
+ if (!db->exiting) {
478
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
479
+ }
403
480
 
404
481
  err = js_close_handle_scope(env, scope);
405
482
  assert(err == 0);
406
483
  }
407
484
 
408
485
  static js_value_t *
409
- rocksdb_native_iterator_open (js_env_t *env, js_callback_info_t *info) {
486
+ rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
410
487
  int err;
411
488
 
412
489
  size_t argc = 8;
@@ -421,8 +498,8 @@ rocksdb_native_iterator_open (js_env_t *env, js_callback_info_t *info) {
421
498
  err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
422
499
  assert(err == 0);
423
500
 
424
- rocksdb_native_iterator_t *iterator;
425
- err = js_get_arraybuffer_info(env, argv[1], (void **) &iterator, NULL);
501
+ rocksdb_native_iterator_t *req;
502
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
426
503
  assert(err == 0);
427
504
 
428
505
  rocksdb_range_t range;
@@ -456,64 +533,68 @@ rocksdb_native_iterator_open (js_env_t *env, js_callback_info_t *info) {
456
533
  assert(err == 0);
457
534
  }
458
535
 
459
- err = rocksdb_iterator_open(&db->handle, &iterator->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
536
+ err = rocksdb_iterator_open(&db->handle, &req->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
460
537
  assert(err == 0);
461
538
 
462
539
  return NULL;
463
540
  }
464
541
 
465
542
  static void
466
- rocksdb_native__on_iterator_close (rocksdb_iterator_t *handle, int status) {
543
+ rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
467
544
  int err;
468
545
 
469
546
  assert(status == 0);
470
547
 
471
- rocksdb_native_iterator_t *iterator = (rocksdb_native_iterator_t *) handle->data;
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;
472
551
 
473
- js_env_t *env = iterator->env;
552
+ js_env_t *env = req->env;
474
553
 
475
554
  js_handle_scope_t *scope;
476
555
  err = js_open_handle_scope(env, &scope);
477
556
  assert(err == 0);
478
557
 
479
558
  js_value_t *ctx;
480
- err = js_get_reference_value(env, iterator->ctx, &ctx);
559
+ err = js_get_reference_value(env, req->ctx, &ctx);
481
560
  assert(err == 0);
482
561
 
483
562
  js_value_t *cb;
484
- err = js_get_reference_value(env, iterator->on_close, &cb);
563
+ err = js_get_reference_value(env, req->on_close, &cb);
564
+ assert(err == 0);
565
+
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);
573
+ assert(err == 0);
574
+
575
+ err = js_delete_reference(env, req->ctx);
485
576
  assert(err == 0);
486
577
 
487
578
  js_value_t *error;
488
579
 
489
- if (iterator->handle.error) {
490
- err = js_create_string_utf8(env, (utf8_t *) iterator->handle.error, -1, &error);
580
+ if (req->handle.error) {
581
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
491
582
  assert(err == 0);
492
583
  } else {
493
584
  err = js_get_null(env, &error);
494
585
  assert(err == 0);
495
586
  }
496
587
 
497
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]){error}, NULL);
588
+ if (!db->exiting) {
589
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
590
+ }
498
591
 
499
592
  err = js_close_handle_scope(env, scope);
500
593
  assert(err == 0);
501
-
502
- err = js_delete_reference(env, iterator->on_open);
503
- assert(err == 0);
504
-
505
- err = js_delete_reference(env, iterator->on_close);
506
- assert(err == 0);
507
-
508
- err = js_delete_reference(env, iterator->on_read);
509
- assert(err == 0);
510
-
511
- err = js_delete_reference(env, iterator->ctx);
512
- assert(err == 0);
513
594
  }
514
595
 
515
596
  static js_value_t *
516
- rocksdb_native_iterator_close (js_env_t *env, js_callback_info_t *info) {
597
+ rocksdb_native_iterator_close(js_env_t *env, js_callback_info_t *info) {
517
598
  int err;
518
599
 
519
600
  size_t argc = 1;
@@ -524,39 +605,41 @@ rocksdb_native_iterator_close (js_env_t *env, js_callback_info_t *info) {
524
605
 
525
606
  assert(argc == 1);
526
607
 
527
- rocksdb_native_iterator_t *iterator;
528
- err = js_get_arraybuffer_info(env, argv[0], (void **) &iterator, NULL);
608
+ rocksdb_native_iterator_t *req;
609
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
529
610
  assert(err == 0);
530
611
 
531
- err = rocksdb_iterator_close(&iterator->handle, rocksdb_native__on_iterator_close);
612
+ err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
532
613
  assert(err == 0);
533
614
 
534
615
  return NULL;
535
616
  }
536
617
 
537
618
  static void
538
- rocksdb_native__on_iterator_read (rocksdb_iterator_t *handle, int status) {
619
+ rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
539
620
  int err;
540
621
 
541
622
  assert(status == 0);
542
623
 
543
- rocksdb_native_iterator_t *iterator = (rocksdb_native_iterator_t *) handle->data;
624
+ rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
544
625
 
545
- js_env_t *env = iterator->env;
626
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
627
+
628
+ js_env_t *env = req->env;
546
629
 
547
630
  js_handle_scope_t *scope;
548
631
  err = js_open_handle_scope(env, &scope);
549
632
  assert(err == 0);
550
633
 
551
634
  js_value_t *ctx;
552
- err = js_get_reference_value(env, iterator->ctx, &ctx);
635
+ err = js_get_reference_value(env, req->ctx, &ctx);
553
636
  assert(err == 0);
554
637
 
555
638
  js_value_t *cb;
556
- err = js_get_reference_value(env, iterator->on_read, &cb);
639
+ err = js_get_reference_value(env, req->on_read, &cb);
557
640
  assert(err == 0);
558
641
 
559
- size_t len = iterator->handle.len;
642
+ size_t len = req->handle.len;
560
643
 
561
644
  js_value_t *keys;
562
645
  err = js_create_array_with_length(env, len, &keys);
@@ -568,8 +651,8 @@ rocksdb_native__on_iterator_read (rocksdb_iterator_t *handle, int status) {
568
651
 
569
652
  js_value_t *error;
570
653
 
571
- if (iterator->handle.error) {
572
- err = js_create_string_utf8(env, (utf8_t *) iterator->handle.error, -1, &error);
654
+ if (req->handle.error) {
655
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
573
656
  assert(err == 0);
574
657
  } else {
575
658
  err = js_get_null(env, &error);
@@ -578,7 +661,7 @@ rocksdb_native__on_iterator_read (rocksdb_iterator_t *handle, int status) {
578
661
  for (size_t i = 0; i < len; i++) {
579
662
  js_value_t *result;
580
663
 
581
- rocksdb_slice_t *key = &iterator->keys[i];
664
+ rocksdb_slice_t *key = &req->keys[i];
582
665
 
583
666
  err = js_create_external_arraybuffer(env, (void *) key->data, key->len, rocksdb_native__on_free, NULL, &result);
584
667
  assert(err == 0);
@@ -586,7 +669,7 @@ rocksdb_native__on_iterator_read (rocksdb_iterator_t *handle, int status) {
586
669
  err = js_set_element(env, keys, i, result);
587
670
  assert(err == 0);
588
671
 
589
- rocksdb_slice_t *value = &iterator->values[i];
672
+ rocksdb_slice_t *value = &req->values[i];
590
673
 
591
674
  err = js_create_external_arraybuffer(env, (void *) value->data, value->len, rocksdb_native__on_free, NULL, &result);
592
675
  assert(err == 0);
@@ -596,14 +679,16 @@ rocksdb_native__on_iterator_read (rocksdb_iterator_t *handle, int status) {
596
679
  }
597
680
  }
598
681
 
599
- js_call_function_with_checkpoint(env, ctx, cb, 3, (js_value_t *[]){error, keys, values}, NULL);
682
+ if (!db->exiting) {
683
+ js_call_function_with_checkpoint(env, ctx, cb, 3, (js_value_t *[]) {error, keys, values}, NULL);
684
+ }
600
685
 
601
686
  err = js_close_handle_scope(env, scope);
602
687
  assert(err == 0);
603
688
  }
604
689
 
605
690
  static js_value_t *
606
- rocksdb_native_iterator_read (js_env_t *env, js_callback_info_t *info) {
691
+ rocksdb_native_iterator_read(js_env_t *env, js_callback_info_t *info) {
607
692
  int err;
608
693
 
609
694
  size_t argc = 2;
@@ -614,38 +699,38 @@ rocksdb_native_iterator_read (js_env_t *env, js_callback_info_t *info) {
614
699
 
615
700
  assert(argc == 2);
616
701
 
617
- rocksdb_native_iterator_t *iterator;
618
- err = js_get_arraybuffer_info(env, argv[0], (void **) &iterator, NULL);
702
+ rocksdb_native_iterator_t *req;
703
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
619
704
  assert(err == 0);
620
705
 
621
706
  uint32_t capacity;
622
707
  err = js_get_value_uint32(env, argv[1], &capacity);
623
708
  assert(err == 0);
624
709
 
625
- err = rocksdb_iterator_read(&iterator->handle, iterator->keys, iterator->values, capacity, rocksdb_native__on_iterator_read);
710
+ err = rocksdb_iterator_read(&req->handle, req->keys, req->values, capacity, rocksdb_native__on_iterator_read);
626
711
  assert(err == 0);
627
712
 
628
713
  return NULL;
629
714
  }
630
715
 
631
716
  static js_value_t *
632
- rocksdb_native_read_init (js_env_t *env, js_callback_info_t *info) {
717
+ rocksdb_native_read_init(js_env_t *env, js_callback_info_t *info) {
633
718
  int err;
634
719
 
635
720
  js_value_t *handle;
636
721
 
637
- rocksdb_native_read_batch_t *batch;
638
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_read_batch_t), (void **) &batch, &handle);
722
+ rocksdb_native_read_batch_t *req;
723
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_read_batch_t), (void **) &req, &handle);
639
724
  assert(err == 0);
640
725
 
641
- batch->env = env;
642
- batch->handle.data = (void *) batch;
726
+ req->env = env;
727
+ req->handle.data = (void *) req;
643
728
 
644
729
  return handle;
645
730
  }
646
731
 
647
732
  static js_value_t *
648
- rocksdb_native_read_buffer (js_env_t *env, js_callback_info_t *info) {
733
+ rocksdb_native_read_buffer(js_env_t *env, js_callback_info_t *info) {
649
734
  int err;
650
735
 
651
736
  size_t argc = 2;
@@ -656,8 +741,8 @@ rocksdb_native_read_buffer (js_env_t *env, js_callback_info_t *info) {
656
741
 
657
742
  assert(argc == 2);
658
743
 
659
- rocksdb_native_read_batch_t *batch;
660
- err = js_get_arraybuffer_info(env, argv[0], (void **) &batch, NULL);
744
+ rocksdb_native_read_batch_t *req;
745
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
661
746
  assert(err == 0);
662
747
 
663
748
  uint32_t capacity;
@@ -670,34 +755,36 @@ rocksdb_native_read_buffer (js_env_t *env, js_callback_info_t *info) {
670
755
  err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_read_t) + capacity * sizeof(char *), (void **) &data, &handle);
671
756
  assert(err == 0);
672
757
 
673
- batch->capacity = capacity;
758
+ req->capacity = capacity;
674
759
 
675
760
  size_t offset = 0;
676
761
 
677
- batch->reads = (rocksdb_read_t *) &data[offset];
762
+ req->reads = (rocksdb_read_t *) &data[offset];
678
763
 
679
764
  offset += capacity * sizeof(rocksdb_read_t);
680
765
 
681
- batch->errors = (char **) &data[offset];
766
+ req->errors = (char **) &data[offset];
682
767
 
683
768
  return handle;
684
769
  }
685
770
 
686
771
  static void
687
- rocksdb_native__on_read (rocksdb_read_batch_t *handle, int status) {
772
+ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
688
773
  int err;
689
774
 
690
775
  assert(status == 0);
691
776
 
692
- rocksdb_native_read_batch_t *batch = (rocksdb_native_read_batch_t *) handle->data;
777
+ rocksdb_native_read_batch_t *req = (rocksdb_native_read_batch_t *) handle->data;
693
778
 
694
- js_env_t *env = batch->env;
779
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
780
+
781
+ js_env_t *env = req->env;
695
782
 
696
783
  js_handle_scope_t *scope;
697
784
  err = js_open_handle_scope(env, &scope);
698
785
  assert(err == 0);
699
786
 
700
- size_t len = batch->handle.len;
787
+ size_t len = req->handle.len;
701
788
 
702
789
  js_value_t *errors;
703
790
  err = js_create_array_with_length(env, len, &errors);
@@ -710,7 +797,7 @@ rocksdb_native__on_read (rocksdb_read_batch_t *handle, int status) {
710
797
  for (size_t i = 0; i < len; i++) {
711
798
  js_value_t *result;
712
799
 
713
- char *error = batch->errors[i];
800
+ char *error = req->errors[i];
714
801
 
715
802
  if (error) {
716
803
  err = js_create_string_utf8(env, (utf8_t *) error, -1, &result);
@@ -719,7 +806,7 @@ rocksdb_native__on_read (rocksdb_read_batch_t *handle, int status) {
719
806
  err = js_set_element(env, errors, i, result);
720
807
  assert(err == 0);
721
808
  } else {
722
- rocksdb_slice_t *slice = &batch->reads[i].value;
809
+ rocksdb_slice_t *slice = &req->reads[i].value;
723
810
 
724
811
  err = js_create_external_arraybuffer(env, (void *) slice->data, slice->len, rocksdb_native__on_free, NULL, &result);
725
812
  assert(err == 0);
@@ -730,27 +817,29 @@ rocksdb_native__on_read (rocksdb_read_batch_t *handle, int status) {
730
817
  }
731
818
 
732
819
  js_value_t *ctx;
733
- err = js_get_reference_value(env, batch->ctx, &ctx);
820
+ err = js_get_reference_value(env, req->ctx, &ctx);
734
821
  assert(err == 0);
735
822
 
736
823
  js_value_t *cb;
737
- err = js_get_reference_value(env, batch->on_status, &cb);
824
+ err = js_get_reference_value(env, req->on_status, &cb);
738
825
  assert(err == 0);
739
826
 
740
- err = js_delete_reference(env, batch->on_status);
827
+ err = js_delete_reference(env, req->on_status);
741
828
  assert(err == 0);
742
829
 
743
- err = js_delete_reference(env, batch->ctx);
830
+ err = js_delete_reference(env, req->ctx);
744
831
  assert(err == 0);
745
832
 
746
- js_call_function_with_checkpoint(env, ctx, cb, 2, (js_value_t *[]){errors, values}, NULL);
833
+ if (!db->exiting) {
834
+ js_call_function_with_checkpoint(env, ctx, cb, 2, (js_value_t *[]) {errors, values}, NULL);
835
+ }
747
836
 
748
837
  err = js_close_handle_scope(env, scope);
749
838
  assert(err == 0);
750
839
  }
751
840
 
752
841
  static js_value_t *
753
- rocksdb_native_read (js_env_t *env, js_callback_info_t *info) {
842
+ rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
754
843
  int err;
755
844
 
756
845
  size_t argc = 6;
@@ -765,18 +854,18 @@ rocksdb_native_read (js_env_t *env, js_callback_info_t *info) {
765
854
  err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
766
855
  assert(err == 0);
767
856
 
768
- rocksdb_native_read_batch_t *batch;
769
- err = js_get_arraybuffer_info(env, argv[1], (void **) &batch, NULL);
857
+ rocksdb_native_read_batch_t *req;
858
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
770
859
  assert(err == 0);
771
860
 
772
861
  uint32_t len;
773
862
  err = js_get_array_length(env, argv[2], &len);
774
863
  assert(err == 0);
775
864
 
776
- err = js_create_reference(env, argv[4], 1, &batch->ctx);
865
+ err = js_create_reference(env, argv[4], 1, &req->ctx);
777
866
  assert(err == 0);
778
867
 
779
- err = js_create_reference(env, argv[5], 1, &batch->on_status);
868
+ err = js_create_reference(env, argv[5], 1, &req->on_status);
780
869
  assert(err == 0);
781
870
 
782
871
  for (uint32_t i = 0; i < len; i++) {
@@ -792,11 +881,11 @@ rocksdb_native_read (js_env_t *env, js_callback_info_t *info) {
792
881
  err = js_get_value_uint32(env, property, &type);
793
882
  assert(err == 0);
794
883
 
795
- batch->reads[i].type = type;
884
+ req->reads[i].type = type;
796
885
 
797
886
  switch (type) {
798
887
  case rocksdb_get: {
799
- rocksdb_slice_t *key = &batch->reads[i].key;
888
+ rocksdb_slice_t *key = &req->reads[i].key;
800
889
 
801
890
  err = js_get_named_property(env, read, "key", &property);
802
891
  assert(err == 0);
@@ -821,14 +910,14 @@ rocksdb_native_read (js_env_t *env, js_callback_info_t *info) {
821
910
  assert(err == 0);
822
911
  }
823
912
 
824
- err = rocksdb_read(&db->handle, &batch->handle, batch->reads, batch->errors, len, &options, rocksdb_native__on_read);
913
+ err = rocksdb_read(&db->handle, &req->handle, req->reads, req->errors, len, &options, rocksdb_native__on_read);
825
914
  assert(err == 0);
826
915
 
827
916
  return NULL;
828
917
  }
829
918
 
830
919
  static js_value_t *
831
- rocksdb_native_write_init (js_env_t *env, js_callback_info_t *info) {
920
+ rocksdb_native_write_init(js_env_t *env, js_callback_info_t *info) {
832
921
  int err;
833
922
 
834
923
  js_value_t *handle;
@@ -844,7 +933,7 @@ rocksdb_native_write_init (js_env_t *env, js_callback_info_t *info) {
844
933
  }
845
934
 
846
935
  static js_value_t *
847
- rocksdb_native_write_buffer (js_env_t *env, js_callback_info_t *info) {
936
+ rocksdb_native_write_buffer(js_env_t *env, js_callback_info_t *info) {
848
937
  int err;
849
938
 
850
939
  size_t argc = 2;
@@ -855,8 +944,8 @@ rocksdb_native_write_buffer (js_env_t *env, js_callback_info_t *info) {
855
944
 
856
945
  assert(argc == 2);
857
946
 
858
- rocksdb_native_write_batch_t *batch;
859
- err = js_get_arraybuffer_info(env, argv[0], (void **) &batch, NULL);
947
+ rocksdb_native_write_batch_t *req;
948
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
860
949
  assert(err == 0);
861
950
 
862
951
  uint32_t capacity;
@@ -869,28 +958,30 @@ rocksdb_native_write_buffer (js_env_t *env, js_callback_info_t *info) {
869
958
  err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_write_t) + capacity * sizeof(char *), (void **) &data, &handle);
870
959
  assert(err == 0);
871
960
 
872
- batch->capacity = capacity;
961
+ req->capacity = capacity;
873
962
 
874
963
  size_t offset = 0;
875
964
 
876
- batch->writes = (rocksdb_write_t *) &data[offset];
965
+ req->writes = (rocksdb_write_t *) &data[offset];
877
966
 
878
967
  offset += capacity * sizeof(rocksdb_write_t);
879
968
 
880
- batch->errors = (char **) &data[offset];
969
+ req->errors = (char **) &data[offset];
881
970
 
882
971
  return handle;
883
972
  }
884
973
 
885
974
  static void
886
- rocksdb_native__on_write (rocksdb_write_batch_t *handle, int status) {
975
+ rocksdb_native__on_write(rocksdb_write_batch_t *handle, int status) {
887
976
  int err;
888
977
 
889
978
  assert(status == 0);
890
979
 
891
- rocksdb_native_write_batch_t *batch = (rocksdb_native_write_batch_t *) handle->data;
980
+ rocksdb_native_write_batch_t *req = (rocksdb_native_write_batch_t *) handle->data;
892
981
 
893
- js_env_t *env = batch->env;
982
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
983
+
984
+ js_env_t *env = req->env;
894
985
 
895
986
  js_handle_scope_t *scope;
896
987
  err = js_open_handle_scope(env, &scope);
@@ -898,8 +989,8 @@ rocksdb_native__on_write (rocksdb_write_batch_t *handle, int status) {
898
989
 
899
990
  js_value_t *error;
900
991
 
901
- if (batch->handle.error) {
902
- err = js_create_string_utf8(env, (utf8_t *) batch->handle.error, -1, &error);
992
+ if (req->handle.error) {
993
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
903
994
  assert(err == 0);
904
995
  } else {
905
996
  err = js_get_null(env, &error);
@@ -907,27 +998,29 @@ rocksdb_native__on_write (rocksdb_write_batch_t *handle, int status) {
907
998
  }
908
999
 
909
1000
  js_value_t *ctx;
910
- err = js_get_reference_value(env, batch->ctx, &ctx);
1001
+ err = js_get_reference_value(env, req->ctx, &ctx);
911
1002
  assert(err == 0);
912
1003
 
913
1004
  js_value_t *cb;
914
- err = js_get_reference_value(env, batch->on_status, &cb);
1005
+ err = js_get_reference_value(env, req->on_status, &cb);
915
1006
  assert(err == 0);
916
1007
 
917
- err = js_delete_reference(env, batch->on_status);
1008
+ err = js_delete_reference(env, req->on_status);
918
1009
  assert(err == 0);
919
1010
 
920
- err = js_delete_reference(env, batch->ctx);
1011
+ err = js_delete_reference(env, req->ctx);
921
1012
  assert(err == 0);
922
1013
 
923
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]){error}, NULL);
1014
+ if (!db->exiting) {
1015
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
1016
+ }
924
1017
 
925
1018
  err = js_close_handle_scope(env, scope);
926
1019
  assert(err == 0);
927
1020
  }
928
1021
 
929
1022
  static js_value_t *
930
- rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
1023
+ rocksdb_native_write(js_env_t *env, js_callback_info_t *info) {
931
1024
  int err;
932
1025
 
933
1026
  size_t argc = 5;
@@ -942,18 +1035,18 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
942
1035
  err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
943
1036
  assert(err == 0);
944
1037
 
945
- rocksdb_native_write_batch_t *batch;
946
- err = js_get_arraybuffer_info(env, argv[1], (void **) &batch, NULL);
1038
+ rocksdb_native_write_batch_t *req;
1039
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
947
1040
  assert(err == 0);
948
1041
 
949
1042
  uint32_t len;
950
1043
  err = js_get_array_length(env, argv[2], &len);
951
1044
  assert(err == 0);
952
1045
 
953
- err = js_create_reference(env, argv[3], 1, &batch->ctx);
1046
+ err = js_create_reference(env, argv[3], 1, &req->ctx);
954
1047
  assert(err == 0);
955
1048
 
956
- err = js_create_reference(env, argv[4], 1, &batch->on_status);
1049
+ err = js_create_reference(env, argv[4], 1, &req->on_status);
957
1050
  assert(err == 0);
958
1051
 
959
1052
  for (uint32_t i = 0; i < len; i++) {
@@ -969,11 +1062,11 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
969
1062
  err = js_get_value_uint32(env, property, &type);
970
1063
  assert(err == 0);
971
1064
 
972
- batch->writes[i].type = type;
1065
+ req->writes[i].type = type;
973
1066
 
974
1067
  switch (type) {
975
1068
  case rocksdb_put: {
976
- rocksdb_slice_t *key = &batch->writes[i].key;
1069
+ rocksdb_slice_t *key = &req->writes[i].key;
977
1070
 
978
1071
  err = js_get_named_property(env, write, "key", &property);
979
1072
  assert(err == 0);
@@ -981,7 +1074,7 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
981
1074
  err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
982
1075
  assert(err == 0);
983
1076
 
984
- rocksdb_slice_t *value = &batch->writes[i].value;
1077
+ rocksdb_slice_t *value = &req->writes[i].value;
985
1078
 
986
1079
  err = js_get_named_property(env, write, "value", &property);
987
1080
  assert(err == 0);
@@ -992,7 +1085,7 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
992
1085
  }
993
1086
 
994
1087
  case rocksdb_delete: {
995
- rocksdb_slice_t *key = &batch->writes[i].key;
1088
+ rocksdb_slice_t *key = &req->writes[i].key;
996
1089
 
997
1090
  err = js_get_named_property(env, write, "key", &property);
998
1091
  assert(err == 0);
@@ -1003,7 +1096,7 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
1003
1096
  }
1004
1097
 
1005
1098
  case rocksdb_delete_range: {
1006
- rocksdb_slice_t *start = &batch->writes[i].start;
1099
+ rocksdb_slice_t *start = &req->writes[i].start;
1007
1100
 
1008
1101
  err = js_get_named_property(env, write, "start", &property);
1009
1102
  assert(err == 0);
@@ -1011,7 +1104,7 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
1011
1104
  err = js_get_typedarray_info(env, property, NULL, (void **) &start->data, &start->len, NULL, NULL);
1012
1105
  assert(err == 0);
1013
1106
 
1014
- rocksdb_slice_t *end = &batch->writes[i].end;
1107
+ rocksdb_slice_t *end = &req->writes[i].end;
1015
1108
 
1016
1109
  err = js_get_named_property(env, write, "end", &property);
1017
1110
  assert(err == 0);
@@ -1023,14 +1116,14 @@ rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
1023
1116
  }
1024
1117
  }
1025
1118
 
1026
- err = rocksdb_write(&db->handle, &batch->handle, batch->writes, len, NULL, rocksdb_native__on_write);
1119
+ err = rocksdb_write(&db->handle, &req->handle, req->writes, len, NULL, rocksdb_native__on_write);
1027
1120
  assert(err == 0);
1028
1121
 
1029
1122
  return NULL;
1030
1123
  }
1031
1124
 
1032
1125
  static js_value_t *
1033
- rocksdb_native_snapshot_create (js_env_t *env, js_callback_info_t *info) {
1126
+ rocksdb_native_snapshot_create(js_env_t *env, js_callback_info_t *info) {
1034
1127
  int err;
1035
1128
 
1036
1129
  size_t argc = 1;
@@ -1058,7 +1151,7 @@ rocksdb_native_snapshot_create (js_env_t *env, js_callback_info_t *info) {
1058
1151
  }
1059
1152
 
1060
1153
  static js_value_t *
1061
- rocksdb_native_snapshot_destroy (js_env_t *env, js_callback_info_t *info) {
1154
+ rocksdb_native_snapshot_destroy(js_env_t *env, js_callback_info_t *info) {
1062
1155
  int err;
1063
1156
 
1064
1157
  size_t argc = 1;
@@ -1079,7 +1172,7 @@ rocksdb_native_snapshot_destroy (js_env_t *env, js_callback_info_t *info) {
1079
1172
  }
1080
1173
 
1081
1174
  static js_value_t *
1082
- rocksdb_native_exports (js_env_t *env, js_value_t *exports) {
1175
+ rocksdb_native_exports(js_env_t *env, js_value_t *exports) {
1083
1176
  int err;
1084
1177
 
1085
1178
  #define V(name, fn) \