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.
@@ -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 rocksdb_batch_s rocksdb_batch_t;
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 (*rocksdb_batch_cb)(rocksdb_batch_t *batch, int status);
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 rocksdb_read_range_s {
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
- rocksdb_read_range_cb cb;
137
+ rocksdb_iterator_cb cb;
136
138
 
137
139
  void *data;
138
140
  };
139
141
 
140
- struct rocksdb_delete_range_s {
141
- uv_work_t worker;
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
- rocksdb_delete_range_cb cb;
146
+ struct rocksdb_read_s {
147
+ rocksdb_read_type_t type;
150
148
 
151
- void *data;
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 rocksdb_iterator_s {
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
- rocksdb_slice_t *keys;
168
- rocksdb_slice_t *values;
165
+ rocksdb_read_t *reads;
169
166
 
170
- char *error;
167
+ char **errors;
171
168
 
172
- rocksdb_iterator_cb cb;
169
+ rocksdb_read_batch_cb cb;
173
170
 
174
171
  void *data;
175
172
  };
176
173
 
177
- struct rocksdb_batch_s {
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
- const rocksdb_slice_t *keys;
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
- // A list of errors for the read batch.
192
- char **errors;
193
- };
207
+ char *error;
194
208
 
195
- rocksdb_batch_cb cb;
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
- 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);
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
- rocksdb_batch_init (rocksdb_t *db, rocksdb_batch_t *batch);
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
- rocksdb_batch_delete (rocksdb_batch_t *batch, const rocksdb_slice_t *keys, const rocksdb_slice_t *values, size_t len, rocksdb_batch_cb cb);
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<rocksdb_batch_t *>(handle->data);
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<rocksdb_batch_t *>(handle->data);
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, reinterpret_cast<const Slice *>(req->keys), values.data(), statuses.data());
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
- req->values[i] = rocksdb__slice_copy(values[i]);
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
- 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) {
640
- batch->keys = keys;
641
- batch->values = values;
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<rocksdb_batch_t *>(handle->data);
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<rocksdb_batch_t *>(handle->data);
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
- if (req->values[i].len == 0) {
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
- if (status.ok()) {
680
- req->error = nullptr;
681
- } else {
682
- req->error = strdup(status.getState());
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
- if (req->len) {
716
- WriteBatch batch;
583
+ case rocksdb_delete:
584
+ batch.Delete(db->DefaultColumnFamily(), rocksdb__slice_cast(op->key));
585
+ break;
717
586
 
718
- for (size_t i = 0, n = req->len; i < n; i++) {
719
- batch.Delete(db->DefaultColumnFamily(), reinterpret_cast<const Slice &>(req->keys[i]));
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
- rocksdb_batch_delete (rocksdb_batch_t *batch, const rocksdb_slice_t *keys, const rocksdb_slice_t *values, size_t len, rocksdb_batch_cb cb) {
734
- batch->keys = keys;
735
- batch->values = const_cast<rocksdb_slice_t *>(values);
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
- return uv_queue_work(batch->db->loop, &batch->worker, rocksdb__on_batch_delete, rocksdb__on_after_delete);
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
  }