rocksdb-native 3.6.4 → 3.7.1

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 DELETED
@@ -1,1891 +0,0 @@
1
- #include <assert.h>
2
- #include <bare.h>
3
- #include <js.h>
4
- #include <rocksdb.h>
5
- #include <stdlib.h>
6
- #include <string.h>
7
- #include <utf.h>
8
-
9
- typedef struct {
10
- rocksdb_column_family_t *handle;
11
- rocksdb_column_family_descriptor_t descriptor;
12
-
13
- rocksdb_t *db;
14
-
15
- js_env_t *env;
16
- js_ref_t *ctx;
17
- } rocksdb_native_column_family_t;
18
-
19
- typedef struct {
20
- rocksdb_t handle;
21
- rocksdb_options_t options;
22
-
23
- js_env_t *env;
24
- js_ref_t *ctx;
25
-
26
- bool closing;
27
- bool exiting;
28
-
29
- js_deferred_teardown_t *teardown;
30
- } rocksdb_native_t;
31
-
32
- typedef struct {
33
- rocksdb_open_t handle;
34
-
35
- js_env_t *env;
36
- js_ref_t *ctx;
37
- js_ref_t *on_open;
38
-
39
- js_ref_t *column_families;
40
- } rocksdb_native_open_t;
41
-
42
- typedef struct {
43
- rocksdb_close_t handle;
44
-
45
- js_env_t *env;
46
- js_ref_t *ctx;
47
- js_ref_t *on_close;
48
- } rocksdb_native_close_t;
49
-
50
- typedef struct {
51
- rocksdb_suspend_t handle;
52
-
53
- js_env_t *env;
54
- js_ref_t *ctx;
55
- js_ref_t *on_suspend;
56
- } rocksdb_native_suspend_t;
57
-
58
- typedef struct {
59
- rocksdb_resume_t handle;
60
-
61
- js_env_t *env;
62
- js_ref_t *ctx;
63
- js_ref_t *on_resume;
64
- } rocksdb_native_resume_t;
65
-
66
- typedef struct {
67
- rocksdb_iterator_t handle;
68
-
69
- rocksdb_slice_t *keys;
70
- rocksdb_slice_t *values;
71
-
72
- js_env_t *env;
73
- js_ref_t *ctx;
74
- js_ref_t *on_open;
75
- js_ref_t *on_close;
76
- js_ref_t *on_read;
77
-
78
- bool closing;
79
- bool exiting;
80
-
81
- js_deferred_teardown_t *teardown;
82
- } rocksdb_native_iterator_t;
83
-
84
- typedef struct {
85
- rocksdb_read_batch_t handle;
86
-
87
- rocksdb_read_t *reads;
88
-
89
- size_t capacity;
90
-
91
- js_env_t *env;
92
- js_ref_t *ctx;
93
- js_ref_t *on_status;
94
- } rocksdb_native_read_batch_t;
95
-
96
- typedef struct {
97
- rocksdb_write_batch_t handle;
98
-
99
- rocksdb_write_t *writes;
100
-
101
- size_t capacity;
102
-
103
- js_env_t *env;
104
- js_ref_t *ctx;
105
- js_ref_t *on_status;
106
- } rocksdb_native_write_batch_t;
107
-
108
- typedef struct {
109
- rocksdb_flush_t handle;
110
-
111
- js_env_t *env;
112
- js_ref_t *ctx;
113
- js_ref_t *on_flush;
114
-
115
- js_ref_t *column_family;
116
- } rocksdb_native_flush_t;
117
-
118
- typedef struct {
119
- rocksdb_snapshot_t handle;
120
- } rocksdb_native_snapshot_t;
121
-
122
- static void
123
- rocksdb_native__on_free(js_env_t *env, void *data, void *finalize_hint) {
124
- free(data);
125
- }
126
-
127
- static void
128
- rocksdb_native__on_column_family_teardown(void *data);
129
-
130
- static void
131
- rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
132
- int err;
133
-
134
- assert(status == 0);
135
-
136
- rocksdb_native_open_t *req = (rocksdb_native_open_t *) handle->data;
137
-
138
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
139
-
140
- js_env_t *env = req->env;
141
-
142
- const rocksdb_column_family_descriptor_t *descriptors = handle->column_families;
143
-
144
- rocksdb_column_family_t **handles = handle->handles;
145
-
146
- if (db->exiting) {
147
- err = js_delete_reference(env, req->on_open);
148
- assert(err == 0);
149
-
150
- err = js_delete_reference(env, req->ctx);
151
- assert(err == 0);
152
- } else {
153
- js_handle_scope_t *scope;
154
- err = js_open_handle_scope(env, &scope);
155
- assert(err == 0);
156
-
157
- js_value_t *ctx;
158
- err = js_get_reference_value(env, req->ctx, &ctx);
159
- assert(err == 0);
160
-
161
- js_value_t *cb;
162
- err = js_get_reference_value(env, req->on_open, &cb);
163
- assert(err == 0);
164
-
165
- js_value_t *column_families;
166
- err = js_get_reference_value(env, req->column_families, &column_families);
167
- assert(err == 0);
168
-
169
- err = js_delete_reference(env, req->on_open);
170
- assert(err == 0);
171
-
172
- err = js_delete_reference(env, req->column_families);
173
- assert(err == 0);
174
-
175
- err = js_delete_reference(env, req->ctx);
176
- assert(err == 0);
177
-
178
- js_value_t *error;
179
-
180
- if (req->handle.error) {
181
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
182
- assert(err == 0);
183
- } else {
184
- err = js_get_null(env, &error);
185
- assert(err == 0);
186
- }
187
-
188
- rocksdb_column_family_t **handles = handle->handles;
189
-
190
- if (req->handle.error == NULL) {
191
- uint32_t len;
192
- err = js_get_array_length(env, column_families, &len);
193
- assert(err == 0);
194
-
195
- js_value_t **elements = malloc(len * sizeof(js_value_t *));
196
-
197
- err = js_get_array_elements(env, column_families, elements, len, 0, NULL);
198
- assert(err == 0);
199
-
200
- for (uint32_t i = 0; i < len; i++) {
201
- js_value_t *handle = elements[i];
202
-
203
- rocksdb_native_column_family_t *column_family;
204
- err = js_get_arraybuffer_info(env, handle, (void **) &column_family, NULL);
205
- assert(err == 0);
206
-
207
- column_family->handle = handles[i];
208
-
209
- err = js_reference_ref(env, column_family->ctx = db->ctx, NULL);
210
- assert(err == 0);
211
-
212
- err = js_add_teardown_callback(env, rocksdb_native__on_column_family_teardown, (void *) column_family);
213
- assert(err == 0);
214
- }
215
-
216
- free(elements);
217
- }
218
-
219
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
220
-
221
- err = js_close_handle_scope(env, scope);
222
- assert(err == 0);
223
- }
224
-
225
- free((void *) descriptors);
226
-
227
- free(handles);
228
- }
229
-
230
- static void
231
- rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
232
- int err;
233
-
234
- assert(status == 0);
235
-
236
- rocksdb_native_close_t *req = (rocksdb_native_close_t *) handle->data;
237
-
238
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
239
-
240
- js_env_t *env = req->env;
241
-
242
- js_deferred_teardown_t *teardown = db->teardown;
243
-
244
- if (db->exiting) {
245
- err = js_delete_reference(env, db->ctx);
246
- assert(err == 0);
247
-
248
- if (db->closing) {
249
- err = js_delete_reference(env, req->on_close);
250
- assert(err == 0);
251
-
252
- err = js_delete_reference(env, req->ctx);
253
- assert(err == 0);
254
- } else {
255
- free(req);
256
- }
257
- } else {
258
- js_handle_scope_t *scope;
259
- err = js_open_handle_scope(env, &scope);
260
- assert(err == 0);
261
-
262
- js_value_t *ctx;
263
- err = js_get_reference_value(env, req->ctx, &ctx);
264
- assert(err == 0);
265
-
266
- js_value_t *cb;
267
- err = js_get_reference_value(env, req->on_close, &cb);
268
- assert(err == 0);
269
-
270
- err = js_delete_reference(env, db->ctx);
271
- assert(err == 0);
272
-
273
- err = js_delete_reference(env, req->on_close);
274
- assert(err == 0);
275
-
276
- err = js_delete_reference(env, req->ctx);
277
- assert(err == 0);
278
-
279
- js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
280
-
281
- err = js_close_handle_scope(env, scope);
282
- assert(err == 0);
283
- }
284
-
285
- err = js_finish_deferred_teardown_callback(teardown);
286
- assert(err == 0);
287
- }
288
-
289
- static void
290
- rocksdb_native__on_teardown(js_deferred_teardown_t *handle, void *data) {
291
- int err;
292
-
293
- rocksdb_native_t *db = (rocksdb_native_t *) data;
294
-
295
- js_env_t *env = db->env;
296
-
297
- db->exiting = true;
298
-
299
- if (db->closing) return;
300
-
301
- rocksdb_native_close_t *req = malloc(sizeof(rocksdb_native_close_t));
302
-
303
- req->env = env;
304
- req->handle.data = (void *) req;
305
-
306
- err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_close);
307
- assert(err == 0);
308
- }
309
-
310
- static js_value_t *
311
- rocksdb_native_init(js_env_t *env, js_callback_info_t *info) {
312
- int err;
313
-
314
- size_t argc = 7;
315
- js_value_t *argv[7];
316
-
317
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
318
- assert(err == 0);
319
-
320
- assert(argc == 7);
321
-
322
- typedef bool bool_t;
323
-
324
- #define V(name, type) \
325
- assert(i < argc); \
326
- type##_t name; \
327
- err = js_get_value_##type(env, argv[i++], &name); \
328
- assert(err == 0);
329
-
330
- int i = 0;
331
-
332
- V(read_only, bool)
333
- V(create_if_missing, bool)
334
- V(create_missing_column_families, bool)
335
- V(max_background_jobs, int32)
336
- V(bytes_per_sync, int64)
337
- V(max_open_files, int32)
338
- V(use_direct_reads, bool)
339
- #undef V
340
-
341
- uv_loop_t *loop;
342
- err = js_get_env_loop(env, &loop);
343
- assert(err == 0);
344
-
345
- js_value_t *handle;
346
-
347
- rocksdb_native_t *db;
348
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_t), (void **) &db, &handle);
349
- assert(err == 0);
350
-
351
- db->env = env;
352
- db->closing = false;
353
- db->exiting = false;
354
-
355
- db->options = (rocksdb_options_t) {
356
- 1,
357
- read_only,
358
- create_if_missing,
359
- create_missing_column_families,
360
- max_background_jobs,
361
- bytes_per_sync,
362
- max_open_files,
363
- use_direct_reads
364
- };
365
-
366
- err = rocksdb_init(loop, &db->handle);
367
- assert(err == 0);
368
-
369
- return handle;
370
- }
371
-
372
- static js_value_t *
373
- rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
374
- int err;
375
-
376
- size_t argc = 6;
377
- js_value_t *argv[6];
378
-
379
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
380
- assert(err == 0);
381
-
382
- assert(argc == 6);
383
-
384
- rocksdb_native_t *db;
385
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
386
- assert(err == 0);
387
-
388
- utf8_t path[4096 + 1 /* NULL */];
389
- err = js_get_value_string_utf8(env, argv[2], path, sizeof(path), NULL);
390
- assert(err == 0);
391
-
392
- uint32_t len;
393
- err = js_get_array_length(env, argv[3], &len);
394
- assert(err == 0);
395
-
396
- rocksdb_column_family_descriptor_t *column_families = calloc(len, sizeof(rocksdb_column_family_descriptor_t));
397
-
398
- js_value_t **elements = malloc(len * sizeof(js_value_t *));
399
-
400
- err = js_get_array_elements(env, argv[3], elements, len, 0, NULL);
401
- assert(err == 0);
402
-
403
- for (uint32_t i = 0; i < len; i++) {
404
- js_value_t *handle = elements[i];
405
-
406
- rocksdb_native_column_family_t *column_family;
407
- err = js_get_arraybuffer_info(env, handle, (void **) &column_family, NULL);
408
- assert(err == 0);
409
-
410
- memcpy(&column_families[i], &column_family->descriptor, sizeof(rocksdb_column_family_descriptor_t));
411
-
412
- column_family->db = &db->handle;
413
- }
414
-
415
- free(elements);
416
-
417
- rocksdb_column_family_t **handles = calloc(len, sizeof(rocksdb_column_family_t *));
418
-
419
- js_value_t *handle;
420
-
421
- rocksdb_native_open_t *req;
422
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_open_t), (void **) &req, &handle);
423
- assert(err == 0);
424
-
425
- req->env = env;
426
- req->handle.data = (void *) req;
427
-
428
- err = js_create_reference(env, argv[1], 1, &db->ctx);
429
- assert(err == 0);
430
-
431
- err = js_create_reference(env, argv[4], 1, &req->ctx);
432
- assert(err == 0);
433
-
434
- err = js_create_reference(env, argv[5], 1, &req->on_open);
435
- assert(err == 0);
436
-
437
- err = js_create_reference(env, argv[3], 1, &req->column_families);
438
- assert(err == 0);
439
-
440
- err = rocksdb_open(&db->handle, &req->handle, (const char *) path, &db->options, column_families, handles, len, rocksdb_native__on_open);
441
- assert(err == 0);
442
-
443
- err = js_add_deferred_teardown_callback(env, rocksdb_native__on_teardown, (void *) db, &db->teardown);
444
- assert(err == 0);
445
-
446
- return handle;
447
- }
448
-
449
- static js_value_t *
450
- rocksdb_native_close(js_env_t *env, js_callback_info_t *info) {
451
- int err;
452
-
453
- size_t argc = 3;
454
- js_value_t *argv[3];
455
-
456
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
457
- assert(err == 0);
458
-
459
- assert(argc == 3);
460
-
461
- rocksdb_native_t *db;
462
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
463
- assert(err == 0);
464
-
465
- js_value_t *handle;
466
-
467
- rocksdb_native_close_t *req;
468
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_close_t), (void **) &req, &handle);
469
- assert(err == 0);
470
-
471
- req->env = env;
472
- req->handle.data = (void *) req;
473
-
474
- err = js_create_reference(env, argv[1], 1, &req->ctx);
475
- assert(err == 0);
476
-
477
- err = js_create_reference(env, argv[2], 1, &req->on_close);
478
- assert(err == 0);
479
-
480
- db->closing = true;
481
-
482
- err = rocksdb_close(&db->handle, &req->handle, rocksdb_native__on_close);
483
- assert(err == 0);
484
-
485
- return handle;
486
- }
487
-
488
- static void
489
- rocksdb_native__on_suspend(rocksdb_suspend_t *handle, int status) {
490
- int err;
491
-
492
- assert(status == 0);
493
-
494
- rocksdb_native_suspend_t *req = (rocksdb_native_suspend_t *) handle->data;
495
-
496
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
497
-
498
- js_env_t *env = req->env;
499
-
500
- js_deferred_teardown_t *teardown = db->teardown;
501
-
502
- if (db->exiting) {
503
- err = js_delete_reference(env, req->on_suspend);
504
- assert(err == 0);
505
-
506
- err = js_delete_reference(env, req->ctx);
507
- assert(err == 0);
508
- } else {
509
- js_handle_scope_t *scope;
510
- err = js_open_handle_scope(env, &scope);
511
- assert(err == 0);
512
-
513
- js_value_t *ctx;
514
- err = js_get_reference_value(env, req->ctx, &ctx);
515
- assert(err == 0);
516
-
517
- js_value_t *cb;
518
- err = js_get_reference_value(env, req->on_suspend, &cb);
519
- assert(err == 0);
520
-
521
- err = js_delete_reference(env, req->on_suspend);
522
- assert(err == 0);
523
-
524
- err = js_delete_reference(env, req->ctx);
525
- assert(err == 0);
526
-
527
- js_value_t *error;
528
-
529
- if (req->handle.error) {
530
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
531
- assert(err == 0);
532
- } else {
533
- err = js_get_null(env, &error);
534
- assert(err == 0);
535
- }
536
-
537
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
538
-
539
- err = js_close_handle_scope(env, scope);
540
- assert(err == 0);
541
- }
542
- }
543
-
544
- static js_value_t *
545
- rocksdb_native_suspend(js_env_t *env, js_callback_info_t *info) {
546
- int err;
547
-
548
- size_t argc = 3;
549
- js_value_t *argv[3];
550
-
551
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
552
- assert(err == 0);
553
-
554
- assert(argc == 3);
555
-
556
- rocksdb_native_t *db;
557
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
558
- assert(err == 0);
559
-
560
- js_value_t *handle;
561
-
562
- rocksdb_native_suspend_t *req;
563
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_suspend_t), (void **) &req, &handle);
564
- assert(err == 0);
565
-
566
- req->env = env;
567
- req->handle.data = (void *) req;
568
-
569
- err = js_create_reference(env, argv[1], 1, &req->ctx);
570
- assert(err == 0);
571
-
572
- err = js_create_reference(env, argv[2], 1, &req->on_suspend);
573
- assert(err == 0);
574
-
575
- err = rocksdb_suspend(&db->handle, &req->handle, rocksdb_native__on_suspend);
576
- assert(err == 0);
577
-
578
- return handle;
579
- }
580
-
581
- static void
582
- rocksdb_native__on_resume(rocksdb_resume_t *handle, int status) {
583
- int err;
584
-
585
- assert(status == 0);
586
-
587
- rocksdb_native_resume_t *req = (rocksdb_native_resume_t *) handle->data;
588
-
589
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
590
-
591
- js_env_t *env = req->env;
592
-
593
- js_deferred_teardown_t *teardown = db->teardown;
594
-
595
- if (db->exiting) {
596
- err = js_delete_reference(env, req->on_resume);
597
- assert(err == 0);
598
-
599
- err = js_delete_reference(env, req->ctx);
600
- assert(err == 0);
601
- } else {
602
- js_handle_scope_t *scope;
603
- err = js_open_handle_scope(env, &scope);
604
- assert(err == 0);
605
-
606
- js_value_t *ctx;
607
- err = js_get_reference_value(env, req->ctx, &ctx);
608
- assert(err == 0);
609
-
610
- js_value_t *cb;
611
- err = js_get_reference_value(env, req->on_resume, &cb);
612
- assert(err == 0);
613
-
614
- err = js_delete_reference(env, req->on_resume);
615
- assert(err == 0);
616
-
617
- err = js_delete_reference(env, req->ctx);
618
- assert(err == 0);
619
-
620
- js_value_t *error;
621
-
622
- if (req->handle.error) {
623
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
624
- assert(err == 0);
625
- } else {
626
- err = js_get_null(env, &error);
627
- assert(err == 0);
628
- }
629
-
630
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
631
-
632
- err = js_close_handle_scope(env, scope);
633
- assert(err == 0);
634
- }
635
- }
636
-
637
- static js_value_t *
638
- rocksdb_native_resume(js_env_t *env, js_callback_info_t *info) {
639
- int err;
640
-
641
- size_t argc = 3;
642
- js_value_t *argv[3];
643
-
644
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
645
- assert(err == 0);
646
-
647
- assert(argc == 3);
648
-
649
- rocksdb_native_t *db;
650
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
651
- assert(err == 0);
652
-
653
- js_value_t *handle;
654
-
655
- rocksdb_native_resume_t *req;
656
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_resume_t), (void **) &req, &handle);
657
- assert(err == 0);
658
-
659
- req->env = env;
660
- req->handle.data = (void *) req;
661
-
662
- err = js_create_reference(env, argv[1], 1, &req->ctx);
663
- assert(err == 0);
664
-
665
- err = js_create_reference(env, argv[2], 1, &req->on_resume);
666
- assert(err == 0);
667
-
668
- err = rocksdb_resume(&db->handle, &req->handle, rocksdb_native__on_resume);
669
- assert(err == 0);
670
-
671
- return handle;
672
- }
673
-
674
- static void
675
- rocksdb_native__on_column_family_teardown(void *data) {
676
- int err;
677
-
678
- rocksdb_native_column_family_t *column_family = (rocksdb_native_column_family_t *) data;
679
-
680
- js_env_t *env = column_family->env;
681
-
682
- err = rocksdb_column_family_destroy(column_family->db, column_family->handle);
683
- assert(err == 0);
684
-
685
- err = js_reference_unref(env, column_family->ctx, NULL);
686
- assert(err == 0);
687
- }
688
-
689
- static js_value_t *
690
- rocksdb_native_column_family_init(js_env_t *env, js_callback_info_t *info) {
691
- int err;
692
-
693
- size_t argc = 13;
694
- js_value_t *argv[13];
695
-
696
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
697
- assert(err == 0);
698
-
699
- assert(argc >= 11 && argc <= 13);
700
-
701
- size_t name_len;
702
- err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
703
- assert(err == 0);
704
-
705
- name_len += 1 /* NULL */;
706
-
707
- utf8_t *name = malloc(name_len);
708
- err = js_get_value_string_utf8(env, argv[0], name, name_len, NULL);
709
- assert(err == 0);
710
-
711
- typedef bool bool_t;
712
- typedef double double_t;
713
-
714
- #define V(name, type) \
715
- assert(i < argc); \
716
- type##_t name; \
717
- err = js_get_value_##type(env, argv[i++], &name); \
718
- assert(err == 0);
719
-
720
- int i = 1;
721
-
722
- V(enable_blob_files, bool)
723
- V(min_blob_size, int64)
724
- V(blob_file_size, int64)
725
- V(enable_blob_garbage_collection, bool)
726
- V(table_block_size, int64)
727
- V(table_cache_index_and_filter_blocks, bool)
728
- V(table_format_version, uint32)
729
- V(optimize_filters_for_memory, bool)
730
- V(no_block_cache, bool)
731
- V(filter_policy_type, uint32)
732
-
733
- rocksdb_filter_policy_t filter_policy = {filter_policy_type};
734
-
735
- switch (filter_policy_type) {
736
- case rocksdb_bloom_filter_policy: {
737
- V(bits_per_key, double)
738
-
739
- filter_policy.bloom = (rocksdb_bloom_filter_options_t) {
740
- 0,
741
- bits_per_key
742
- };
743
-
744
- break;
745
- }
746
- case rocksdb_ribbon_filter_policy: {
747
- V(bloom_equivalent_bits_per_key, double)
748
- V(bloom_before_level, int32)
749
-
750
- filter_policy.ribbon = (rocksdb_ribbon_filter_options_t) {
751
- 0,
752
- bloom_equivalent_bits_per_key,
753
- bloom_before_level,
754
- };
755
-
756
- break;
757
- }
758
- }
759
- #undef V
760
-
761
- uv_loop_t *loop;
762
- err = js_get_env_loop(env, &loop);
763
- assert(err == 0);
764
-
765
- js_value_t *handle;
766
-
767
- rocksdb_native_column_family_t *column_family;
768
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_column_family_t), (void **) &column_family, &handle);
769
- assert(err == 0);
770
-
771
- column_family->env = env;
772
- column_family->db = NULL;
773
- column_family->handle = NULL;
774
-
775
- column_family->descriptor = (rocksdb_column_family_descriptor_t) {
776
- (const char *) name,
777
- {
778
- 2,
779
- rocksdb_level_compaction,
780
- enable_blob_files,
781
- min_blob_size,
782
- blob_file_size,
783
- enable_blob_garbage_collection,
784
- table_block_size,
785
- table_cache_index_and_filter_blocks,
786
- table_format_version,
787
- optimize_filters_for_memory,
788
- no_block_cache,
789
- filter_policy,
790
- }
791
- };
792
-
793
- return handle;
794
- }
795
-
796
- static js_value_t *
797
- rocksdb_native_column_family_destroy(js_env_t *env, js_callback_info_t *info) {
798
- int err;
799
-
800
- size_t argc = 1;
801
- js_value_t *argv[1];
802
-
803
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
804
- assert(err == 0);
805
-
806
- assert(argc == 1);
807
-
808
- rocksdb_native_column_family_t *column_family;
809
- err = js_get_arraybuffer_info(env, argv[0], (void **) &column_family, NULL);
810
- assert(err == 0);
811
-
812
- if (column_family->handle == NULL) return NULL;
813
-
814
- err = rocksdb_column_family_destroy(column_family->db, column_family->handle);
815
- assert(err == 0);
816
-
817
- err = js_remove_teardown_callback(env, rocksdb_native__on_column_family_teardown, (void *) column_family);
818
- assert(err == 0);
819
-
820
- err = js_reference_unref(env, column_family->ctx, NULL);
821
- assert(err == 0);
822
-
823
- column_family->handle = NULL;
824
-
825
- return NULL;
826
- }
827
-
828
- static js_value_t *
829
- rocksdb_native_iterator_init(js_env_t *env, js_callback_info_t *info) {
830
- int err;
831
-
832
- js_value_t *handle;
833
-
834
- rocksdb_native_iterator_t *req;
835
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_iterator_t), (void **) &req, &handle);
836
- assert(err == 0);
837
-
838
- req->env = env;
839
- req->closing = false;
840
- req->exiting = false;
841
- req->handle.data = (void *) req;
842
-
843
- return handle;
844
- }
845
-
846
- static js_value_t *
847
- rocksdb_native_iterator_buffer(js_env_t *env, js_callback_info_t *info) {
848
- int err;
849
-
850
- size_t argc = 2;
851
- js_value_t *argv[2];
852
-
853
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
854
- assert(err == 0);
855
-
856
- assert(argc == 2);
857
-
858
- rocksdb_native_iterator_t *req;
859
- err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
860
- assert(err == 0);
861
-
862
- uint32_t capacity;
863
- err = js_get_value_uint32(env, argv[1], &capacity);
864
- assert(err == 0);
865
-
866
- js_value_t *handle;
867
-
868
- uint8_t *data;
869
- err = js_create_arraybuffer(env, 2 * capacity * sizeof(rocksdb_slice_t), (void **) &data, &handle);
870
- assert(err == 0);
871
-
872
- size_t offset = 0;
873
-
874
- req->keys = (rocksdb_slice_t *) &data[offset];
875
-
876
- offset += capacity * sizeof(rocksdb_slice_t);
877
-
878
- req->values = (rocksdb_slice_t *) &data[offset];
879
-
880
- return handle;
881
- }
882
-
883
- static void
884
- rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
885
- int err;
886
-
887
- assert(status == 0);
888
-
889
- rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
890
-
891
- js_env_t *env = req->env;
892
-
893
- js_deferred_teardown_t *teardown = req->teardown;
894
-
895
- if (req->exiting) {
896
- err = js_delete_reference(env, req->on_open);
897
- assert(err == 0);
898
-
899
- err = js_delete_reference(env, req->on_close);
900
- assert(err == 0);
901
-
902
- err = js_delete_reference(env, req->on_read);
903
- assert(err == 0);
904
-
905
- err = js_delete_reference(env, req->ctx);
906
- assert(err == 0);
907
- } else {
908
- js_handle_scope_t *scope;
909
- err = js_open_handle_scope(env, &scope);
910
- assert(err == 0);
911
-
912
- js_value_t *ctx;
913
- err = js_get_reference_value(env, req->ctx, &ctx);
914
- assert(err == 0);
915
-
916
- js_value_t *cb;
917
- err = js_get_reference_value(env, req->on_close, &cb);
918
- assert(err == 0);
919
-
920
- err = js_delete_reference(env, req->on_open);
921
- assert(err == 0);
922
-
923
- err = js_delete_reference(env, req->on_close);
924
- assert(err == 0);
925
-
926
- err = js_delete_reference(env, req->on_read);
927
- assert(err == 0);
928
-
929
- err = js_delete_reference(env, req->ctx);
930
- assert(err == 0);
931
-
932
- js_value_t *error;
933
-
934
- if (req->handle.error) {
935
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
936
- assert(err == 0);
937
- } else {
938
- err = js_get_null(env, &error);
939
- assert(err == 0);
940
- }
941
-
942
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
943
-
944
- err = js_close_handle_scope(env, scope);
945
- assert(err == 0);
946
- }
947
-
948
- err = js_finish_deferred_teardown_callback(teardown);
949
- assert(err == 0);
950
- }
951
-
952
- static void
953
- rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
954
- int err;
955
-
956
- assert(status == 0);
957
-
958
- rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
959
-
960
- if (req->exiting) return;
961
-
962
- js_env_t *env = req->env;
963
-
964
- js_handle_scope_t *scope;
965
- err = js_open_handle_scope(env, &scope);
966
- assert(err == 0);
967
-
968
- js_value_t *ctx;
969
- err = js_get_reference_value(env, req->ctx, &ctx);
970
- assert(err == 0);
971
-
972
- js_value_t *cb;
973
- err = js_get_reference_value(env, req->on_open, &cb);
974
- assert(err == 0);
975
-
976
- js_value_t *error;
977
-
978
- if (req->handle.error) {
979
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
980
- assert(err == 0);
981
- } else {
982
- err = js_get_null(env, &error);
983
- assert(err == 0);
984
- }
985
-
986
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
987
-
988
- err = js_close_handle_scope(env, scope);
989
- assert(err == 0);
990
- }
991
-
992
- static void
993
- rocksdb_native__on_iterator_teardown(js_deferred_teardown_t *handle, void *data) {
994
- int err;
995
-
996
- rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) data;
997
-
998
- req->exiting = true;
999
-
1000
- if (req->closing) return;
1001
-
1002
- err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
1003
- assert(err == 0);
1004
- }
1005
-
1006
- static js_value_t *
1007
- rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
1008
- int err;
1009
-
1010
- size_t argc = 14;
1011
- js_value_t *argv[14];
1012
-
1013
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1014
- assert(err == 0);
1015
-
1016
- assert(argc == 14);
1017
-
1018
- rocksdb_native_t *db;
1019
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
1020
- assert(err == 0);
1021
-
1022
- rocksdb_native_iterator_t *req;
1023
- err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
1024
- assert(err == 0);
1025
-
1026
- rocksdb_native_column_family_t *column_family;
1027
- err = js_get_arraybuffer_info(env, argv[2], (void **) &column_family, NULL);
1028
- assert(err == 0);
1029
-
1030
- rocksdb_range_t range;
1031
-
1032
- err = js_get_typedarray_info(env, argv[3], NULL, (void **) &range.gt.data, &range.gt.len, NULL, NULL);
1033
- assert(err == 0);
1034
-
1035
- err = js_get_typedarray_info(env, argv[4], NULL, (void **) &range.gte.data, &range.gte.len, NULL, NULL);
1036
- assert(err == 0);
1037
-
1038
- err = js_get_typedarray_info(env, argv[5], NULL, (void **) &range.lt.data, &range.lt.len, NULL, NULL);
1039
- assert(err == 0);
1040
-
1041
- err = js_get_typedarray_info(env, argv[6], NULL, (void **) &range.lte.data, &range.lte.len, NULL, NULL);
1042
- assert(err == 0);
1043
-
1044
- rocksdb_iterator_options_t options = {
1045
- .version = 0,
1046
- };
1047
-
1048
- err = js_get_value_bool(env, argv[7], &options.reverse);
1049
- assert(err == 0);
1050
-
1051
- err = js_get_value_bool(env, argv[8], &options.keys_only);
1052
- assert(err == 0);
1053
-
1054
- bool has_snapshot;
1055
- err = js_is_arraybuffer(env, argv[9], &has_snapshot);
1056
- assert(err == 0);
1057
-
1058
- if (has_snapshot) {
1059
- err = js_get_arraybuffer_info(env, argv[9], (void **) &options.snapshot, NULL);
1060
- assert(err == 0);
1061
- }
1062
-
1063
- err = js_create_reference(env, argv[10], 1, &req->ctx);
1064
- assert(err == 0);
1065
-
1066
- err = js_create_reference(env, argv[11], 1, &req->on_open);
1067
- assert(err == 0);
1068
-
1069
- err = js_create_reference(env, argv[12], 1, &req->on_close);
1070
- assert(err == 0);
1071
-
1072
- err = js_create_reference(env, argv[13], 1, &req->on_read);
1073
- assert(err == 0);
1074
-
1075
- err = rocksdb_iterator_open(&db->handle, &req->handle, column_family->handle, range, &options, rocksdb_native__on_iterator_open);
1076
- assert(err == 0);
1077
-
1078
- err = js_add_deferred_teardown_callback(env, rocksdb_native__on_iterator_teardown, (void *) req, &req->teardown);
1079
- assert(err == 0);
1080
-
1081
- return NULL;
1082
- }
1083
-
1084
- static js_value_t *
1085
- rocksdb_native_iterator_close(js_env_t *env, js_callback_info_t *info) {
1086
- int err;
1087
-
1088
- size_t argc = 1;
1089
- js_value_t *argv[1];
1090
-
1091
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1092
- assert(err == 0);
1093
-
1094
- assert(argc == 1);
1095
-
1096
- rocksdb_native_iterator_t *req;
1097
- err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
1098
- assert(err == 0);
1099
-
1100
- req->closing = true;
1101
-
1102
- err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
1103
- assert(err == 0);
1104
-
1105
- return NULL;
1106
- }
1107
-
1108
- static int
1109
- rocksdb_native_try_create_external_arraybuffer(js_env_t *env, void *data, size_t len, js_value_t **result) {
1110
- // the external arraybuffer api is optional per (https://nodejs.org/api/n-api.html#napi_create_external_arraybuffer)
1111
- // so provide a fallback that does a memcpy
1112
- int err = js_create_external_arraybuffer(env, data, len, rocksdb_native__on_free, NULL, result);
1113
- if (err == 0) return 0;
1114
-
1115
- void *cpy;
1116
- err = js_create_arraybuffer(env, len, &cpy, result);
1117
- if (err != 0) return err;
1118
-
1119
- memcpy(cpy, data, len);
1120
- free(data);
1121
-
1122
- return 0;
1123
- }
1124
-
1125
- static void
1126
- rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
1127
- int err;
1128
-
1129
- assert(status == 0);
1130
-
1131
- rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
1132
-
1133
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
1134
-
1135
- size_t len = req->handle.len;
1136
-
1137
- if (db->exiting) {
1138
- if (status == 0 && req->handle.error == NULL) {
1139
- for (size_t i = 0; i < len; i++) {
1140
- js_value_t *result;
1141
-
1142
- rocksdb_slice_destroy(&req->keys[i]);
1143
-
1144
- rocksdb_slice_destroy(&req->values[i]);
1145
- }
1146
- }
1147
- } else {
1148
- js_env_t *env = req->env;
1149
-
1150
- js_handle_scope_t *scope;
1151
- err = js_open_handle_scope(env, &scope);
1152
- assert(err == 0);
1153
-
1154
- js_value_t *ctx;
1155
- err = js_get_reference_value(env, req->ctx, &ctx);
1156
- assert(err == 0);
1157
-
1158
- js_value_t *cb;
1159
- err = js_get_reference_value(env, req->on_read, &cb);
1160
- assert(err == 0);
1161
-
1162
- js_value_t *keys;
1163
- err = js_create_array_with_length(env, len, &keys);
1164
- assert(err == 0);
1165
-
1166
- js_value_t *values;
1167
- err = js_create_array_with_length(env, len, &values);
1168
- assert(err == 0);
1169
-
1170
- js_value_t *error;
1171
-
1172
- if (req->handle.error) {
1173
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
1174
- assert(err == 0);
1175
- } else {
1176
- err = js_get_null(env, &error);
1177
- assert(err == 0);
1178
-
1179
- for (size_t i = 0; i < len; i++) {
1180
- js_value_t *result;
1181
-
1182
- rocksdb_slice_t *key = &req->keys[i];
1183
-
1184
- err = rocksdb_native_try_create_external_arraybuffer(env, (void *) key->data, key->len, &result);
1185
- assert(err == 0);
1186
-
1187
- err = js_set_element(env, keys, i, result);
1188
- assert(err == 0);
1189
-
1190
- rocksdb_slice_t *value = &req->values[i];
1191
-
1192
- err = rocksdb_native_try_create_external_arraybuffer(env, (void *) value->data, value->len, &result);
1193
- assert(err == 0);
1194
-
1195
- err = js_set_element(env, values, i, result);
1196
- assert(err == 0);
1197
- }
1198
- }
1199
-
1200
- js_call_function_with_checkpoint(env, ctx, cb, 3, (js_value_t *[]) {error, keys, values}, NULL);
1201
-
1202
- err = js_close_handle_scope(env, scope);
1203
- assert(err == 0);
1204
- }
1205
- }
1206
-
1207
- static js_value_t *
1208
- rocksdb_native_iterator_read(js_env_t *env, js_callback_info_t *info) {
1209
- int err;
1210
-
1211
- size_t argc = 2;
1212
- js_value_t *argv[2];
1213
-
1214
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1215
- assert(err == 0);
1216
-
1217
- assert(argc == 2);
1218
-
1219
- rocksdb_native_iterator_t *req;
1220
- err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
1221
- assert(err == 0);
1222
-
1223
- uint32_t capacity;
1224
- err = js_get_value_uint32(env, argv[1], &capacity);
1225
- assert(err == 0);
1226
-
1227
- err = rocksdb_iterator_read(&req->handle, req->keys, req->values, capacity, rocksdb_native__on_iterator_read);
1228
- assert(err == 0);
1229
-
1230
- return NULL;
1231
- }
1232
-
1233
- static js_value_t *
1234
- rocksdb_native_read_init(js_env_t *env, js_callback_info_t *info) {
1235
- int err;
1236
-
1237
- js_value_t *handle;
1238
-
1239
- rocksdb_native_read_batch_t *req;
1240
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_read_batch_t), (void **) &req, &handle);
1241
- assert(err == 0);
1242
-
1243
- req->env = env;
1244
- req->handle.data = (void *) req;
1245
-
1246
- return handle;
1247
- }
1248
-
1249
- static js_value_t *
1250
- rocksdb_native_read_buffer(js_env_t *env, js_callback_info_t *info) {
1251
- int err;
1252
-
1253
- size_t argc = 2;
1254
- js_value_t *argv[2];
1255
-
1256
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1257
- assert(err == 0);
1258
-
1259
- assert(argc == 2);
1260
-
1261
- rocksdb_native_read_batch_t *req;
1262
- err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
1263
- assert(err == 0);
1264
-
1265
- uint32_t capacity;
1266
- err = js_get_value_uint32(env, argv[1], &capacity);
1267
- assert(err == 0);
1268
-
1269
- js_value_t *handle;
1270
-
1271
- rocksdb_read_t *reads;
1272
- err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_read_t), (void **) &reads, &handle);
1273
- assert(err == 0);
1274
-
1275
- req->capacity = capacity;
1276
- req->reads = reads;
1277
-
1278
- return handle;
1279
- }
1280
-
1281
- static void
1282
- rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
1283
- int err;
1284
-
1285
- assert(status == 0);
1286
-
1287
- rocksdb_native_read_batch_t *req = (rocksdb_native_read_batch_t *) handle->data;
1288
-
1289
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
1290
-
1291
- js_env_t *env = req->env;
1292
-
1293
- size_t len = req->handle.len;
1294
-
1295
- if (db->exiting) {
1296
- if (status == 0) {
1297
- for (size_t i = 0; i < len; i++) {
1298
- js_value_t *result;
1299
-
1300
- char *error = req->handle.errors[i];
1301
-
1302
- if (error) continue;
1303
-
1304
- rocksdb_slice_destroy(&req->reads[i].value);
1305
- }
1306
- }
1307
-
1308
- err = js_delete_reference(env, req->on_status);
1309
- assert(err == 0);
1310
-
1311
- err = js_delete_reference(env, req->ctx);
1312
- assert(err == 0);
1313
- } else {
1314
- js_handle_scope_t *scope;
1315
- err = js_open_handle_scope(env, &scope);
1316
- assert(err == 0);
1317
-
1318
- js_value_t *errors;
1319
- err = js_create_array_with_length(env, len, &errors);
1320
- assert(err == 0);
1321
-
1322
- js_value_t *values;
1323
- err = js_create_array_with_length(env, len, &values);
1324
- assert(err == 0);
1325
-
1326
- for (size_t i = 0; i < len; i++) {
1327
- js_value_t *result;
1328
-
1329
- char *error = req->handle.errors[i];
1330
-
1331
- if (error) {
1332
- err = js_create_string_utf8(env, (utf8_t *) error, -1, &result);
1333
- assert(err == 0);
1334
-
1335
- err = js_set_element(env, errors, i, result);
1336
- assert(err == 0);
1337
- } else {
1338
- rocksdb_slice_t *slice = &req->reads[i].value;
1339
-
1340
- if (slice->data == NULL && slice->len == (size_t) -1) {
1341
- err = js_get_null(env, &result);
1342
- assert(err == 0);
1343
- } else {
1344
- err = rocksdb_native_try_create_external_arraybuffer(env, (void *) slice->data, slice->len, &result);
1345
- assert(err == 0);
1346
- }
1347
-
1348
- err = js_set_element(env, values, i, result);
1349
- assert(err == 0);
1350
- }
1351
- }
1352
-
1353
- js_value_t *ctx;
1354
- err = js_get_reference_value(env, req->ctx, &ctx);
1355
- assert(err == 0);
1356
-
1357
- js_value_t *cb;
1358
- err = js_get_reference_value(env, req->on_status, &cb);
1359
- assert(err == 0);
1360
-
1361
- err = js_delete_reference(env, req->on_status);
1362
- assert(err == 0);
1363
-
1364
- err = js_delete_reference(env, req->ctx);
1365
- assert(err == 0);
1366
-
1367
- js_call_function_with_checkpoint(env, ctx, cb, 2, (js_value_t *[]) {errors, values}, NULL);
1368
-
1369
- err = js_close_handle_scope(env, scope);
1370
- assert(err == 0);
1371
- }
1372
- }
1373
-
1374
- static js_value_t *
1375
- rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
1376
- int err;
1377
-
1378
- size_t argc = 6;
1379
- js_value_t *argv[6];
1380
-
1381
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1382
- assert(err == 0);
1383
-
1384
- assert(argc == 6);
1385
-
1386
- rocksdb_native_t *db;
1387
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
1388
- assert(err == 0);
1389
-
1390
- rocksdb_native_read_batch_t *req;
1391
- err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
1392
- assert(err == 0);
1393
-
1394
- uint32_t len;
1395
- err = js_get_array_length(env, argv[2], &len);
1396
- assert(err == 0);
1397
-
1398
- err = js_create_reference(env, argv[4], 1, &req->ctx);
1399
- assert(err == 0);
1400
-
1401
- err = js_create_reference(env, argv[5], 1, &req->on_status);
1402
- assert(err == 0);
1403
-
1404
- js_value_t **elements = malloc(len * sizeof(js_value_t *));
1405
-
1406
- err = js_get_array_elements(env, argv[2], elements, len, 0, NULL);
1407
- assert(err == 0);
1408
-
1409
- for (uint32_t i = 0; i < len; i++) {
1410
- js_value_t *read = elements[i];
1411
-
1412
- js_value_t *property;
1413
-
1414
- err = js_get_named_property(env, read, "type", &property);
1415
- assert(err == 0);
1416
-
1417
- rocksdb_read_type_t type;
1418
- err = js_get_value_uint32(env, property, &type);
1419
- assert(err == 0);
1420
-
1421
- req->reads[i].type = type;
1422
-
1423
- err = js_get_named_property(env, read, "columnFamily", &property);
1424
- assert(err == 0);
1425
-
1426
- rocksdb_native_column_family_t *column_family;
1427
- err = js_get_arraybuffer_info(env, property, (void **) &column_family, NULL);
1428
- assert(err == 0);
1429
-
1430
- req->reads[i].column_family = column_family->handle;
1431
-
1432
- switch (type) {
1433
- case rocksdb_get: {
1434
- rocksdb_slice_t *key = &req->reads[i].key;
1435
-
1436
- err = js_get_named_property(env, read, "key", &property);
1437
- assert(err == 0);
1438
-
1439
- err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
1440
- assert(err == 0);
1441
- break;
1442
- }
1443
- }
1444
- }
1445
-
1446
- free(elements);
1447
-
1448
- rocksdb_read_options_t options = {
1449
- .version = 0,
1450
- };
1451
-
1452
- bool has_snapshot;
1453
- err = js_is_arraybuffer(env, argv[3], &has_snapshot);
1454
- assert(err == 0);
1455
-
1456
- if (has_snapshot) {
1457
- err = js_get_arraybuffer_info(env, argv[3], (void **) &options.snapshot, NULL);
1458
- assert(err == 0);
1459
- }
1460
-
1461
- err = rocksdb_read(&db->handle, &req->handle, req->reads, len, &options, rocksdb_native__on_read);
1462
- assert(err == 0);
1463
-
1464
- return NULL;
1465
- }
1466
-
1467
- static js_value_t *
1468
- rocksdb_native_write_init(js_env_t *env, js_callback_info_t *info) {
1469
- int err;
1470
-
1471
- js_value_t *handle;
1472
-
1473
- rocksdb_native_write_batch_t *req;
1474
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_write_batch_t), (void **) &req, &handle);
1475
- assert(err == 0);
1476
-
1477
- req->env = env;
1478
- req->handle.data = (void *) req;
1479
-
1480
- return handle;
1481
- }
1482
-
1483
- static js_value_t *
1484
- rocksdb_native_write_buffer(js_env_t *env, js_callback_info_t *info) {
1485
- int err;
1486
-
1487
- size_t argc = 2;
1488
- js_value_t *argv[2];
1489
-
1490
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1491
- assert(err == 0);
1492
-
1493
- assert(argc == 2);
1494
-
1495
- rocksdb_native_write_batch_t *req;
1496
- err = js_get_arraybuffer_info(env, argv[0], (void **) &req, NULL);
1497
- assert(err == 0);
1498
-
1499
- uint32_t capacity;
1500
- err = js_get_value_uint32(env, argv[1], &capacity);
1501
- assert(err == 0);
1502
-
1503
- js_value_t *handle;
1504
-
1505
- rocksdb_write_t *writes;
1506
- err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_write_t), (void **) &writes, &handle);
1507
- assert(err == 0);
1508
-
1509
- req->capacity = capacity;
1510
- req->writes = writes;
1511
-
1512
- return handle;
1513
- }
1514
-
1515
- static void
1516
- rocksdb_native__on_write(rocksdb_write_batch_t *handle, int status) {
1517
- int err;
1518
-
1519
- assert(status == 0);
1520
-
1521
- rocksdb_native_write_batch_t *req = (rocksdb_native_write_batch_t *) handle->data;
1522
-
1523
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
1524
-
1525
- js_env_t *env = req->env;
1526
-
1527
- if (db->exiting) {
1528
- err = js_delete_reference(env, req->on_status);
1529
- assert(err == 0);
1530
-
1531
- err = js_delete_reference(env, req->ctx);
1532
- assert(err == 0);
1533
- } else {
1534
- js_handle_scope_t *scope;
1535
- err = js_open_handle_scope(env, &scope);
1536
- assert(err == 0);
1537
-
1538
- js_value_t *error;
1539
-
1540
- if (req->handle.error) {
1541
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
1542
- assert(err == 0);
1543
- } else {
1544
- err = js_get_null(env, &error);
1545
- assert(err == 0);
1546
- }
1547
-
1548
- js_value_t *ctx;
1549
- err = js_get_reference_value(env, req->ctx, &ctx);
1550
- assert(err == 0);
1551
-
1552
- js_value_t *cb;
1553
- err = js_get_reference_value(env, req->on_status, &cb);
1554
- assert(err == 0);
1555
-
1556
- err = js_delete_reference(env, req->on_status);
1557
- assert(err == 0);
1558
-
1559
- err = js_delete_reference(env, req->ctx);
1560
- assert(err == 0);
1561
-
1562
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
1563
-
1564
- err = js_close_handle_scope(env, scope);
1565
- assert(err == 0);
1566
- }
1567
- }
1568
-
1569
- static js_value_t *
1570
- rocksdb_native_write(js_env_t *env, js_callback_info_t *info) {
1571
- int err;
1572
-
1573
- size_t argc = 5;
1574
- js_value_t *argv[5];
1575
-
1576
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1577
- assert(err == 0);
1578
-
1579
- assert(argc == 5);
1580
-
1581
- rocksdb_native_t *db;
1582
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
1583
- assert(err == 0);
1584
-
1585
- rocksdb_native_write_batch_t *req;
1586
- err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
1587
- assert(err == 0);
1588
-
1589
- uint32_t len;
1590
- err = js_get_array_length(env, argv[2], &len);
1591
- assert(err == 0);
1592
-
1593
- err = js_create_reference(env, argv[3], 1, &req->ctx);
1594
- assert(err == 0);
1595
-
1596
- err = js_create_reference(env, argv[4], 1, &req->on_status);
1597
- assert(err == 0);
1598
-
1599
- js_value_t **elements = malloc(len * sizeof(js_value_t *));
1600
-
1601
- err = js_get_array_elements(env, argv[2], elements, len, 0, NULL);
1602
- assert(err == 0);
1603
-
1604
- for (uint32_t i = 0; i < len; i++) {
1605
- js_value_t *write = elements[i];
1606
-
1607
- js_value_t *property;
1608
-
1609
- err = js_get_named_property(env, write, "type", &property);
1610
- assert(err == 0);
1611
-
1612
- rocksdb_write_type_t type;
1613
- err = js_get_value_uint32(env, property, &type);
1614
- assert(err == 0);
1615
-
1616
- req->writes[i].type = type;
1617
-
1618
- err = js_get_named_property(env, write, "columnFamily", &property);
1619
- assert(err == 0);
1620
-
1621
- rocksdb_native_column_family_t *column_family;
1622
- err = js_get_arraybuffer_info(env, property, (void **) &column_family, NULL);
1623
- assert(err == 0);
1624
-
1625
- req->writes[i].column_family = column_family->handle;
1626
-
1627
- switch (type) {
1628
- case rocksdb_put: {
1629
- rocksdb_slice_t *key = &req->writes[i].key;
1630
-
1631
- err = js_get_named_property(env, write, "key", &property);
1632
- assert(err == 0);
1633
-
1634
- err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
1635
- assert(err == 0);
1636
-
1637
- rocksdb_slice_t *value = &req->writes[i].value;
1638
-
1639
- err = js_get_named_property(env, write, "value", &property);
1640
- assert(err == 0);
1641
-
1642
- err = js_get_typedarray_info(env, property, NULL, (void **) &value->data, &value->len, NULL, NULL);
1643
- assert(err == 0);
1644
- break;
1645
- }
1646
-
1647
- case rocksdb_delete: {
1648
- rocksdb_slice_t *key = &req->writes[i].key;
1649
-
1650
- err = js_get_named_property(env, write, "key", &property);
1651
- assert(err == 0);
1652
-
1653
- err = js_get_typedarray_info(env, property, NULL, (void **) &key->data, &key->len, NULL, NULL);
1654
- assert(err == 0);
1655
- break;
1656
- }
1657
-
1658
- case rocksdb_delete_range: {
1659
- rocksdb_slice_t *start = &req->writes[i].start;
1660
-
1661
- err = js_get_named_property(env, write, "start", &property);
1662
- assert(err == 0);
1663
-
1664
- err = js_get_typedarray_info(env, property, NULL, (void **) &start->data, &start->len, NULL, NULL);
1665
- assert(err == 0);
1666
-
1667
- rocksdb_slice_t *end = &req->writes[i].end;
1668
-
1669
- err = js_get_named_property(env, write, "end", &property);
1670
- assert(err == 0);
1671
-
1672
- err = js_get_typedarray_info(env, property, NULL, (void **) &end->data, &end->len, NULL, NULL);
1673
- assert(err == 0);
1674
- break;
1675
- }
1676
- }
1677
- }
1678
-
1679
- free(elements);
1680
-
1681
- err = rocksdb_write(&db->handle, &req->handle, req->writes, len, NULL, rocksdb_native__on_write);
1682
- assert(err == 0);
1683
-
1684
- return NULL;
1685
- }
1686
-
1687
- static void
1688
- rocksdb_native__on_flush(rocksdb_flush_t *handle, int status) {
1689
- int err;
1690
-
1691
- assert(status == 0);
1692
-
1693
- rocksdb_native_flush_t *req = (rocksdb_native_flush_t *) handle->data;
1694
-
1695
- rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
1696
-
1697
- js_env_t *env = req->env;
1698
-
1699
- if (db->exiting) {
1700
- err = js_delete_reference(env, req->on_flush);
1701
- assert(err == 0);
1702
-
1703
- err = js_delete_reference(env, req->ctx);
1704
- assert(err == 0);
1705
- } else {
1706
- js_handle_scope_t *scope;
1707
- err = js_open_handle_scope(env, &scope);
1708
- assert(err == 0);
1709
-
1710
- js_value_t *error;
1711
-
1712
- if (req->handle.error) {
1713
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
1714
- assert(err == 0);
1715
- } else {
1716
- err = js_get_null(env, &error);
1717
- assert(err == 0);
1718
- }
1719
-
1720
- js_value_t *ctx;
1721
- err = js_get_reference_value(env, req->ctx, &ctx);
1722
- assert(err == 0);
1723
-
1724
- js_value_t *cb;
1725
- err = js_get_reference_value(env, req->on_flush, &cb);
1726
- assert(err == 0);
1727
-
1728
- err = js_delete_reference(env, req->on_flush);
1729
- assert(err == 0);
1730
-
1731
- err = js_delete_reference(env, req->ctx);
1732
- assert(err == 0);
1733
-
1734
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
1735
-
1736
- err = js_close_handle_scope(env, scope);
1737
- assert(err == 0);
1738
- }
1739
- }
1740
-
1741
- static js_value_t *
1742
- rocksdb_native_flush(js_env_t *env, js_callback_info_t *info) {
1743
- int err;
1744
-
1745
- size_t argc = 4;
1746
- js_value_t *argv[4];
1747
-
1748
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1749
- assert(err == 0);
1750
-
1751
- assert(argc == 4);
1752
-
1753
- rocksdb_native_t *db;
1754
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
1755
- assert(err == 0);
1756
-
1757
- rocksdb_native_column_family_t *column_family;
1758
- err = js_get_arraybuffer_info(env, argv[1], (void **) &column_family, NULL);
1759
- assert(err == 0);
1760
-
1761
- js_value_t *handle;
1762
-
1763
- rocksdb_native_flush_t *req;
1764
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_flush_t), (void **) &req, &handle);
1765
- assert(err == 0);
1766
-
1767
- req->env = env;
1768
- req->handle.data = (void *) req;
1769
-
1770
- err = js_create_reference(env, argv[2], 1, &req->ctx);
1771
- assert(err == 0);
1772
-
1773
- err = js_create_reference(env, argv[3], 1, &req->on_flush);
1774
- assert(err == 0);
1775
-
1776
- err = rocksdb_flush(&db->handle, &req->handle, column_family->handle, NULL, rocksdb_native__on_flush);
1777
- assert(err == 0);
1778
-
1779
- return handle;
1780
- }
1781
-
1782
- static js_value_t *
1783
- rocksdb_native_snapshot_create(js_env_t *env, js_callback_info_t *info) {
1784
- int err;
1785
-
1786
- size_t argc = 1;
1787
- js_value_t *argv[1];
1788
-
1789
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1790
- assert(err == 0);
1791
-
1792
- assert(argc == 1);
1793
-
1794
- rocksdb_native_t *db;
1795
- err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
1796
- assert(err == 0);
1797
-
1798
- js_value_t *handle;
1799
-
1800
- rocksdb_native_snapshot_t *snapshot;
1801
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_snapshot_t), (void **) &snapshot, &handle);
1802
- assert(err == 0);
1803
-
1804
- err = rocksdb_snapshot_create(&db->handle, &snapshot->handle);
1805
- assert(err == 0);
1806
-
1807
- return handle;
1808
- }
1809
-
1810
- static js_value_t *
1811
- rocksdb_native_snapshot_destroy(js_env_t *env, js_callback_info_t *info) {
1812
- int err;
1813
-
1814
- size_t argc = 1;
1815
- js_value_t *argv[1];
1816
-
1817
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1818
- assert(err == 0);
1819
-
1820
- assert(argc == 1);
1821
-
1822
- rocksdb_native_snapshot_t *snapshot;
1823
- err = js_get_arraybuffer_info(env, argv[0], (void **) &snapshot, NULL);
1824
- assert(err == 0);
1825
-
1826
- rocksdb_snapshot_destroy(&snapshot->handle);
1827
-
1828
- return NULL;
1829
- }
1830
-
1831
- static js_value_t *
1832
- rocksdb_native_exports(js_env_t *env, js_value_t *exports) {
1833
- int err;
1834
-
1835
- #define V(name, fn) \
1836
- { \
1837
- js_value_t *val; \
1838
- err = js_create_function(env, name, -1, fn, NULL, &val); \
1839
- assert(err == 0); \
1840
- err = js_set_named_property(env, exports, name, val); \
1841
- assert(err == 0); \
1842
- }
1843
-
1844
- V("init", rocksdb_native_init)
1845
- V("open", rocksdb_native_open)
1846
- V("close", rocksdb_native_close)
1847
- V("suspend", rocksdb_native_suspend)
1848
- V("resume", rocksdb_native_resume)
1849
-
1850
- V("columnFamilyInit", rocksdb_native_column_family_init)
1851
- V("columnFamilyDestroy", rocksdb_native_column_family_destroy)
1852
-
1853
- V("iteratorInit", rocksdb_native_iterator_init)
1854
- V("iteratorBuffer", rocksdb_native_iterator_buffer)
1855
- V("iteratorOpen", rocksdb_native_iterator_open)
1856
- V("iteratorClose", rocksdb_native_iterator_close)
1857
- V("iteratorRead", rocksdb_native_iterator_read)
1858
-
1859
- V("readInit", rocksdb_native_read_init)
1860
- V("readBuffer", rocksdb_native_read_buffer)
1861
- V("read", rocksdb_native_read)
1862
-
1863
- V("writeInit", rocksdb_native_write_init)
1864
- V("writeBuffer", rocksdb_native_write_buffer)
1865
- V("write", rocksdb_native_write)
1866
-
1867
- V("flush", rocksdb_native_flush)
1868
-
1869
- V("snapshotCreate", rocksdb_native_snapshot_create)
1870
- V("snapshotDestroy", rocksdb_native_snapshot_destroy)
1871
- #undef V
1872
-
1873
- #define V(name, n) \
1874
- { \
1875
- js_value_t *val; \
1876
- err = js_create_uint32(env, n, &val); \
1877
- assert(err == 0); \
1878
- err = js_set_named_property(env, exports, name, val); \
1879
- assert(err == 0); \
1880
- }
1881
-
1882
- V("GET", rocksdb_get)
1883
- V("PUT", rocksdb_put)
1884
- V("DELETE", rocksdb_delete)
1885
- V("DELETE_RANGE", rocksdb_delete_range)
1886
- #undef V
1887
-
1888
- return exports;
1889
- }
1890
-
1891
- BARE_MODULE(rocksdb_native, rocksdb_native_exports)