rocksdb-native 1.2.0 → 2.1.0
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/README.md +6 -6
- package/binding.c +257 -202
- package/index.js +12 -39
- package/lib/batch.js +182 -63
- package/lib/iterator.js +38 -31
- package/package.json +2 -1
- package/prebuilds/darwin-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/darwin-arm64/rocksdb-native.node +0 -0
- package/prebuilds/darwin-x64/rocksdb-native.bare +0 -0
- package/prebuilds/darwin-x64/rocksdb-native.node +0 -0
- package/prebuilds/linux-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/linux-arm64/rocksdb-native.node +0 -0
- package/prebuilds/linux-x64/rocksdb-native.bare +0 -0
- package/prebuilds/linux-x64/rocksdb-native.node +0 -0
- package/prebuilds/win32-x64/rocksdb-native.bare +0 -0
- package/prebuilds/win32-x64/rocksdb-native.node +0 -0
- package/vendor/librocksdb/include/rocksdb.h +57 -58
- package/vendor/librocksdb/src/rocksdb.cc +57 -184
package/README.md
CHANGED
|
@@ -13,13 +13,13 @@ const RocksDB = require('rocksdb-native')
|
|
|
13
13
|
|
|
14
14
|
const db = new RocksDB('./example.db')
|
|
15
15
|
|
|
16
|
-
const
|
|
16
|
+
const w = db.write()
|
|
17
|
+
w.put('hello', 'world')
|
|
18
|
+
await w.flush()
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const p = b.add('hello')
|
|
22
|
-
b.read()
|
|
20
|
+
const r = db.read()
|
|
21
|
+
const p = r.get('hello')
|
|
22
|
+
r.flush()
|
|
23
23
|
|
|
24
24
|
console.log(await p)
|
|
25
25
|
```
|
package/binding.c
CHANGED
|
@@ -45,14 +45,6 @@ typedef struct {
|
|
|
45
45
|
js_ref_t *on_close;
|
|
46
46
|
} rocksdb_native_close_t;
|
|
47
47
|
|
|
48
|
-
typedef struct {
|
|
49
|
-
rocksdb_delete_range_t handle;
|
|
50
|
-
|
|
51
|
-
js_env_t *env;
|
|
52
|
-
js_ref_t *ctx;
|
|
53
|
-
js_ref_t *on_status;
|
|
54
|
-
} rocksdb_native_delete_range_t;
|
|
55
|
-
|
|
56
48
|
typedef struct {
|
|
57
49
|
rocksdb_iterator_t handle;
|
|
58
50
|
|
|
@@ -67,10 +59,22 @@ typedef struct {
|
|
|
67
59
|
} rocksdb_native_iterator_t;
|
|
68
60
|
|
|
69
61
|
typedef struct {
|
|
70
|
-
|
|
62
|
+
rocksdb_read_batch_t handle;
|
|
71
63
|
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
rocksdb_read_t *reads;
|
|
65
|
+
char **errors;
|
|
66
|
+
|
|
67
|
+
size_t capacity;
|
|
68
|
+
|
|
69
|
+
js_env_t *env;
|
|
70
|
+
js_ref_t *ctx;
|
|
71
|
+
js_ref_t *on_status;
|
|
72
|
+
} rocksdb_native_read_batch_t;
|
|
73
|
+
|
|
74
|
+
typedef struct {
|
|
75
|
+
rocksdb_write_batch_t handle;
|
|
76
|
+
|
|
77
|
+
rocksdb_write_t *writes;
|
|
74
78
|
char **errors;
|
|
75
79
|
|
|
76
80
|
size_t capacity;
|
|
@@ -78,7 +82,7 @@ typedef struct {
|
|
|
78
82
|
js_env_t *env;
|
|
79
83
|
js_ref_t *ctx;
|
|
80
84
|
js_ref_t *on_status;
|
|
81
|
-
}
|
|
85
|
+
} rocksdb_native_write_batch_t;
|
|
82
86
|
|
|
83
87
|
static void
|
|
84
88
|
rocksdb_native__on_free (js_env_t *env, void *data, void *finalize_hint) {
|
|
@@ -286,116 +290,17 @@ rocksdb_native_close (js_env_t *env, js_callback_info_t *info) {
|
|
|
286
290
|
return handle;
|
|
287
291
|
}
|
|
288
292
|
|
|
289
|
-
static void
|
|
290
|
-
rocksdb_native__on_delete_range (rocksdb_delete_range_t *handle, int status) {
|
|
291
|
-
int err;
|
|
292
|
-
|
|
293
|
-
assert(status == 0);
|
|
294
|
-
|
|
295
|
-
rocksdb_native_delete_range_t *req = (rocksdb_native_delete_range_t *) handle->data;
|
|
296
|
-
|
|
297
|
-
js_env_t *env = req->env;
|
|
298
|
-
|
|
299
|
-
js_handle_scope_t *scope;
|
|
300
|
-
err = js_open_handle_scope(env, &scope);
|
|
301
|
-
assert(err == 0);
|
|
302
|
-
|
|
303
|
-
js_value_t *ctx;
|
|
304
|
-
err = js_get_reference_value(env, req->ctx, &ctx);
|
|
305
|
-
assert(err == 0);
|
|
306
|
-
|
|
307
|
-
js_value_t *cb;
|
|
308
|
-
err = js_get_reference_value(env, req->on_status, &cb);
|
|
309
|
-
assert(err == 0);
|
|
310
|
-
|
|
311
|
-
js_value_t *error;
|
|
312
|
-
|
|
313
|
-
if (req->handle.error) {
|
|
314
|
-
err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
|
|
315
|
-
assert(err == 0);
|
|
316
|
-
} else {
|
|
317
|
-
err = js_get_null(env, &error);
|
|
318
|
-
assert(err == 0);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
js_call_function(env, ctx, cb, 1, (js_value_t *[]){error}, NULL);
|
|
322
|
-
|
|
323
|
-
err = js_close_handle_scope(env, scope);
|
|
324
|
-
assert(err == 0);
|
|
325
|
-
|
|
326
|
-
err = js_delete_reference(env, req->on_status);
|
|
327
|
-
assert(err == 0);
|
|
328
|
-
|
|
329
|
-
err = js_delete_reference(env, req->ctx);
|
|
330
|
-
assert(err == 0);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
static js_value_t *
|
|
334
|
-
rocksdb_native_delete_range (js_env_t *env, js_callback_info_t *info) {
|
|
335
|
-
int err;
|
|
336
|
-
|
|
337
|
-
size_t argc = 7;
|
|
338
|
-
js_value_t *argv[7];
|
|
339
|
-
|
|
340
|
-
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
341
|
-
assert(err == 0);
|
|
342
|
-
|
|
343
|
-
assert(argc == 7);
|
|
344
|
-
|
|
345
|
-
rocksdb_native_t *db;
|
|
346
|
-
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
347
|
-
assert(err == 0);
|
|
348
|
-
|
|
349
|
-
js_value_t *handle;
|
|
350
|
-
|
|
351
|
-
rocksdb_native_delete_range_t *req;
|
|
352
|
-
err = js_create_arraybuffer(env, sizeof(rocksdb_native_delete_range_t), (void **) &req, &handle);
|
|
353
|
-
assert(err == 0);
|
|
354
|
-
|
|
355
|
-
req->env = env;
|
|
356
|
-
req->handle.data = (void *) req;
|
|
357
|
-
|
|
358
|
-
rocksdb_range_t range;
|
|
359
|
-
|
|
360
|
-
err = js_get_typedarray_info(env, argv[1], NULL, (void **) &range.gt.data, &range.gt.len, NULL, NULL);
|
|
361
|
-
assert(err == 0);
|
|
362
|
-
|
|
363
|
-
err = js_get_typedarray_info(env, argv[2], NULL, (void **) &range.gte.data, &range.gte.len, NULL, NULL);
|
|
364
|
-
assert(err == 0);
|
|
365
|
-
|
|
366
|
-
err = js_get_typedarray_info(env, argv[3], NULL, (void **) &range.lt.data, &range.lt.len, NULL, NULL);
|
|
367
|
-
assert(err == 0);
|
|
368
|
-
|
|
369
|
-
err = js_get_typedarray_info(env, argv[4], NULL, (void **) &range.lte.data, &range.lte.len, NULL, NULL);
|
|
370
|
-
assert(err == 0);
|
|
371
|
-
|
|
372
|
-
err = js_create_reference(env, argv[5], 1, &req->ctx);
|
|
373
|
-
assert(err == 0);
|
|
374
|
-
|
|
375
|
-
err = js_create_reference(env, argv[6], 1, &req->on_status);
|
|
376
|
-
assert(err == 0);
|
|
377
|
-
|
|
378
|
-
err = rocksdb_delete_range(&db->handle, &req->handle, range, rocksdb_native__on_delete_range);
|
|
379
|
-
assert(err == 0);
|
|
380
|
-
|
|
381
|
-
return handle;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
293
|
static js_value_t *
|
|
385
294
|
rocksdb_native_iterator_init (js_env_t *env, js_callback_info_t *info) {
|
|
386
295
|
int err;
|
|
387
296
|
|
|
388
|
-
size_t argc =
|
|
389
|
-
js_value_t *argv[
|
|
297
|
+
size_t argc = 4;
|
|
298
|
+
js_value_t *argv[4];
|
|
390
299
|
|
|
391
300
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
392
301
|
assert(err == 0);
|
|
393
302
|
|
|
394
|
-
assert(argc ==
|
|
395
|
-
|
|
396
|
-
rocksdb_native_t *db;
|
|
397
|
-
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
398
|
-
assert(err == 0);
|
|
303
|
+
assert(argc == 4);
|
|
399
304
|
|
|
400
305
|
js_value_t *handle;
|
|
401
306
|
|
|
@@ -403,22 +308,19 @@ rocksdb_native_iterator_init (js_env_t *env, js_callback_info_t *info) {
|
|
|
403
308
|
err = js_create_arraybuffer(env, sizeof(rocksdb_native_iterator_t), (void **) &iterator, &handle);
|
|
404
309
|
assert(err == 0);
|
|
405
310
|
|
|
406
|
-
err = rocksdb_iterator_init(&db->handle, &iterator->handle);
|
|
407
|
-
assert(err == 0);
|
|
408
|
-
|
|
409
311
|
iterator->env = env;
|
|
410
312
|
iterator->handle.data = (void *) iterator;
|
|
411
313
|
|
|
412
|
-
err = js_create_reference(env, argv[
|
|
314
|
+
err = js_create_reference(env, argv[0], 1, &iterator->ctx);
|
|
413
315
|
assert(err == 0);
|
|
414
316
|
|
|
415
|
-
err = js_create_reference(env, argv[
|
|
317
|
+
err = js_create_reference(env, argv[1], 1, &iterator->on_open);
|
|
416
318
|
assert(err == 0);
|
|
417
319
|
|
|
418
|
-
err = js_create_reference(env, argv[
|
|
320
|
+
err = js_create_reference(env, argv[2], 1, &iterator->on_close);
|
|
419
321
|
assert(err == 0);
|
|
420
322
|
|
|
421
|
-
err = js_create_reference(env, argv[
|
|
323
|
+
err = js_create_reference(env, argv[3], 1, &iterator->on_read);
|
|
422
324
|
assert(err == 0);
|
|
423
325
|
|
|
424
326
|
return handle;
|
|
@@ -503,37 +405,41 @@ static js_value_t *
|
|
|
503
405
|
rocksdb_native_iterator_open (js_env_t *env, js_callback_info_t *info) {
|
|
504
406
|
int err;
|
|
505
407
|
|
|
506
|
-
size_t argc =
|
|
507
|
-
js_value_t *argv[
|
|
408
|
+
size_t argc = 7;
|
|
409
|
+
js_value_t *argv[7];
|
|
508
410
|
|
|
509
411
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
510
412
|
assert(err == 0);
|
|
511
413
|
|
|
512
|
-
assert(argc ==
|
|
414
|
+
assert(argc == 7);
|
|
415
|
+
|
|
416
|
+
rocksdb_native_t *db;
|
|
417
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
418
|
+
assert(err == 0);
|
|
513
419
|
|
|
514
420
|
rocksdb_native_iterator_t *iterator;
|
|
515
|
-
err = js_get_arraybuffer_info(env, argv[
|
|
421
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &iterator, NULL);
|
|
516
422
|
assert(err == 0);
|
|
517
423
|
|
|
518
424
|
rocksdb_range_t range;
|
|
519
425
|
|
|
520
|
-
err = js_get_typedarray_info(env, argv[
|
|
426
|
+
err = js_get_typedarray_info(env, argv[2], NULL, (void **) &range.gt.data, &range.gt.len, NULL, NULL);
|
|
521
427
|
assert(err == 0);
|
|
522
428
|
|
|
523
|
-
err = js_get_typedarray_info(env, argv[
|
|
429
|
+
err = js_get_typedarray_info(env, argv[3], NULL, (void **) &range.gte.data, &range.gte.len, NULL, NULL);
|
|
524
430
|
assert(err == 0);
|
|
525
431
|
|
|
526
|
-
err = js_get_typedarray_info(env, argv[
|
|
432
|
+
err = js_get_typedarray_info(env, argv[4], NULL, (void **) &range.lt.data, &range.lt.len, NULL, NULL);
|
|
527
433
|
assert(err == 0);
|
|
528
434
|
|
|
529
|
-
err = js_get_typedarray_info(env, argv[
|
|
435
|
+
err = js_get_typedarray_info(env, argv[5], NULL, (void **) &range.lte.data, &range.lte.len, NULL, NULL);
|
|
530
436
|
assert(err == 0);
|
|
531
437
|
|
|
532
438
|
bool reverse;
|
|
533
|
-
err = js_get_value_bool(env, argv[
|
|
439
|
+
err = js_get_value_bool(env, argv[6], &reverse);
|
|
534
440
|
assert(err == 0);
|
|
535
441
|
|
|
536
|
-
err = rocksdb_iterator_open(&iterator->handle, range, reverse, rocksdb_native__on_iterator_open);
|
|
442
|
+
err = rocksdb_iterator_open(&db->handle, &iterator->handle, range, reverse, rocksdb_native__on_iterator_open);
|
|
537
443
|
assert(err == 0);
|
|
538
444
|
|
|
539
445
|
return NULL;
|
|
@@ -694,41 +600,34 @@ rocksdb_native_iterator_read (js_env_t *env, js_callback_info_t *info) {
|
|
|
694
600
|
}
|
|
695
601
|
|
|
696
602
|
static js_value_t *
|
|
697
|
-
|
|
603
|
+
rocksdb_native_read_init (js_env_t *env, js_callback_info_t *info) {
|
|
698
604
|
int err;
|
|
699
605
|
|
|
700
|
-
size_t argc =
|
|
701
|
-
js_value_t *argv[
|
|
606
|
+
size_t argc = 1;
|
|
607
|
+
js_value_t *argv[1];
|
|
702
608
|
|
|
703
609
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
704
610
|
assert(err == 0);
|
|
705
611
|
|
|
706
|
-
assert(argc ==
|
|
707
|
-
|
|
708
|
-
rocksdb_native_t *db;
|
|
709
|
-
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
710
|
-
assert(err == 0);
|
|
612
|
+
assert(argc == 1);
|
|
711
613
|
|
|
712
614
|
js_value_t *handle;
|
|
713
615
|
|
|
714
|
-
|
|
715
|
-
err = js_create_arraybuffer(env, sizeof(
|
|
716
|
-
assert(err == 0);
|
|
717
|
-
|
|
718
|
-
err = rocksdb_batch_init(&db->handle, &batch->handle);
|
|
616
|
+
rocksdb_native_read_batch_t *batch;
|
|
617
|
+
err = js_create_arraybuffer(env, sizeof(rocksdb_native_read_batch_t), (void **) &batch, &handle);
|
|
719
618
|
assert(err == 0);
|
|
720
619
|
|
|
721
620
|
batch->env = env;
|
|
722
621
|
batch->handle.data = (void *) batch;
|
|
723
622
|
|
|
724
|
-
err = js_create_reference(env, argv[
|
|
623
|
+
err = js_create_reference(env, argv[0], 1, &batch->ctx);
|
|
725
624
|
assert(err == 0);
|
|
726
625
|
|
|
727
626
|
return handle;
|
|
728
627
|
}
|
|
729
628
|
|
|
730
629
|
static js_value_t *
|
|
731
|
-
|
|
630
|
+
rocksdb_native_read_buffer (js_env_t *env, js_callback_info_t *info) {
|
|
732
631
|
int err;
|
|
733
632
|
|
|
734
633
|
size_t argc = 2;
|
|
@@ -739,7 +638,7 @@ rocksdb_native_batch_buffer (js_env_t *env, js_callback_info_t *info) {
|
|
|
739
638
|
|
|
740
639
|
assert(argc == 2);
|
|
741
640
|
|
|
742
|
-
|
|
641
|
+
rocksdb_native_read_batch_t *batch;
|
|
743
642
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &batch, NULL);
|
|
744
643
|
assert(err == 0);
|
|
745
644
|
|
|
@@ -750,51 +649,29 @@ rocksdb_native_batch_buffer (js_env_t *env, js_callback_info_t *info) {
|
|
|
750
649
|
js_value_t *handle;
|
|
751
650
|
|
|
752
651
|
uint8_t *data;
|
|
753
|
-
err = js_create_arraybuffer(env,
|
|
652
|
+
err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_read_t) + capacity * sizeof(char *), (void **) &data, &handle);
|
|
754
653
|
assert(err == 0);
|
|
755
654
|
|
|
756
655
|
batch->capacity = capacity;
|
|
757
656
|
|
|
758
657
|
size_t offset = 0;
|
|
759
658
|
|
|
760
|
-
batch->
|
|
761
|
-
|
|
762
|
-
offset += capacity * sizeof(rocksdb_slice_t);
|
|
659
|
+
batch->reads = (rocksdb_read_t *) &data[offset];
|
|
763
660
|
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
offset += capacity * sizeof(rocksdb_slice_t);
|
|
661
|
+
offset += capacity * sizeof(rocksdb_read_t);
|
|
767
662
|
|
|
768
663
|
batch->errors = (char **) &data[offset];
|
|
769
664
|
|
|
770
665
|
return handle;
|
|
771
666
|
}
|
|
772
667
|
|
|
773
|
-
static inline int
|
|
774
|
-
rocksdb_native__get_slices (js_env_t *env, js_value_t *arr, uint32_t len, rocksdb_slice_t *result) {
|
|
775
|
-
int err;
|
|
776
|
-
|
|
777
|
-
for (uint32_t i = 0; i < len; i++) {
|
|
778
|
-
js_value_t *value;
|
|
779
|
-
err = js_get_element(env, arr, i, &value);
|
|
780
|
-
assert(err == 0);
|
|
781
|
-
|
|
782
|
-
rocksdb_slice_t *slice = &result[i];
|
|
783
|
-
|
|
784
|
-
err = js_get_typedarray_info(env, value, NULL, (void **) &slice->data, &slice->len, NULL, NULL);
|
|
785
|
-
assert(err == 0);
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
return 0;
|
|
789
|
-
}
|
|
790
|
-
|
|
791
668
|
static void
|
|
792
|
-
|
|
669
|
+
rocksdb_native__on_read (rocksdb_read_batch_t *handle, int status) {
|
|
793
670
|
int err;
|
|
794
671
|
|
|
795
672
|
assert(status == 0);
|
|
796
673
|
|
|
797
|
-
|
|
674
|
+
rocksdb_native_read_batch_t *batch = (rocksdb_native_read_batch_t *) handle->data;
|
|
798
675
|
|
|
799
676
|
js_env_t *env = batch->env;
|
|
800
677
|
|
|
@@ -824,7 +701,7 @@ rocksdb_native__on_batch_read (rocksdb_batch_t *handle, int status) {
|
|
|
824
701
|
err = js_set_element(env, errors, i, result);
|
|
825
702
|
assert(err == 0);
|
|
826
703
|
} else {
|
|
827
|
-
rocksdb_slice_t *slice = &batch->
|
|
704
|
+
rocksdb_slice_t *slice = &batch->reads[i].value;
|
|
828
705
|
|
|
829
706
|
err = js_create_external_arraybuffer(env, (void *) slice->data, slice->len, rocksdb_native__on_free, NULL, &result);
|
|
830
707
|
assert(err == 0);
|
|
@@ -849,44 +726,140 @@ rocksdb_native__on_batch_read (rocksdb_batch_t *handle, int status) {
|
|
|
849
726
|
}
|
|
850
727
|
|
|
851
728
|
static js_value_t *
|
|
852
|
-
|
|
729
|
+
rocksdb_native_read (js_env_t *env, js_callback_info_t *info) {
|
|
853
730
|
int err;
|
|
854
731
|
|
|
855
|
-
size_t argc =
|
|
856
|
-
js_value_t *argv[
|
|
732
|
+
size_t argc = 4;
|
|
733
|
+
js_value_t *argv[4];
|
|
857
734
|
|
|
858
735
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
859
736
|
assert(err == 0);
|
|
860
737
|
|
|
861
|
-
assert(argc ==
|
|
738
|
+
assert(argc == 4);
|
|
862
739
|
|
|
863
|
-
|
|
864
|
-
err = js_get_arraybuffer_info(env, argv[0], (void **) &
|
|
740
|
+
rocksdb_native_t *db;
|
|
741
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
865
742
|
assert(err == 0);
|
|
866
743
|
|
|
867
|
-
|
|
868
|
-
err =
|
|
744
|
+
rocksdb_native_read_batch_t *batch;
|
|
745
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &batch, NULL);
|
|
869
746
|
assert(err == 0);
|
|
870
747
|
|
|
871
|
-
|
|
748
|
+
uint32_t len;
|
|
749
|
+
err = js_get_array_length(env, argv[2], &len);
|
|
872
750
|
assert(err == 0);
|
|
873
751
|
|
|
874
|
-
err =
|
|
752
|
+
err = js_create_reference(env, argv[3], 1, &batch->on_status);
|
|
875
753
|
assert(err == 0);
|
|
876
754
|
|
|
877
|
-
|
|
755
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
756
|
+
js_value_t *read;
|
|
757
|
+
err = js_get_element(env, argv[2], i, &read);
|
|
758
|
+
assert(err == 0);
|
|
759
|
+
|
|
760
|
+
js_value_t *property;
|
|
761
|
+
err = js_get_named_property(env, read, "type", &property);
|
|
762
|
+
assert(err == 0);
|
|
763
|
+
|
|
764
|
+
rocksdb_read_type_t type;
|
|
765
|
+
err = js_get_value_uint32(env, property, &type);
|
|
766
|
+
assert(err == 0);
|
|
767
|
+
|
|
768
|
+
batch->reads[i].type = type;
|
|
769
|
+
|
|
770
|
+
switch (type) {
|
|
771
|
+
case rocksdb_get: {
|
|
772
|
+
rocksdb_slice_t *key = &batch->reads[i].key;
|
|
773
|
+
|
|
774
|
+
err = js_get_named_property(env, read, "key", &property);
|
|
775
|
+
assert(err == 0);
|
|
776
|
+
|
|
777
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
|
|
778
|
+
assert(err == 0);
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
err = rocksdb_read(&db->handle, &batch->handle, batch->reads, batch->errors, len, rocksdb_native__on_read);
|
|
878
785
|
assert(err == 0);
|
|
879
786
|
|
|
880
787
|
return NULL;
|
|
881
788
|
}
|
|
882
789
|
|
|
790
|
+
static js_value_t *
|
|
791
|
+
rocksdb_native_write_init (js_env_t *env, js_callback_info_t *info) {
|
|
792
|
+
int err;
|
|
793
|
+
|
|
794
|
+
size_t argc = 1;
|
|
795
|
+
js_value_t *argv[1];
|
|
796
|
+
|
|
797
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
798
|
+
assert(err == 0);
|
|
799
|
+
|
|
800
|
+
assert(argc == 1);
|
|
801
|
+
|
|
802
|
+
js_value_t *handle;
|
|
803
|
+
|
|
804
|
+
rocksdb_native_write_batch_t *batch;
|
|
805
|
+
err = js_create_arraybuffer(env, sizeof(rocksdb_native_write_batch_t), (void **) &batch, &handle);
|
|
806
|
+
assert(err == 0);
|
|
807
|
+
|
|
808
|
+
batch->env = env;
|
|
809
|
+
batch->handle.data = (void *) batch;
|
|
810
|
+
|
|
811
|
+
err = js_create_reference(env, argv[0], 1, &batch->ctx);
|
|
812
|
+
assert(err == 0);
|
|
813
|
+
|
|
814
|
+
return handle;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
static js_value_t *
|
|
818
|
+
rocksdb_native_write_buffer (js_env_t *env, js_callback_info_t *info) {
|
|
819
|
+
int err;
|
|
820
|
+
|
|
821
|
+
size_t argc = 2;
|
|
822
|
+
js_value_t *argv[2];
|
|
823
|
+
|
|
824
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
825
|
+
assert(err == 0);
|
|
826
|
+
|
|
827
|
+
assert(argc == 2);
|
|
828
|
+
|
|
829
|
+
rocksdb_native_write_batch_t *batch;
|
|
830
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &batch, NULL);
|
|
831
|
+
assert(err == 0);
|
|
832
|
+
|
|
833
|
+
uint32_t capacity;
|
|
834
|
+
err = js_get_value_uint32(env, argv[1], &capacity);
|
|
835
|
+
assert(err == 0);
|
|
836
|
+
|
|
837
|
+
js_value_t *handle;
|
|
838
|
+
|
|
839
|
+
uint8_t *data;
|
|
840
|
+
err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_write_t) + capacity * sizeof(char *), (void **) &data, &handle);
|
|
841
|
+
assert(err == 0);
|
|
842
|
+
|
|
843
|
+
batch->capacity = capacity;
|
|
844
|
+
|
|
845
|
+
size_t offset = 0;
|
|
846
|
+
|
|
847
|
+
batch->writes = (rocksdb_write_t *) &data[offset];
|
|
848
|
+
|
|
849
|
+
offset += capacity * sizeof(rocksdb_write_t);
|
|
850
|
+
|
|
851
|
+
batch->errors = (char **) &data[offset];
|
|
852
|
+
|
|
853
|
+
return handle;
|
|
854
|
+
}
|
|
855
|
+
|
|
883
856
|
static void
|
|
884
|
-
|
|
857
|
+
rocksdb_native__on_write (rocksdb_write_batch_t *handle, int status) {
|
|
885
858
|
int err;
|
|
886
859
|
|
|
887
860
|
assert(status == 0);
|
|
888
861
|
|
|
889
|
-
|
|
862
|
+
rocksdb_native_write_batch_t *batch = (rocksdb_native_write_batch_t *) handle->data;
|
|
890
863
|
|
|
891
864
|
js_env_t *env = batch->env;
|
|
892
865
|
|
|
@@ -919,7 +892,7 @@ rocksdb_native__on_batch_write (rocksdb_batch_t *handle, int status) {
|
|
|
919
892
|
}
|
|
920
893
|
|
|
921
894
|
static js_value_t *
|
|
922
|
-
|
|
895
|
+
rocksdb_native_write (js_env_t *env, js_callback_info_t *info) {
|
|
923
896
|
int err;
|
|
924
897
|
|
|
925
898
|
size_t argc = 4;
|
|
@@ -930,24 +903,89 @@ rocksdb_native_batch_write (js_env_t *env, js_callback_info_t *info) {
|
|
|
930
903
|
|
|
931
904
|
assert(argc == 4);
|
|
932
905
|
|
|
933
|
-
|
|
934
|
-
err = js_get_arraybuffer_info(env, argv[0], (void **) &
|
|
906
|
+
rocksdb_native_t *db;
|
|
907
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
|
|
908
|
+
assert(err == 0);
|
|
909
|
+
|
|
910
|
+
rocksdb_native_write_batch_t *batch;
|
|
911
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &batch, NULL);
|
|
935
912
|
assert(err == 0);
|
|
936
913
|
|
|
937
914
|
uint32_t len;
|
|
938
|
-
err = js_get_array_length(env, argv[
|
|
915
|
+
err = js_get_array_length(env, argv[2], &len);
|
|
939
916
|
assert(err == 0);
|
|
940
917
|
|
|
941
918
|
err = js_create_reference(env, argv[3], 1, &batch->on_status);
|
|
942
919
|
assert(err == 0);
|
|
943
920
|
|
|
944
|
-
|
|
945
|
-
|
|
921
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
922
|
+
js_value_t *write;
|
|
923
|
+
err = js_get_element(env, argv[2], i, &write);
|
|
924
|
+
assert(err == 0);
|
|
946
925
|
|
|
947
|
-
|
|
948
|
-
|
|
926
|
+
js_value_t *property;
|
|
927
|
+
err = js_get_named_property(env, write, "type", &property);
|
|
928
|
+
assert(err == 0);
|
|
929
|
+
|
|
930
|
+
rocksdb_write_type_t type;
|
|
931
|
+
err = js_get_value_uint32(env, property, &type);
|
|
932
|
+
assert(err == 0);
|
|
933
|
+
|
|
934
|
+
batch->writes[i].type = type;
|
|
935
|
+
|
|
936
|
+
switch (type) {
|
|
937
|
+
case rocksdb_put: {
|
|
938
|
+
rocksdb_slice_t *key = &batch->writes[i].key;
|
|
939
|
+
|
|
940
|
+
err = js_get_named_property(env, write, "key", &property);
|
|
941
|
+
assert(err == 0);
|
|
942
|
+
|
|
943
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
|
|
944
|
+
assert(err == 0);
|
|
949
945
|
|
|
950
|
-
|
|
946
|
+
rocksdb_slice_t *value = &batch->writes[i].value;
|
|
947
|
+
|
|
948
|
+
err = js_get_named_property(env, write, "value", &property);
|
|
949
|
+
assert(err == 0);
|
|
950
|
+
|
|
951
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &value->data, &value->len, NULL, NULL);
|
|
952
|
+
assert(err == 0);
|
|
953
|
+
break;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
case rocksdb_delete: {
|
|
957
|
+
rocksdb_slice_t *key = &batch->writes[i].key;
|
|
958
|
+
|
|
959
|
+
err = js_get_named_property(env, write, "key", &property);
|
|
960
|
+
assert(err == 0);
|
|
961
|
+
|
|
962
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
|
|
963
|
+
assert(err == 0);
|
|
964
|
+
break;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
case rocksdb_delete_range: {
|
|
968
|
+
rocksdb_slice_t *start = &batch->writes[i].start;
|
|
969
|
+
|
|
970
|
+
err = js_get_named_property(env, write, "start", &property);
|
|
971
|
+
assert(err == 0);
|
|
972
|
+
|
|
973
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &start->data, &start->len, NULL, NULL);
|
|
974
|
+
assert(err == 0);
|
|
975
|
+
|
|
976
|
+
rocksdb_slice_t *end = &batch->writes[i].end;
|
|
977
|
+
|
|
978
|
+
err = js_get_named_property(env, write, "end", &property);
|
|
979
|
+
assert(err == 0);
|
|
980
|
+
|
|
981
|
+
err = js_get_typedarray_info(env, property, NULL, (void **) &end->data, &end->len, NULL, NULL);
|
|
982
|
+
assert(err == 0);
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
err = rocksdb_write(&db->handle, &batch->handle, batch->writes, len, rocksdb_native__on_write);
|
|
951
989
|
assert(err == 0);
|
|
952
990
|
|
|
953
991
|
return NULL;
|
|
@@ -969,7 +1007,6 @@ rocksdb_native_exports (js_env_t *env, js_value_t *exports) {
|
|
|
969
1007
|
V("init", rocksdb_native_init)
|
|
970
1008
|
V("open", rocksdb_native_open)
|
|
971
1009
|
V("close", rocksdb_native_close)
|
|
972
|
-
V("deleteRange", rocksdb_native_delete_range)
|
|
973
1010
|
|
|
974
1011
|
V("iteratorInit", rocksdb_native_iterator_init)
|
|
975
1012
|
V("iteratorBuffer", rocksdb_native_iterator_buffer)
|
|
@@ -977,10 +1014,28 @@ rocksdb_native_exports (js_env_t *env, js_value_t *exports) {
|
|
|
977
1014
|
V("iteratorClose", rocksdb_native_iterator_close)
|
|
978
1015
|
V("iteratorRead", rocksdb_native_iterator_read)
|
|
979
1016
|
|
|
980
|
-
V("
|
|
981
|
-
V("
|
|
982
|
-
V("
|
|
983
|
-
|
|
1017
|
+
V("readInit", rocksdb_native_read_init)
|
|
1018
|
+
V("readBuffer", rocksdb_native_read_buffer)
|
|
1019
|
+
V("read", rocksdb_native_read)
|
|
1020
|
+
|
|
1021
|
+
V("writeInit", rocksdb_native_write_init)
|
|
1022
|
+
V("writeBuffer", rocksdb_native_write_buffer)
|
|
1023
|
+
V("write", rocksdb_native_write)
|
|
1024
|
+
#undef V
|
|
1025
|
+
|
|
1026
|
+
#define V(name, n) \
|
|
1027
|
+
{ \
|
|
1028
|
+
js_value_t *val; \
|
|
1029
|
+
err = js_create_uint32(env, n, &val); \
|
|
1030
|
+
assert(err == 0); \
|
|
1031
|
+
err = js_set_named_property(env, exports, name, val); \
|
|
1032
|
+
assert(err == 0); \
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
V("GET", rocksdb_get)
|
|
1036
|
+
V("PUT", rocksdb_put)
|
|
1037
|
+
V("DELETE", rocksdb_delete)
|
|
1038
|
+
V("DELETE_RANGE", rocksdb_delete_range)
|
|
984
1039
|
#undef V
|
|
985
1040
|
|
|
986
1041
|
return exports;
|