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/CMakeLists.txt +1 -1
- package/binding.c +505 -85
- package/index.js +102 -145
- package/lib/batch.js +76 -40
- package/lib/column-family.js +56 -0
- package/lib/iterator.js +14 -13
- package/lib/snapshot.js +14 -7
- package/lib/state.js +213 -0
- package/package.json +3 -3
- package/prebuilds/android-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/android-ia32/rocksdb-native.bare +0 -0
- package/prebuilds/android-x64/rocksdb-native.bare +0 -0
- 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/ios-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/ios-arm64-simulator/rocksdb-native.bare +0 -0
- package/prebuilds/ios-x64-simulator/rocksdb-native.bare +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-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/win32-arm64/rocksdb-native.node +0 -0
- package/prebuilds/win32-x64/rocksdb-native.bare +0 -0
- package/prebuilds/win32-x64/rocksdb-native.node +0 -0
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
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
|
-
|
|
132
|
-
|
|
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->
|
|
179
|
+
err = js_get_reference_value(env, req->on_open, &cb);
|
|
147
180
|
assert(err == 0);
|
|
148
181
|
|
|
149
|
-
|
|
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->
|
|
186
|
+
err = js_delete_reference(env, req->on_open);
|
|
153
187
|
assert(err == 0);
|
|
154
188
|
|
|
155
|
-
err = js_delete_reference(env,
|
|
189
|
+
err = js_delete_reference(env, req->column_families);
|
|
156
190
|
assert(err == 0);
|
|
157
191
|
|
|
158
|
-
|
|
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
|
-
|
|
165
|
-
|
|
237
|
+
free((void *) handle->column_families);
|
|
238
|
+
|
|
239
|
+
free(handle->handles);
|
|
166
240
|
}
|
|
167
241
|
|
|
168
242
|
static void
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
182
|
-
|
|
257
|
+
if (db->closing) {
|
|
258
|
+
err = js_delete_reference(env, req->on_close);
|
|
259
|
+
assert(err == 0);
|
|
183
260
|
|
|
184
|
-
|
|
185
|
-
|
|
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->
|
|
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->
|
|
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
|
-
|
|
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,
|
|
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[
|
|
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
|
-
|
|
292
|
-
err =
|
|
386
|
+
uint32_t len;
|
|
387
|
+
err = js_get_array_length(env, argv[3], &len);
|
|
293
388
|
assert(err == 0);
|
|
294
389
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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[
|
|
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 =
|
|
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 =
|
|
560
|
-
js_value_t *argv[
|
|
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 ==
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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 *
|
|
987
|
-
err = js_create_arraybuffer(env, sizeof(rocksdb_native_write_batch_t), (void **) &
|
|
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
|
-
|
|
991
|
-
|
|
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)
|