rocksdb-native 1.2.0 → 2.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/README.md +6 -6
- package/binding.c +257 -202
- package/index.js +7 -42
- package/lib/batch.js +182 -63
- package/lib/iterator.js +38 -31
- package/package.json +2 -1
- package/prebuilds/darwin-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/darwin-arm64/rocksdb-native.node +0 -0
- package/prebuilds/darwin-x64/rocksdb-native.bare +0 -0
- package/prebuilds/darwin-x64/rocksdb-native.node +0 -0
- package/prebuilds/linux-arm64/rocksdb-native.bare +0 -0
- package/prebuilds/linux-arm64/rocksdb-native.node +0 -0
- package/prebuilds/linux-x64/rocksdb-native.bare +0 -0
- package/prebuilds/linux-x64/rocksdb-native.node +0 -0
- package/prebuilds/win32-x64/rocksdb-native.bare +0 -0
- package/prebuilds/win32-x64/rocksdb-native.node +0 -0
- package/vendor/librocksdb/include/rocksdb.h +57 -58
- package/vendor/librocksdb/src/rocksdb.cc +57 -184
|
@@ -14,18 +14,18 @@ typedef struct rocksdb_open_s rocksdb_open_t;
|
|
|
14
14
|
typedef struct rocksdb_close_s rocksdb_close_t;
|
|
15
15
|
typedef struct rocksdb_slice_s rocksdb_slice_t;
|
|
16
16
|
typedef struct rocksdb_range_s rocksdb_range_t;
|
|
17
|
-
typedef struct rocksdb_read_range_s rocksdb_read_range_t;
|
|
18
|
-
typedef struct rocksdb_delete_range_s rocksdb_delete_range_t;
|
|
19
17
|
typedef struct rocksdb_iterator_s rocksdb_iterator_t;
|
|
20
|
-
typedef struct
|
|
18
|
+
typedef struct rocksdb_read_s rocksdb_read_t;
|
|
19
|
+
typedef struct rocksdb_read_batch_s rocksdb_read_batch_t;
|
|
20
|
+
typedef struct rocksdb_write_s rocksdb_write_t;
|
|
21
|
+
typedef struct rocksdb_write_batch_s rocksdb_write_batch_t;
|
|
21
22
|
typedef struct rocksdb_s rocksdb_t;
|
|
22
23
|
|
|
23
24
|
typedef void (*rocksdb_open_cb)(rocksdb_open_t *req, int status);
|
|
24
25
|
typedef void (*rocksdb_close_cb)(rocksdb_close_t *req, int status);
|
|
25
|
-
typedef void (*rocksdb_read_range_cb)(rocksdb_read_range_t *req, int status);
|
|
26
|
-
typedef void (*rocksdb_delete_range_cb)(rocksdb_delete_range_t *req, int status);
|
|
27
26
|
typedef void (*rocksdb_iterator_cb)(rocksdb_iterator_t *iterator, int status);
|
|
28
|
-
typedef void (*
|
|
27
|
+
typedef void (*rocksdb_read_batch_cb)(rocksdb_read_batch_t *batch, int status);
|
|
28
|
+
typedef void (*rocksdb_write_batch_cb)(rocksdb_write_batch_t *batch, int status);
|
|
29
29
|
|
|
30
30
|
typedef enum {
|
|
31
31
|
rocksdb_compaction_style_level = 0,
|
|
@@ -116,11 +116,13 @@ struct rocksdb_range_s {
|
|
|
116
116
|
rocksdb_slice_t lte;
|
|
117
117
|
};
|
|
118
118
|
|
|
119
|
-
struct
|
|
119
|
+
struct rocksdb_iterator_s {
|
|
120
120
|
uv_work_t worker;
|
|
121
121
|
|
|
122
122
|
rocksdb_t *db;
|
|
123
123
|
|
|
124
|
+
void *handle; // Opaque iterator pointer
|
|
125
|
+
|
|
124
126
|
rocksdb_range_t range;
|
|
125
127
|
bool reverse;
|
|
126
128
|
|
|
@@ -132,67 +134,79 @@ struct rocksdb_read_range_s {
|
|
|
132
134
|
|
|
133
135
|
char *error;
|
|
134
136
|
|
|
135
|
-
|
|
137
|
+
rocksdb_iterator_cb cb;
|
|
136
138
|
|
|
137
139
|
void *data;
|
|
138
140
|
};
|
|
139
141
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
rocksdb_t *db;
|
|
144
|
-
|
|
145
|
-
rocksdb_range_t range;
|
|
146
|
-
|
|
147
|
-
char *error;
|
|
142
|
+
typedef enum {
|
|
143
|
+
rocksdb_get = 1,
|
|
144
|
+
} rocksdb_read_type_t;
|
|
148
145
|
|
|
149
|
-
|
|
146
|
+
struct rocksdb_read_s {
|
|
147
|
+
rocksdb_read_type_t type;
|
|
150
148
|
|
|
151
|
-
|
|
149
|
+
union {
|
|
150
|
+
// For get
|
|
151
|
+
struct {
|
|
152
|
+
rocksdb_slice_t key;
|
|
153
|
+
rocksdb_slice_t value;
|
|
154
|
+
};
|
|
155
|
+
};
|
|
152
156
|
};
|
|
153
157
|
|
|
154
|
-
struct
|
|
158
|
+
struct rocksdb_read_batch_s {
|
|
155
159
|
uv_work_t worker;
|
|
156
160
|
|
|
157
161
|
rocksdb_t *db;
|
|
158
162
|
|
|
159
|
-
void *handle; // Opaque iterator pointer
|
|
160
|
-
|
|
161
|
-
rocksdb_range_t range;
|
|
162
|
-
bool reverse;
|
|
163
|
-
|
|
164
163
|
size_t len;
|
|
165
|
-
size_t capacity;
|
|
166
164
|
|
|
167
|
-
|
|
168
|
-
rocksdb_slice_t *values;
|
|
165
|
+
rocksdb_read_t *reads;
|
|
169
166
|
|
|
170
|
-
char
|
|
167
|
+
char **errors;
|
|
171
168
|
|
|
172
|
-
|
|
169
|
+
rocksdb_read_batch_cb cb;
|
|
173
170
|
|
|
174
171
|
void *data;
|
|
175
172
|
};
|
|
176
173
|
|
|
177
|
-
|
|
174
|
+
typedef enum {
|
|
175
|
+
rocksdb_put = 1,
|
|
176
|
+
rocksdb_delete,
|
|
177
|
+
rocksdb_delete_range,
|
|
178
|
+
} rocksdb_write_type_t;
|
|
179
|
+
|
|
180
|
+
struct rocksdb_write_s {
|
|
181
|
+
rocksdb_write_type_t type;
|
|
182
|
+
|
|
183
|
+
union {
|
|
184
|
+
// For put, delete
|
|
185
|
+
struct {
|
|
186
|
+
rocksdb_slice_t key;
|
|
187
|
+
rocksdb_slice_t value;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// For delete_range
|
|
191
|
+
struct {
|
|
192
|
+
rocksdb_slice_t start;
|
|
193
|
+
rocksdb_slice_t end;
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
struct rocksdb_write_batch_s {
|
|
178
199
|
uv_work_t worker;
|
|
179
200
|
|
|
180
201
|
rocksdb_t *db;
|
|
181
202
|
|
|
182
203
|
size_t len;
|
|
183
204
|
|
|
184
|
-
|
|
185
|
-
rocksdb_slice_t *values;
|
|
186
|
-
|
|
187
|
-
union {
|
|
188
|
-
// A single error for the write or delete batch.
|
|
189
|
-
char *error;
|
|
205
|
+
rocksdb_write_t *writes;
|
|
190
206
|
|
|
191
|
-
|
|
192
|
-
char **errors;
|
|
193
|
-
};
|
|
207
|
+
char *error;
|
|
194
208
|
|
|
195
|
-
|
|
209
|
+
rocksdb_write_batch_cb cb;
|
|
196
210
|
|
|
197
211
|
void *data;
|
|
198
212
|
};
|
|
@@ -222,16 +236,7 @@ rocksdb_slice_t
|
|
|
222
236
|
rocksdb_slice_empty (void);
|
|
223
237
|
|
|
224
238
|
int
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
int
|
|
228
|
-
rocksdb_delete_range (rocksdb_t *db, rocksdb_delete_range_t *req, rocksdb_range_t range, rocksdb_delete_range_cb cb);
|
|
229
|
-
|
|
230
|
-
int
|
|
231
|
-
rocksdb_iterator_init (rocksdb_t *db, rocksdb_iterator_t *iterator);
|
|
232
|
-
|
|
233
|
-
int
|
|
234
|
-
rocksdb_iterator_open (rocksdb_iterator_t *iterator, rocksdb_range_t range, bool reverse, rocksdb_iterator_cb cb);
|
|
239
|
+
rocksdb_iterator_open (rocksdb_t *db, rocksdb_iterator_t *iterator, rocksdb_range_t range, bool reverse, rocksdb_iterator_cb cb);
|
|
235
240
|
|
|
236
241
|
int
|
|
237
242
|
rocksdb_iterator_close (rocksdb_iterator_t *iterator, rocksdb_iterator_cb cb);
|
|
@@ -243,16 +248,10 @@ int
|
|
|
243
248
|
rocksdb_iterator_read (rocksdb_iterator_t *iterator, rocksdb_slice_t *keys, rocksdb_slice_t *values, size_t capacity, rocksdb_iterator_cb cb);
|
|
244
249
|
|
|
245
250
|
int
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
int
|
|
249
|
-
rocksdb_batch_read (rocksdb_batch_t *batch, const rocksdb_slice_t *keys, rocksdb_slice_t *values, char **errors, size_t len, rocksdb_batch_cb cb);
|
|
250
|
-
|
|
251
|
-
int
|
|
252
|
-
rocksdb_batch_write (rocksdb_batch_t *batch, const rocksdb_slice_t *keys, const rocksdb_slice_t *values, size_t len, rocksdb_batch_cb cb);
|
|
251
|
+
rocksdb_read (rocksdb_t *db, rocksdb_read_batch_t *batch, rocksdb_read_t *reads, char **errors, size_t len, rocksdb_read_batch_cb cb);
|
|
253
252
|
|
|
254
253
|
int
|
|
255
|
-
|
|
254
|
+
rocksdb_write (rocksdb_t *db, rocksdb_write_batch_t *batch, rocksdb_write_t *writes, size_t len, rocksdb_write_batch_cb cb);
|
|
256
255
|
|
|
257
256
|
#ifdef __cplusplus
|
|
258
257
|
}
|
|
@@ -366,119 +366,6 @@ rocksdb__iterator_refresh (Iterator *iterator, T *req) {
|
|
|
366
366
|
rocksdb__iterator_seek(iterator, req);
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
static void
|
|
370
|
-
rocksdb__on_after_read_range (uv_work_t *handle, int status) {
|
|
371
|
-
auto req = reinterpret_cast<rocksdb_read_range_t *>(handle->data);
|
|
372
|
-
|
|
373
|
-
auto error = req->error;
|
|
374
|
-
|
|
375
|
-
req->cb(req, status);
|
|
376
|
-
|
|
377
|
-
if (error) free(error);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
static void
|
|
381
|
-
rocksdb__on_read_range (uv_work_t *handle) {
|
|
382
|
-
auto req = reinterpret_cast<rocksdb_read_range_t *>(handle->data);
|
|
383
|
-
|
|
384
|
-
auto iterator = rocksdb__iterator_open(req);
|
|
385
|
-
|
|
386
|
-
rocksdb__iterator_read(iterator, req);
|
|
387
|
-
|
|
388
|
-
auto status = iterator->status();
|
|
389
|
-
|
|
390
|
-
if (status.ok()) {
|
|
391
|
-
req->error = nullptr;
|
|
392
|
-
} else {
|
|
393
|
-
req->error = strdup(status.getState());
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
delete iterator;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
extern "C" int
|
|
400
|
-
rocksdb_read_range (rocksdb_t *db, rocksdb_read_range_t *req, rocksdb_range_t range, bool reverse, rocksdb_slice_t *keys, rocksdb_slice_t *values, size_t capacity, rocksdb_read_range_cb cb) {
|
|
401
|
-
req->db = db;
|
|
402
|
-
req->range = range;
|
|
403
|
-
req->reverse = reverse;
|
|
404
|
-
req->keys = keys;
|
|
405
|
-
req->values = values;
|
|
406
|
-
req->len = 0;
|
|
407
|
-
req->capacity = capacity;
|
|
408
|
-
req->cb = cb;
|
|
409
|
-
|
|
410
|
-
req->worker.data = static_cast<void *>(req);
|
|
411
|
-
|
|
412
|
-
return uv_queue_work(db->loop, &req->worker, rocksdb__on_read_range, rocksdb__on_after_read_range);
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
static void
|
|
416
|
-
rocksdb__on_after_delete_range (uv_work_t *handle, int status) {
|
|
417
|
-
auto req = reinterpret_cast<rocksdb_delete_range_t *>(handle->data);
|
|
418
|
-
|
|
419
|
-
auto error = req->error;
|
|
420
|
-
|
|
421
|
-
req->cb(req, status);
|
|
422
|
-
|
|
423
|
-
if (error) free(error);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
static void
|
|
427
|
-
rocksdb__on_delete_range (uv_work_t *handle) {
|
|
428
|
-
auto req = reinterpret_cast<rocksdb_delete_range_t *>(handle->data);
|
|
429
|
-
|
|
430
|
-
auto db = reinterpret_cast<DB *>(req->db->handle);
|
|
431
|
-
|
|
432
|
-
const auto &range = req->range;
|
|
433
|
-
|
|
434
|
-
if (range.gte.len && range.lt.len) {
|
|
435
|
-
auto status = db->DeleteRange(WriteOptions(), rocksdb__slice_cast(range.gte), rocksdb__slice_cast(range.lt));
|
|
436
|
-
|
|
437
|
-
if (status.ok()) {
|
|
438
|
-
req->error = nullptr;
|
|
439
|
-
} else {
|
|
440
|
-
req->error = strdup(status.getState());
|
|
441
|
-
}
|
|
442
|
-
} else {
|
|
443
|
-
auto iterator = rocksdb__iterator_open(db, req->range);
|
|
444
|
-
|
|
445
|
-
req->error = nullptr;
|
|
446
|
-
|
|
447
|
-
while (rocksdb__iterator_valid(iterator, req->range)) {
|
|
448
|
-
auto status = db->Delete(WriteOptions(), iterator->key());
|
|
449
|
-
|
|
450
|
-
if (status.ok()) {
|
|
451
|
-
rocksdb__iterator_next(iterator);
|
|
452
|
-
} else {
|
|
453
|
-
req->error = strdup(status.getState());
|
|
454
|
-
break;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
delete iterator;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
extern "C" int
|
|
463
|
-
rocksdb_delete_range (rocksdb_t *db, rocksdb_delete_range_t *req, rocksdb_range_t range, rocksdb_delete_range_cb cb) {
|
|
464
|
-
req->db = db;
|
|
465
|
-
req->range = range;
|
|
466
|
-
req->cb = cb;
|
|
467
|
-
|
|
468
|
-
req->worker.data = static_cast<void *>(req);
|
|
469
|
-
|
|
470
|
-
return uv_queue_work(db->loop, &req->worker, rocksdb__on_delete_range, rocksdb__on_after_delete_range);
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
extern "C" int
|
|
474
|
-
rocksdb_iterator_init (rocksdb_t *db, rocksdb_iterator_t *iterator) {
|
|
475
|
-
iterator->db = db;
|
|
476
|
-
|
|
477
|
-
iterator->worker.data = static_cast<void *>(iterator);
|
|
478
|
-
|
|
479
|
-
return 0;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
369
|
static void
|
|
483
370
|
rocksdb__on_after_iterator (uv_work_t *handle, int status) {
|
|
484
371
|
auto req = reinterpret_cast<rocksdb_iterator_t *>(handle->data);
|
|
@@ -508,11 +395,14 @@ rocksdb__on_iterator_open (uv_work_t *handle) {
|
|
|
508
395
|
}
|
|
509
396
|
|
|
510
397
|
extern "C" int
|
|
511
|
-
rocksdb_iterator_open (rocksdb_iterator_t *iterator, rocksdb_range_t range, bool reverse, rocksdb_iterator_cb cb) {
|
|
398
|
+
rocksdb_iterator_open (rocksdb_t *db, rocksdb_iterator_t *iterator, rocksdb_range_t range, bool reverse, rocksdb_iterator_cb cb) {
|
|
399
|
+
iterator->db = db;
|
|
512
400
|
iterator->range = range;
|
|
513
401
|
iterator->reverse = reverse;
|
|
514
402
|
iterator->cb = cb;
|
|
515
403
|
|
|
404
|
+
iterator->worker.data = static_cast<void *>(iterator);
|
|
405
|
+
|
|
516
406
|
return uv_queue_work(iterator->db->loop, &iterator->worker, rocksdb__on_iterator_open, rocksdb__on_after_iterator);
|
|
517
407
|
}
|
|
518
408
|
|
|
@@ -586,18 +476,9 @@ rocksdb_iterator_read (rocksdb_iterator_t *iterator, rocksdb_slice_t *keys, rock
|
|
|
586
476
|
return uv_queue_work(iterator->db->loop, &iterator->worker, rocksdb__on_iterator_read, rocksdb__on_after_iterator);
|
|
587
477
|
}
|
|
588
478
|
|
|
589
|
-
extern "C" int
|
|
590
|
-
rocksdb_batch_init (rocksdb_t *db, rocksdb_batch_t *batch) {
|
|
591
|
-
batch->db = db;
|
|
592
|
-
|
|
593
|
-
batch->worker.data = static_cast<void *>(batch);
|
|
594
|
-
|
|
595
|
-
return 0;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
479
|
static void
|
|
599
480
|
rocksdb__on_after_read (uv_work_t *handle, int status) {
|
|
600
|
-
auto req = reinterpret_cast<
|
|
481
|
+
auto req = reinterpret_cast<rocksdb_read_batch_t *>(handle->data);
|
|
601
482
|
|
|
602
483
|
req->cb(req, status);
|
|
603
484
|
|
|
@@ -608,47 +489,72 @@ rocksdb__on_after_read (uv_work_t *handle, int status) {
|
|
|
608
489
|
|
|
609
490
|
static void
|
|
610
491
|
rocksdb__on_batch_read (uv_work_t *handle) {
|
|
611
|
-
auto req = reinterpret_cast<
|
|
492
|
+
auto req = reinterpret_cast<rocksdb_read_batch_t *>(handle->data);
|
|
612
493
|
|
|
613
494
|
auto db = reinterpret_cast<DB *>(req->db->handle);
|
|
614
495
|
|
|
615
496
|
if (req->len) {
|
|
497
|
+
std::vector<Slice> keys(req->len);
|
|
498
|
+
|
|
499
|
+
for (size_t i = 0, n = req->len; i < n; i++) {
|
|
500
|
+
auto op = &req->reads[i];
|
|
501
|
+
|
|
502
|
+
switch (op->type) {
|
|
503
|
+
case rocksdb_get:
|
|
504
|
+
keys[i] = rocksdb__slice_cast(op->key);
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
616
509
|
std::vector<PinnableSlice> values(req->len);
|
|
617
510
|
|
|
618
511
|
std::vector<Status> statuses(req->len);
|
|
619
512
|
|
|
620
|
-
db->MultiGet(ReadOptions(), db->DefaultColumnFamily(), req->len,
|
|
513
|
+
db->MultiGet(ReadOptions(), db->DefaultColumnFamily(), req->len, keys.data(), values.data(), statuses.data());
|
|
621
514
|
|
|
622
515
|
for (size_t i = 0, n = req->len; i < n; i++) {
|
|
516
|
+
auto op = &req->reads[i];
|
|
517
|
+
|
|
623
518
|
auto status = statuses[i];
|
|
624
519
|
|
|
520
|
+
auto value = rocksdb_slice_empty();
|
|
521
|
+
|
|
625
522
|
if (status.ok()) {
|
|
626
|
-
|
|
523
|
+
value = rocksdb__slice_copy(values[i]);
|
|
524
|
+
|
|
627
525
|
req->errors[i] = nullptr;
|
|
628
526
|
} else if (status.code() == Status::kNotFound) {
|
|
629
|
-
req->values[i] = {.data = nullptr, .len = 0};
|
|
630
527
|
req->errors[i] = nullptr;
|
|
631
528
|
} else {
|
|
632
529
|
req->errors[i] = strdup(status.getState());
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
switch (op->type) {
|
|
534
|
+
case rocksdb_get:
|
|
535
|
+
op->value = value;
|
|
536
|
+
break;
|
|
633
537
|
}
|
|
634
538
|
}
|
|
635
539
|
}
|
|
636
540
|
}
|
|
637
541
|
|
|
638
542
|
extern "C" int
|
|
639
|
-
|
|
640
|
-
batch->
|
|
641
|
-
batch->
|
|
543
|
+
rocksdb_read (rocksdb_t *db, rocksdb_read_batch_t *batch, rocksdb_read_t *reads, char **errors, size_t len, rocksdb_read_batch_cb cb) {
|
|
544
|
+
batch->db = db;
|
|
545
|
+
batch->reads = reads;
|
|
642
546
|
batch->errors = errors;
|
|
643
547
|
batch->len = len;
|
|
644
548
|
batch->cb = cb;
|
|
645
549
|
|
|
550
|
+
batch->worker.data = static_cast<void *>(batch);
|
|
551
|
+
|
|
646
552
|
return uv_queue_work(batch->db->loop, &batch->worker, rocksdb__on_batch_read, rocksdb__on_after_read);
|
|
647
553
|
}
|
|
648
554
|
|
|
649
555
|
static void
|
|
650
556
|
rocksdb__on_after_write (uv_work_t *handle, int status) {
|
|
651
|
-
auto req = reinterpret_cast<
|
|
557
|
+
auto req = reinterpret_cast<rocksdb_write_batch_t *>(handle->data);
|
|
652
558
|
|
|
653
559
|
auto error = req->error;
|
|
654
560
|
|
|
@@ -659,7 +565,7 @@ rocksdb__on_after_write (uv_work_t *handle, int status) {
|
|
|
659
565
|
|
|
660
566
|
static void
|
|
661
567
|
rocksdb__on_batch_write (uv_work_t *handle) {
|
|
662
|
-
auto req = reinterpret_cast<
|
|
568
|
+
auto req = reinterpret_cast<rocksdb_write_batch_t *>(handle->data);
|
|
663
569
|
|
|
664
570
|
auto db = reinterpret_cast<DB *>(req->db->handle);
|
|
665
571
|
|
|
@@ -667,56 +573,21 @@ rocksdb__on_batch_write (uv_work_t *handle) {
|
|
|
667
573
|
WriteBatch batch;
|
|
668
574
|
|
|
669
575
|
for (size_t i = 0, n = req->len; i < n; i++) {
|
|
670
|
-
|
|
671
|
-
batch.Delete(db->DefaultColumnFamily(), reinterpret_cast<const Slice &>(req->keys[i]));
|
|
672
|
-
} else {
|
|
673
|
-
batch.Put(db->DefaultColumnFamily(), reinterpret_cast<const Slice &>(req->keys[i]), reinterpret_cast<const Slice &>(req->values[i]));
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
auto status = db->Write(WriteOptions(), &batch);
|
|
576
|
+
auto op = &req->writes[i];
|
|
678
577
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
extern "C" int
|
|
688
|
-
rocksdb_batch_write (rocksdb_batch_t *batch, const rocksdb_slice_t *keys, const rocksdb_slice_t *values, size_t len, rocksdb_batch_cb cb) {
|
|
689
|
-
batch->keys = keys;
|
|
690
|
-
batch->values = const_cast<rocksdb_slice_t *>(values);
|
|
691
|
-
batch->error = nullptr;
|
|
692
|
-
batch->len = len;
|
|
693
|
-
batch->cb = cb;
|
|
694
|
-
|
|
695
|
-
return uv_queue_work(batch->db->loop, &batch->worker, rocksdb__on_batch_write, rocksdb__on_after_write);
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
static void
|
|
699
|
-
rocksdb__on_after_delete (uv_work_t *handle, int status) {
|
|
700
|
-
auto req = reinterpret_cast<rocksdb_batch_t *>(handle->data);
|
|
701
|
-
|
|
702
|
-
auto error = req->error;
|
|
703
|
-
|
|
704
|
-
req->cb(req, status);
|
|
705
|
-
|
|
706
|
-
if (error) free(error);
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
static void
|
|
710
|
-
rocksdb__on_batch_delete (uv_work_t *handle) {
|
|
711
|
-
auto req = reinterpret_cast<rocksdb_batch_t *>(handle->data);
|
|
712
|
-
|
|
713
|
-
auto db = reinterpret_cast<DB *>(req->db->handle);
|
|
578
|
+
switch (op->type) {
|
|
579
|
+
case rocksdb_put:
|
|
580
|
+
batch.Put(db->DefaultColumnFamily(), rocksdb__slice_cast(op->key), rocksdb__slice_cast(op->value));
|
|
581
|
+
break;
|
|
714
582
|
|
|
715
|
-
|
|
716
|
-
|
|
583
|
+
case rocksdb_delete:
|
|
584
|
+
batch.Delete(db->DefaultColumnFamily(), rocksdb__slice_cast(op->key));
|
|
585
|
+
break;
|
|
717
586
|
|
|
718
|
-
|
|
719
|
-
|
|
587
|
+
case rocksdb_delete_range:
|
|
588
|
+
batch.DeleteRange(db->DefaultColumnFamily(), rocksdb__slice_cast(op->start), rocksdb__slice_cast(op->end));
|
|
589
|
+
break;
|
|
590
|
+
}
|
|
720
591
|
}
|
|
721
592
|
|
|
722
593
|
auto status = db->Write(WriteOptions(), &batch);
|
|
@@ -730,12 +601,14 @@ rocksdb__on_batch_delete (uv_work_t *handle) {
|
|
|
730
601
|
}
|
|
731
602
|
|
|
732
603
|
extern "C" int
|
|
733
|
-
|
|
734
|
-
batch->
|
|
735
|
-
batch->
|
|
604
|
+
rocksdb_write (rocksdb_t *db, rocksdb_write_batch_t *batch, rocksdb_write_t *writes, size_t len, rocksdb_write_batch_cb cb) {
|
|
605
|
+
batch->db = db;
|
|
606
|
+
batch->writes = writes;
|
|
736
607
|
batch->error = nullptr;
|
|
737
608
|
batch->len = len;
|
|
738
609
|
batch->cb = cb;
|
|
739
610
|
|
|
740
|
-
|
|
611
|
+
batch->worker.data = static_cast<void *>(batch);
|
|
612
|
+
|
|
613
|
+
return uv_queue_work(batch->db->loop, &batch->worker, rocksdb__on_batch_write, rocksdb__on_after_write);
|
|
741
614
|
}
|