@nxtedition/rocksdb 8.0.5 → 8.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/binding.cc CHANGED
@@ -636,6 +636,70 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
636
636
  return napi_ok;
637
637
  }
638
638
 
639
+ NAPI_METHOD(db_get_merge_operands) {
640
+ NAPI_ARGV(4);
641
+
642
+ Database* database;
643
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
644
+
645
+ std::string key;
646
+ NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
647
+
648
+ const auto options = argv[2];
649
+
650
+ Encoding valueEncoding = Encoding::String;
651
+ NAPI_STATUS_THROWS(GetProperty(env, options, "valueEncoding", valueEncoding));
652
+
653
+ rocksdb::ColumnFamilyHandle* column = database->db->DefaultColumnFamily();
654
+ NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
655
+
656
+ auto callback = argv[3];
657
+
658
+ runAsync<std::vector<rocksdb::PinnableSlice>>(
659
+ "leveldown.get.mergeOperands", env, callback,
660
+ [=, key = std::move(key)](auto& values) {
661
+ rocksdb::ReadOptions readOptions;
662
+
663
+ values.resize(16); // TODO (fix): Make option
664
+
665
+ rocksdb::GetMergeOperandsOptions mergeOperandsOptions;
666
+ mergeOperandsOptions.expected_max_number_of_operands = values.size();
667
+
668
+ int size = 0;
669
+ const auto status = database->db->GetMergeOperands(
670
+ readOptions,
671
+ column,
672
+ key,
673
+ values.data(),
674
+ &mergeOperandsOptions,
675
+ &size
676
+ );
677
+
678
+ values.resize(size);
679
+
680
+ return status;
681
+ },
682
+ [=](auto& values, auto env, auto& argv) {
683
+ argv.resize(2);
684
+
685
+ NAPI_STATUS_RETURN(napi_create_array_with_length(env, values.size(), &argv[1]));
686
+
687
+ for (size_t idx = 0; idx < values.size(); idx++) {
688
+ napi_value element;
689
+ if (values[idx].GetSelf()) {
690
+ NAPI_STATUS_RETURN(Convert(env, &values[idx], valueEncoding, element));
691
+ } else {
692
+ NAPI_STATUS_RETURN(napi_get_undefined(env, &element));
693
+ }
694
+ NAPI_STATUS_RETURN(napi_set_element(env, argv[1], static_cast<uint32_t>(idx), element));
695
+ }
696
+
697
+ return napi_ok;
698
+ });
699
+
700
+ return 0;
701
+ }
702
+
639
703
  NAPI_METHOD(db_get_identity) {
640
704
  NAPI_ARGV(1);
641
705
 
@@ -1581,6 +1645,7 @@ NAPI_INIT() {
1581
1645
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
1582
1646
  NAPI_EXPORT_FUNCTION(db_get_sorted_wal_files);
1583
1647
  NAPI_EXPORT_FUNCTION(db_flush_wal);
1648
+ NAPI_EXPORT_FUNCTION(db_get_merge_operands);
1584
1649
 
1585
1650
  NAPI_EXPORT_FUNCTION(iterator_init);
1586
1651
  NAPI_EXPORT_FUNCTION(iterator_seek);
package/index.js CHANGED
@@ -168,6 +168,23 @@ class RocksLevel extends AbstractLevel {
168
168
  return callback[kPromise]
169
169
  }
170
170
 
171
+ _getMergeOperands(key, options, callback) {
172
+ callback = fromCallback(callback, kPromise)
173
+
174
+ try {
175
+ this[kRef]()
176
+ binding.db_get_merge_operands(this[kContext], key, options ?? EMPTY, (err, val) => {
177
+ callback(err, val)
178
+ this[kUnref]()
179
+ })
180
+ } catch (err) {
181
+ process.nextTick(callback, err)
182
+ this[kUnref]()
183
+ }
184
+
185
+ return callback[kPromise]
186
+ }
187
+
171
188
  _del (key, options, callback) {
172
189
  callback = fromCallback(callback, kPromise)
173
190
 
@@ -1,13 +1,14 @@
1
1
  #pragma once
2
2
 
3
+ #include <cstddef>
3
4
  #include <rocksdb/slice.h>
4
5
  #include <rocksdb/merge_operator.h>
5
6
 
6
7
  int compareRev(const rocksdb::Slice& a, const rocksdb::Slice& b) {
7
- auto indexA = 0UL;
8
- auto indexB = 0UL;
9
- const auto endA = a.size();
10
- const auto endB = b.size();
8
+ std::size_t indexA = 0;
9
+ std::size_t indexB = 0;
10
+ const std::size_t endA = a[indexA++];
11
+ const std::size_t endB = b[indexB++];
11
12
 
12
13
  // Compare the revision number
13
14
  auto result = 0;
@@ -97,4 +98,4 @@ class MaxRevOperator : public rocksdb::MergeOperator {
97
98
  static const char* kNickName() { return "maxRev"; }
98
99
  const char* Name() const override { return kClassName(); }
99
100
  const char* NickName() const override { return kNickName(); }
100
- };
101
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "8.0.5",
3
+ "version": "8.1.1",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",