@nxtedition/rocksdb 8.0.5 → 8.1.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.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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "8.0.5",
3
+ "version": "8.1.0",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",