rocksdb-native 2.6.9 → 3.0.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/binding.c CHANGED
@@ -4,6 +4,7 @@
4
4
  #include <rocksdb.h>
5
5
  #include <stdlib.h>
6
6
  #include <utf.h>
7
+ #include <string.h>
7
8
 
8
9
  typedef struct {
9
10
  uint32_t low;
@@ -13,8 +14,12 @@ typedef struct {
13
14
  typedef struct {
14
15
  uint32_t read_only;
15
16
  uint32_t create_if_missing;
17
+ uint32_t create_missing_column_families;
16
18
  uint32_t max_background_jobs;
17
19
  rocksdb_native_uint64_t bytes_per_sync;
20
+ } rocksdb_native_options_t;
21
+
22
+ typedef struct {
18
23
  uint32_t compation_style;
19
24
  uint32_t enable_blob_files;
20
25
  rocksdb_native_uint64_t min_blob_size;
@@ -23,10 +28,21 @@ typedef struct {
23
28
  rocksdb_native_uint64_t table_block_size;
24
29
  uint32_t table_cache_index_and_filter_blocks;
25
30
  uint32_t table_format_version;
26
- } rocksdb_native_open_options_t;
31
+ } rocksdb_native_column_family_options_t;
32
+
33
+ typedef struct {
34
+ rocksdb_column_family_t *handle;
35
+ rocksdb_column_family_descriptor_t descriptor;
36
+
37
+ rocksdb_t *db;
38
+
39
+ js_env_t *env;
40
+ js_ref_t *ctx;
41
+ } rocksdb_native_column_family_t;
27
42
 
28
43
  typedef struct {
29
44
  rocksdb_t handle;
45
+ rocksdb_options_t options;
30
46
 
31
47
  js_env_t *env;
32
48
  js_ref_t *ctx;
@@ -43,6 +59,8 @@ typedef struct {
43
59
  js_env_t *env;
44
60
  js_ref_t *ctx;
45
61
  js_ref_t *on_open;
62
+
63
+ js_ref_t *column_families;
46
64
  } rocksdb_native_open_t;
47
65
 
48
66
  typedef struct {
@@ -53,6 +71,22 @@ typedef struct {
53
71
  js_ref_t *on_close;
54
72
  } rocksdb_native_close_t;
55
73
 
74
+ typedef struct {
75
+ rocksdb_suspend_t handle;
76
+
77
+ js_env_t *env;
78
+ js_ref_t *ctx;
79
+ js_ref_t *on_suspend;
80
+ } rocksdb_native_suspend_t;
81
+
82
+ typedef struct {
83
+ rocksdb_resume_t handle;
84
+
85
+ js_env_t *env;
86
+ js_ref_t *ctx;
87
+ js_ref_t *on_resume;
88
+ } rocksdb_native_resume_t;
89
+
56
90
  typedef struct {
57
91
  rocksdb_iterator_t handle;
58
92
 
@@ -101,38 +135,37 @@ typedef struct {
101
135
  rocksdb_snapshot_t handle;
102
136
  } rocksdb_native_snapshot_t;
103
137
 
138
+ static inline uint64_t
139
+ rocksdb_native__to_uint64(rocksdb_native_uint64_t n) {
140
+ return n.high * 0x100000000 + n.low;
141
+ }
142
+
104
143
  static void
105
144
  rocksdb_native__on_free(js_env_t *env, void *data, void *finalize_hint) {
106
145
  free(data);
107
146
  }
108
147
 
109
148
  static void
110
- rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
149
+ rocksdb_native__on_column_family_teardown(void *data);
150
+
151
+ static void
152
+ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
111
153
  int err;
112
154
 
113
155
  assert(status == 0);
114
156
 
115
- rocksdb_native_close_t *req = (rocksdb_native_close_t *) handle->data;
157
+ rocksdb_native_open_t *req = (rocksdb_native_open_t *) handle->data;
116
158
 
117
159
  rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
118
160
 
119
161
  js_env_t *env = req->env;
120
162
 
121
- js_deferred_teardown_t *teardown = db->teardown;
122
-
123
163
  if (db->exiting) {
124
- if (db->closing) {
125
- err = js_delete_reference(env, req->on_close);
126
- assert(err == 0);
127
-
128
- err = js_delete_reference(env, req->ctx);
129
- assert(err == 0);
164
+ err = js_delete_reference(env, req->on_open);
165
+ assert(err == 0);
130
166
 
131
- err = js_delete_reference(env, db->ctx);
132
- assert(err == 0);
133
- } else {
134
- free(req);
135
- }
167
+ err = js_delete_reference(env, req->ctx);
168
+ assert(err == 0);
136
169
  } else {
137
170
  js_handle_scope_t *scope;
138
171
  err = js_open_handle_scope(env, &scope);
@@ -143,46 +176,96 @@ rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
143
176
  assert(err == 0);
144
177
 
145
178
  js_value_t *cb;
146
- err = js_get_reference_value(env, req->on_close, &cb);
179
+ err = js_get_reference_value(env, req->on_open, &cb);
147
180
  assert(err == 0);
148
181
 
149
- err = js_delete_reference(env, req->on_close);
182
+ js_value_t *column_families;
183
+ err = js_get_reference_value(env, req->column_families, &column_families);
150
184
  assert(err == 0);
151
185
 
152
- err = js_delete_reference(env, req->ctx);
186
+ err = js_delete_reference(env, req->on_open);
153
187
  assert(err == 0);
154
188
 
155
- err = js_delete_reference(env, db->ctx);
189
+ err = js_delete_reference(env, req->column_families);
156
190
  assert(err == 0);
157
191
 
158
- js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
192
+ err = js_delete_reference(env, req->ctx);
193
+ assert(err == 0);
194
+
195
+ js_value_t *error;
196
+
197
+ if (req->handle.error) {
198
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
199
+ assert(err == 0);
200
+ } else {
201
+ err = js_get_null(env, &error);
202
+ assert(err == 0);
203
+ }
204
+
205
+ rocksdb_column_family_t **handles = handle->handles;
206
+
207
+ if (req->handle.error == NULL) {
208
+ uint32_t len;
209
+ err = js_get_array_length(env, column_families, &len);
210
+ assert(err == 0);
211
+
212
+ for (uint32_t i = 0; i < len; i++) {
213
+ js_value_t *handle;
214
+ err = js_get_element(env, column_families, i, &handle);
215
+ assert(err == 0);
216
+
217
+ rocksdb_native_column_family_t *column_family;
218
+ err = js_get_arraybuffer_info(env, handle, (void **) &column_family, NULL);
219
+ assert(err == 0);
220
+
221
+ column_family->handle = handles[i];
222
+
223
+ err = js_reference_ref(env, column_family->ctx = db->ctx, NULL);
224
+ assert(err == 0);
225
+
226
+ err = js_add_teardown_callback(env, rocksdb_native__on_column_family_teardown, (void *) column_family);
227
+ assert(err == 0);
228
+ }
229
+ }
230
+
231
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
159
232
 
160
233
  err = js_close_handle_scope(env, scope);
161
234
  assert(err == 0);
162
235
  }
163
236
 
164
- err = js_finish_deferred_teardown_callback(teardown);
165
- assert(err == 0);
237
+ free((void *) handle->column_families);
238
+
239
+ free(handle->handles);
166
240
  }
167
241
 
168
242
  static void
169
- rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
243
+ rocksdb_native__on_close(rocksdb_close_t *handle, int status) {
170
244
  int err;
171
245
 
172
246
  assert(status == 0);
173
247
 
174
- rocksdb_native_open_t *req = (rocksdb_native_open_t *) handle->data;
248
+ rocksdb_native_close_t *req = (rocksdb_native_close_t *) handle->data;
175
249
 
176
250
  rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
177
251
 
178
252
  js_env_t *env = req->env;
179
253
 
254
+ js_deferred_teardown_t *teardown = db->teardown;
255
+
180
256
  if (db->exiting) {
181
- err = js_delete_reference(env, req->on_open);
182
- assert(err == 0);
257
+ if (db->closing) {
258
+ err = js_delete_reference(env, req->on_close);
259
+ assert(err == 0);
183
260
 
184
- err = js_delete_reference(env, req->ctx);
185
- assert(err == 0);
261
+ err = js_delete_reference(env, req->ctx);
262
+ assert(err == 0);
263
+
264
+ err = js_delete_reference(env, db->ctx);
265
+ assert(err == 0);
266
+ } else {
267
+ free(req);
268
+ }
186
269
  } else {
187
270
  js_handle_scope_t *scope;
188
271
  err = js_open_handle_scope(env, &scope);
@@ -193,30 +276,26 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
193
276
  assert(err == 0);
194
277
 
195
278
  js_value_t *cb;
196
- err = js_get_reference_value(env, req->on_open, &cb);
279
+ err = js_get_reference_value(env, req->on_close, &cb);
197
280
  assert(err == 0);
198
281
 
199
- err = js_delete_reference(env, req->on_open);
282
+ err = js_delete_reference(env, req->on_close);
200
283
  assert(err == 0);
201
284
 
202
285
  err = js_delete_reference(env, req->ctx);
203
286
  assert(err == 0);
204
287
 
205
- js_value_t *error;
206
-
207
- if (req->handle.error) {
208
- err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
209
- assert(err == 0);
210
- } else {
211
- err = js_get_null(env, &error);
212
- assert(err == 0);
213
- }
288
+ err = js_delete_reference(env, db->ctx);
289
+ assert(err == 0);
214
290
 
215
- js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
291
+ js_call_function_with_checkpoint(env, ctx, cb, 0, NULL, NULL);
216
292
 
217
293
  err = js_close_handle_scope(env, scope);
218
294
  assert(err == 0);
219
295
  }
296
+
297
+ err = js_finish_deferred_teardown_callback(teardown);
298
+ assert(err == 0);
220
299
  }
221
300
 
222
301
  static void
@@ -243,6 +322,18 @@ static js_value_t *
243
322
  rocksdb_native_init(js_env_t *env, js_callback_info_t *info) {
244
323
  int err;
245
324
 
325
+ size_t argc = 1;
326
+ js_value_t *argv[1];
327
+
328
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
329
+ assert(err == 0);
330
+
331
+ assert(argc == 1);
332
+
333
+ rocksdb_native_options_t *options;
334
+ err = js_get_typedarray_info(env, argv[0], NULL, (void **) &options, NULL, NULL, NULL);
335
+ assert(err == 0);
336
+
246
337
  uv_loop_t *loop;
247
338
  err = js_get_env_loop(env, &loop);
248
339
  assert(err == 0);
@@ -257,17 +348,21 @@ rocksdb_native_init(js_env_t *env, js_callback_info_t *info) {
257
348
  db->closing = false;
258
349
  db->exiting = false;
259
350
 
351
+ db->options = (rocksdb_options_t) {
352
+ 0,
353
+ options->read_only,
354
+ options->create_if_missing,
355
+ options->create_missing_column_families,
356
+ options->max_background_jobs,
357
+ rocksdb_native__to_uint64(options->bytes_per_sync),
358
+ };
359
+
260
360
  err = rocksdb_init(loop, &db->handle);
261
361
  assert(err == 0);
262
362
 
263
363
  return handle;
264
364
  }
265
365
 
266
- static inline uint64_t
267
- rocksdb_native__to_uint64(rocksdb_native_uint64_t n) {
268
- return n.high * 0x100000000 + n.low;
269
- }
270
-
271
366
  static js_value_t *
272
367
  rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
273
368
  int err;
@@ -281,32 +376,34 @@ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
281
376
  assert(argc == 6);
282
377
 
283
378
  rocksdb_native_t *db;
284
- err = js_get_arraybuffer_info(env, argv[1], (void **) &db, NULL);
379
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
285
380
  assert(err == 0);
286
381
 
287
382
  utf8_t path[4096 + 1 /* NULL */];
288
383
  err = js_get_value_string_utf8(env, argv[2], path, sizeof(path), NULL);
289
384
  assert(err == 0);
290
385
 
291
- rocksdb_native_open_options_t *o;
292
- err = js_get_typedarray_info(env, argv[3], NULL, (void **) &o, NULL, NULL, NULL);
386
+ uint32_t len;
387
+ err = js_get_array_length(env, argv[3], &len);
293
388
  assert(err == 0);
294
389
 
295
- rocksdb_options_t options = {
296
- 0,
297
- o->read_only,
298
- o->create_if_missing,
299
- o->max_background_jobs,
300
- rocksdb_native__to_uint64(o->bytes_per_sync),
301
- o->compation_style,
302
- o->enable_blob_files,
303
- rocksdb_native__to_uint64(o->min_blob_size),
304
- rocksdb_native__to_uint64(o->blob_file_size),
305
- o->enable_blob_garbage_collection,
306
- rocksdb_native__to_uint64(o->table_block_size),
307
- o->table_cache_index_and_filter_blocks,
308
- o->table_format_version
309
- };
390
+ rocksdb_column_family_descriptor_t *column_families = calloc(len, sizeof(rocksdb_column_family_descriptor_t));
391
+
392
+ for (uint32_t i = 0; i < len; i++) {
393
+ js_value_t *handle;
394
+ err = js_get_element(env, argv[3], i, &handle);
395
+ assert(err == 0);
396
+
397
+ rocksdb_native_column_family_t *column_family;
398
+ err = js_get_arraybuffer_info(env, handle, (void **) &column_family, NULL);
399
+ assert(err == 0);
400
+
401
+ memcpy(&column_families[i], &column_family->descriptor, sizeof(rocksdb_column_family_descriptor_t));
402
+
403
+ column_family->db = &db->handle;
404
+ }
405
+
406
+ rocksdb_column_family_t **handles = calloc(len, sizeof(rocksdb_column_family_t *));
310
407
 
311
408
  js_value_t *handle;
312
409
 
@@ -317,7 +414,7 @@ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
317
414
  req->env = env;
318
415
  req->handle.data = (void *) req;
319
416
 
320
- err = js_create_reference(env, argv[0], 1, &db->ctx);
417
+ err = js_create_reference(env, argv[1], 1, &db->ctx);
321
418
  assert(err == 0);
322
419
 
323
420
  err = js_create_reference(env, argv[4], 1, &req->ctx);
@@ -326,7 +423,10 @@ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
326
423
  err = js_create_reference(env, argv[5], 1, &req->on_open);
327
424
  assert(err == 0);
328
425
 
329
- err = rocksdb_open(&db->handle, &req->handle, (const char *) path, &options, rocksdb_native__on_open);
426
+ err = js_create_reference(env, argv[3], 1, &req->column_families);
427
+ assert(err == 0);
428
+
429
+ err = rocksdb_open(&db->handle, &req->handle, (const char *) path, &db->options, column_families, handles, len, rocksdb_native__on_open);
330
430
  assert(err == 0);
331
431
 
332
432
  err = js_add_deferred_teardown_callback(env, rocksdb_native__on_teardown, (void *) db, &db->teardown);
@@ -374,6 +474,297 @@ rocksdb_native_close(js_env_t *env, js_callback_info_t *info) {
374
474
  return handle;
375
475
  }
376
476
 
477
+ static void
478
+ rocksdb_native__on_suspend(rocksdb_suspend_t *handle, int status) {
479
+ int err;
480
+
481
+ assert(status == 0);
482
+
483
+ rocksdb_native_suspend_t *req = (rocksdb_native_suspend_t *) handle->data;
484
+
485
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
486
+
487
+ js_env_t *env = req->env;
488
+
489
+ js_deferred_teardown_t *teardown = db->teardown;
490
+
491
+ if (db->exiting) {
492
+ err = js_delete_reference(env, req->on_suspend);
493
+ assert(err == 0);
494
+
495
+ err = js_delete_reference(env, req->ctx);
496
+ assert(err == 0);
497
+ } else {
498
+ js_handle_scope_t *scope;
499
+ err = js_open_handle_scope(env, &scope);
500
+ assert(err == 0);
501
+
502
+ js_value_t *ctx;
503
+ err = js_get_reference_value(env, req->ctx, &ctx);
504
+ assert(err == 0);
505
+
506
+ js_value_t *cb;
507
+ err = js_get_reference_value(env, req->on_suspend, &cb);
508
+ assert(err == 0);
509
+
510
+ err = js_delete_reference(env, req->on_suspend);
511
+ assert(err == 0);
512
+
513
+ err = js_delete_reference(env, req->ctx);
514
+ assert(err == 0);
515
+
516
+ js_value_t *error;
517
+
518
+ if (req->handle.error) {
519
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
520
+ assert(err == 0);
521
+ } else {
522
+ err = js_get_null(env, &error);
523
+ assert(err == 0);
524
+ }
525
+
526
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
527
+
528
+ err = js_close_handle_scope(env, scope);
529
+ assert(err == 0);
530
+ }
531
+ }
532
+
533
+ static js_value_t *
534
+ rocksdb_native_suspend(js_env_t *env, js_callback_info_t *info) {
535
+ int err;
536
+
537
+ size_t argc = 3;
538
+ js_value_t *argv[3];
539
+
540
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
541
+ assert(err == 0);
542
+
543
+ assert(argc == 3);
544
+
545
+ rocksdb_native_t *db;
546
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
547
+ assert(err == 0);
548
+
549
+ js_value_t *handle;
550
+
551
+ rocksdb_native_suspend_t *req;
552
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_suspend_t), (void **) &req, &handle);
553
+ assert(err == 0);
554
+
555
+ req->env = env;
556
+ req->handle.data = (void *) req;
557
+
558
+ err = js_create_reference(env, argv[1], 1, &req->ctx);
559
+ assert(err == 0);
560
+
561
+ err = js_create_reference(env, argv[2], 1, &req->on_suspend);
562
+ assert(err == 0);
563
+
564
+ err = rocksdb_suspend(&db->handle, &req->handle, rocksdb_native__on_suspend);
565
+ assert(err == 0);
566
+
567
+ return handle;
568
+ }
569
+
570
+ static void
571
+ rocksdb_native__on_resume(rocksdb_resume_t *handle, int status) {
572
+ int err;
573
+
574
+ assert(status == 0);
575
+
576
+ rocksdb_native_resume_t *req = (rocksdb_native_resume_t *) handle->data;
577
+
578
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
579
+
580
+ js_env_t *env = req->env;
581
+
582
+ js_deferred_teardown_t *teardown = db->teardown;
583
+
584
+ if (db->exiting) {
585
+ err = js_delete_reference(env, req->on_resume);
586
+ assert(err == 0);
587
+
588
+ err = js_delete_reference(env, req->ctx);
589
+ assert(err == 0);
590
+ } else {
591
+ js_handle_scope_t *scope;
592
+ err = js_open_handle_scope(env, &scope);
593
+ assert(err == 0);
594
+
595
+ js_value_t *ctx;
596
+ err = js_get_reference_value(env, req->ctx, &ctx);
597
+ assert(err == 0);
598
+
599
+ js_value_t *cb;
600
+ err = js_get_reference_value(env, req->on_resume, &cb);
601
+ assert(err == 0);
602
+
603
+ err = js_delete_reference(env, req->on_resume);
604
+ assert(err == 0);
605
+
606
+ err = js_delete_reference(env, req->ctx);
607
+ assert(err == 0);
608
+
609
+ js_value_t *error;
610
+
611
+ if (req->handle.error) {
612
+ err = js_create_string_utf8(env, (utf8_t *) req->handle.error, -1, &error);
613
+ assert(err == 0);
614
+ } else {
615
+ err = js_get_null(env, &error);
616
+ assert(err == 0);
617
+ }
618
+
619
+ js_call_function_with_checkpoint(env, ctx, cb, 1, (js_value_t *[]) {error}, NULL);
620
+
621
+ err = js_close_handle_scope(env, scope);
622
+ assert(err == 0);
623
+ }
624
+ }
625
+
626
+ static js_value_t *
627
+ rocksdb_native_resume(js_env_t *env, js_callback_info_t *info) {
628
+ int err;
629
+
630
+ size_t argc = 3;
631
+ js_value_t *argv[3];
632
+
633
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
634
+ assert(err == 0);
635
+
636
+ assert(argc == 3);
637
+
638
+ rocksdb_native_t *db;
639
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
640
+ assert(err == 0);
641
+
642
+ js_value_t *handle;
643
+
644
+ rocksdb_native_resume_t *req;
645
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_resume_t), (void **) &req, &handle);
646
+ assert(err == 0);
647
+
648
+ req->env = env;
649
+ req->handle.data = (void *) req;
650
+
651
+ err = js_create_reference(env, argv[1], 1, &req->ctx);
652
+ assert(err == 0);
653
+
654
+ err = js_create_reference(env, argv[2], 1, &req->on_resume);
655
+ assert(err == 0);
656
+
657
+ err = rocksdb_resume(&db->handle, &req->handle, rocksdb_native__on_resume);
658
+ assert(err == 0);
659
+
660
+ return handle;
661
+ }
662
+
663
+ static void
664
+ rocksdb_native__on_column_family_teardown(void *data) {
665
+ int err;
666
+
667
+ rocksdb_native_column_family_t *column_family = (rocksdb_native_column_family_t *) data;
668
+
669
+ js_env_t *env = column_family->env;
670
+
671
+ err = rocksdb_column_family_destroy(column_family->db, column_family->handle);
672
+ assert(err == 0);
673
+
674
+ err = js_reference_unref(env, column_family->ctx, NULL);
675
+ assert(err == 0);
676
+ }
677
+
678
+ static js_value_t *
679
+ rocksdb_native_column_family_init(js_env_t *env, js_callback_info_t *info) {
680
+ int err;
681
+
682
+ size_t argc = 2;
683
+ js_value_t *argv[2];
684
+
685
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
686
+ assert(err == 0);
687
+
688
+ assert(argc == 2);
689
+
690
+ size_t name_len;
691
+ err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
692
+ assert(err == 0);
693
+
694
+ name_len += 1 /* NULL */;
695
+
696
+ utf8_t *name = malloc(name_len);
697
+ err = js_get_value_string_utf8(env, argv[0], name, name_len, NULL);
698
+ assert(err == 0);
699
+
700
+ rocksdb_native_column_family_options_t *options;
701
+ err = js_get_typedarray_info(env, argv[1], NULL, (void **) &options, NULL, NULL, NULL);
702
+ assert(err == 0);
703
+
704
+ uv_loop_t *loop;
705
+ err = js_get_env_loop(env, &loop);
706
+ assert(err == 0);
707
+
708
+ js_value_t *handle;
709
+
710
+ rocksdb_native_column_family_t *column_family;
711
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_column_family_t), (void **) &column_family, &handle);
712
+ assert(err == 0);
713
+
714
+ column_family->env = env;
715
+ column_family->db = NULL;
716
+ column_family->handle = NULL;
717
+
718
+ column_family->descriptor = (rocksdb_column_family_descriptor_t) {
719
+ (const char *) name,
720
+ {
721
+ 0,
722
+ options->compation_style,
723
+ options->enable_blob_files,
724
+ rocksdb_native__to_uint64(options->min_blob_size),
725
+ rocksdb_native__to_uint64(options->blob_file_size),
726
+ options->enable_blob_garbage_collection,
727
+ rocksdb_native__to_uint64(options->table_block_size),
728
+ options->table_cache_index_and_filter_blocks,
729
+ options->table_format_version,
730
+ }
731
+ };
732
+
733
+ return handle;
734
+ }
735
+
736
+ static js_value_t *
737
+ rocksdb_native_column_family_destroy(js_env_t *env, js_callback_info_t *info) {
738
+ int err;
739
+
740
+ size_t argc = 1;
741
+ js_value_t *argv[1];
742
+
743
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
744
+ assert(err == 0);
745
+
746
+ assert(argc == 1);
747
+
748
+ rocksdb_native_column_family_t *column_family;
749
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &column_family, NULL);
750
+ assert(err == 0);
751
+
752
+ if (column_family->handle == NULL) return NULL;
753
+
754
+ err = rocksdb_column_family_destroy(column_family->db, column_family->handle);
755
+ assert(err == 0);
756
+
757
+ err = js_remove_teardown_callback(env, rocksdb_native__on_column_family_teardown, (void *) column_family);
758
+ assert(err == 0);
759
+
760
+ err = js_reference_unref(env, column_family->ctx, NULL);
761
+ assert(err == 0);
762
+
763
+ column_family->handle = NULL;
764
+
765
+ return NULL;
766
+ }
767
+
377
768
  static js_value_t *
378
769
  rocksdb_native_iterator_init(js_env_t *env, js_callback_info_t *info) {
379
770
  int err;
@@ -556,13 +947,13 @@ static js_value_t *
556
947
  rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
557
948
  int err;
558
949
 
559
- size_t argc = 12;
560
- js_value_t *argv[12];
950
+ size_t argc = 13;
951
+ js_value_t *argv[13];
561
952
 
562
953
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
563
954
  assert(err == 0);
564
955
 
565
- assert(argc == 12);
956
+ assert(argc == 13);
566
957
 
567
958
  rocksdb_native_t *db;
568
959
  err = js_get_arraybuffer_info(env, argv[0], (void **) &db, NULL);
@@ -572,22 +963,26 @@ rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
572
963
  err = js_get_arraybuffer_info(env, argv[1], (void **) &req, NULL);
573
964
  assert(err == 0);
574
965
 
966
+ rocksdb_native_column_family_t *column_family;
967
+ err = js_get_arraybuffer_info(env, argv[2], (void **) &column_family, NULL);
968
+ assert(err == 0);
969
+
575
970
  rocksdb_range_t range;
576
971
 
577
- err = js_get_typedarray_info(env, argv[2], NULL, (void **) &range.gt.data, &range.gt.len, NULL, NULL);
972
+ err = js_get_typedarray_info(env, argv[3], NULL, (void **) &range.gt.data, &range.gt.len, NULL, NULL);
578
973
  assert(err == 0);
579
974
 
580
- err = js_get_typedarray_info(env, argv[3], NULL, (void **) &range.gte.data, &range.gte.len, NULL, NULL);
975
+ err = js_get_typedarray_info(env, argv[4], NULL, (void **) &range.gte.data, &range.gte.len, NULL, NULL);
581
976
  assert(err == 0);
582
977
 
583
- err = js_get_typedarray_info(env, argv[4], NULL, (void **) &range.lt.data, &range.lt.len, NULL, NULL);
978
+ err = js_get_typedarray_info(env, argv[5], NULL, (void **) &range.lt.data, &range.lt.len, NULL, NULL);
584
979
  assert(err == 0);
585
980
 
586
- err = js_get_typedarray_info(env, argv[5], NULL, (void **) &range.lte.data, &range.lte.len, NULL, NULL);
981
+ err = js_get_typedarray_info(env, argv[6], NULL, (void **) &range.lte.data, &range.lte.len, NULL, NULL);
587
982
  assert(err == 0);
588
983
 
589
984
  bool reverse;
590
- err = js_get_value_bool(env, argv[6], &reverse);
985
+ err = js_get_value_bool(env, argv[7], &reverse);
591
986
  assert(err == 0);
592
987
 
593
988
  rocksdb_read_options_t options = {
@@ -595,27 +990,27 @@ rocksdb_native_iterator_open(js_env_t *env, js_callback_info_t *info) {
595
990
  };
596
991
 
597
992
  bool has_snapshot;
598
- err = js_is_arraybuffer(env, argv[7], &has_snapshot);
993
+ err = js_is_arraybuffer(env, argv[8], &has_snapshot);
599
994
  assert(err == 0);
600
995
 
601
996
  if (has_snapshot) {
602
- err = js_get_arraybuffer_info(env, argv[7], (void **) &options.snapshot, NULL);
997
+ err = js_get_arraybuffer_info(env, argv[8], (void **) &options.snapshot, NULL);
603
998
  assert(err == 0);
604
999
  }
605
1000
 
606
- err = js_create_reference(env, argv[8], 1, &req->ctx);
1001
+ err = js_create_reference(env, argv[9], 1, &req->ctx);
607
1002
  assert(err == 0);
608
1003
 
609
- err = js_create_reference(env, argv[9], 1, &req->on_open);
1004
+ err = js_create_reference(env, argv[10], 1, &req->on_open);
610
1005
  assert(err == 0);
611
1006
 
612
- err = js_create_reference(env, argv[10], 1, &req->on_close);
1007
+ err = js_create_reference(env, argv[11], 1, &req->on_close);
613
1008
  assert(err == 0);
614
1009
 
615
- err = js_create_reference(env, argv[11], 1, &req->on_read);
1010
+ err = js_create_reference(env, argv[12], 1, &req->on_read);
616
1011
  assert(err == 0);
617
1012
 
618
- err = rocksdb_iterator_open(&db->handle, &req->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
1013
+ err = rocksdb_iterator_open(&db->handle, &req->handle, column_family->handle, range, reverse, &options, rocksdb_native__on_iterator_open);
619
1014
  assert(err == 0);
620
1015
 
621
1016
  err = js_add_deferred_teardown_callback(env, rocksdb_native__on_iterator_teardown, (void *) req, &req->teardown);
@@ -935,6 +1330,7 @@ rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
935
1330
  assert(err == 0);
936
1331
 
937
1332
  js_value_t *property;
1333
+
938
1334
  err = js_get_named_property(env, read, "type", &property);
939
1335
  assert(err == 0);
940
1336
 
@@ -944,6 +1340,15 @@ rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
944
1340
 
945
1341
  req->reads[i].type = type;
946
1342
 
1343
+ err = js_get_named_property(env, read, "columnFamily", &property);
1344
+ assert(err == 0);
1345
+
1346
+ rocksdb_native_column_family_t *column_family;
1347
+ err = js_get_arraybuffer_info(env, property, (void **) &column_family, NULL);
1348
+ assert(err == 0);
1349
+
1350
+ req->reads[i].column_family = column_family->handle;
1351
+
947
1352
  switch (type) {
948
1353
  case rocksdb_get: {
949
1354
  rocksdb_slice_t *key = &req->reads[i].key;
@@ -983,12 +1388,12 @@ rocksdb_native_write_init(js_env_t *env, js_callback_info_t *info) {
983
1388
 
984
1389
  js_value_t *handle;
985
1390
 
986
- rocksdb_native_write_batch_t *batch;
987
- err = js_create_arraybuffer(env, sizeof(rocksdb_native_write_batch_t), (void **) &batch, &handle);
1391
+ rocksdb_native_write_batch_t *req;
1392
+ err = js_create_arraybuffer(env, sizeof(rocksdb_native_write_batch_t), (void **) &req, &handle);
988
1393
  assert(err == 0);
989
1394
 
990
- batch->env = env;
991
- batch->handle.data = (void *) batch;
1395
+ req->env = env;
1396
+ req->handle.data = (void *) req;
992
1397
 
993
1398
  return handle;
994
1399
  }
@@ -1122,6 +1527,7 @@ rocksdb_native_write(js_env_t *env, js_callback_info_t *info) {
1122
1527
  assert(err == 0);
1123
1528
 
1124
1529
  js_value_t *property;
1530
+
1125
1531
  err = js_get_named_property(env, write, "type", &property);
1126
1532
  assert(err == 0);
1127
1533
 
@@ -1131,6 +1537,15 @@ rocksdb_native_write(js_env_t *env, js_callback_info_t *info) {
1131
1537
 
1132
1538
  req->writes[i].type = type;
1133
1539
 
1540
+ err = js_get_named_property(env, write, "columnFamily", &property);
1541
+ assert(err == 0);
1542
+
1543
+ rocksdb_native_column_family_t *column_family;
1544
+ err = js_get_arraybuffer_info(env, property, (void **) &column_family, NULL);
1545
+ assert(err == 0);
1546
+
1547
+ req->writes[i].column_family = column_family->handle;
1548
+
1134
1549
  switch (type) {
1135
1550
  case rocksdb_put: {
1136
1551
  rocksdb_slice_t *key = &req->writes[i].key;
@@ -1254,6 +1669,11 @@ rocksdb_native_exports(js_env_t *env, js_value_t *exports) {
1254
1669
  V("init", rocksdb_native_init)
1255
1670
  V("open", rocksdb_native_open)
1256
1671
  V("close", rocksdb_native_close)
1672
+ V("suspend", rocksdb_native_suspend)
1673
+ V("resume", rocksdb_native_resume)
1674
+
1675
+ V("columnFamilyInit", rocksdb_native_column_family_init)
1676
+ V("columnFamilyDestroy", rocksdb_native_column_family_destroy)
1257
1677
 
1258
1678
  V("iteratorInit", rocksdb_native_iterator_init)
1259
1679
  V("iteratorBuffer", rocksdb_native_iterator_buffer)