@nxtedition/rocksdb 7.0.67 → 7.1.2

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
@@ -1554,6 +1554,58 @@ NAPI_METHOD(batch_iterate) {
1554
1554
  return result;
1555
1555
  }
1556
1556
 
1557
+ NAPI_METHOD(db_get_sorted_wal_files) {
1558
+ NAPI_ARGV(3);
1559
+
1560
+ Database* database;
1561
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1562
+
1563
+ auto callback = argv[1];
1564
+
1565
+ runAsync<rocksdb::VectorLogPtr>(
1566
+ "leveldown.open", env, callback,
1567
+ [=](auto& files) {
1568
+ return database->db->GetSortedWalFiles(files);
1569
+ },
1570
+ [=](auto& files, auto env, auto& argv) {
1571
+ argv.resize(2);
1572
+
1573
+ const auto size = files.size();
1574
+ NAPI_STATUS_RETURN(napi_create_array_with_length(env, size, &argv[1]));
1575
+
1576
+ for (size_t n = 0; n < size; ++n) {
1577
+ napi_value element;
1578
+ NAPI_STATUS_RETURN(napi_create_object(env, &element));
1579
+
1580
+ napi_value pathName;
1581
+ NAPI_STATUS_RETURN(napi_create_string_utf8(env, files[n]->PathName().data(), NAPI_AUTO_LENGTH, &pathName))
1582
+ NAPI_STATUS_RETURN(napi_set_named_property(env, element, "pathName", pathName));
1583
+
1584
+ napi_value logNumber;
1585
+ NAPI_STATUS_RETURN(napi_create_int32(env, files[n]->LogNumber(), &logNumber))
1586
+ NAPI_STATUS_RETURN(napi_set_named_property(env, element, "logNumber", logNumber));
1587
+
1588
+ napi_value type;
1589
+ NAPI_STATUS_RETURN(napi_create_int32(env, files[n]->Type(), &type))
1590
+ NAPI_STATUS_RETURN(napi_set_named_property(env, element, "type", type));
1591
+
1592
+ napi_value startSequence;
1593
+ NAPI_STATUS_RETURN(napi_create_int64(env, files[n]->StartSequence(), &startSequence))
1594
+ NAPI_STATUS_RETURN(napi_set_named_property(env, element, "startSequence", startSequence));
1595
+
1596
+ napi_value sizeFileBytes;
1597
+ NAPI_STATUS_RETURN(napi_create_int64(env, files[n]->SizeFileBytes(), &sizeFileBytes))
1598
+ NAPI_STATUS_RETURN(napi_set_named_property(env, element, "sizeFileBytes", sizeFileBytes));
1599
+
1600
+ NAPI_STATUS_RETURN(napi_set_element(env, argv[1], n, element));
1601
+ }
1602
+
1603
+ return napi_ok;
1604
+ });
1605
+
1606
+ return 0;
1607
+ }
1608
+
1557
1609
  NAPI_INIT() {
1558
1610
  NAPI_EXPORT_FUNCTION(db_init);
1559
1611
  NAPI_EXPORT_FUNCTION(db_open);
@@ -1562,6 +1614,7 @@ NAPI_INIT() {
1562
1614
  NAPI_EXPORT_FUNCTION(db_clear);
1563
1615
  NAPI_EXPORT_FUNCTION(db_get_property);
1564
1616
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
1617
+ NAPI_EXPORT_FUNCTION(db_get_sorted_wal_files);
1565
1618
 
1566
1619
  NAPI_EXPORT_FUNCTION(iterator_init);
1567
1620
  NAPI_EXPORT_FUNCTION(iterator_seek);
package/index.js CHANGED
@@ -441,6 +441,12 @@ class RocksLevel extends AbstractLevel {
441
441
  this[kUnref]()
442
442
  }
443
443
  }
444
+
445
+ async getSortedWalFiles () {
446
+ return new Promise((resolve, reject) => {
447
+ binding.db_get_sorted_wal_files(this[kContext], (err, val) => err ? reject(err) : resolve(val))
448
+ })
449
+ }
444
450
  }
445
451
 
446
452
  exports.RocksLevel = RocksLevel
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "7.0.67",
3
+ "version": "7.1.2",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
package/util.h CHANGED
@@ -121,7 +121,9 @@ class NapiSlice : public rocksdb::Slice {
121
121
  NapiSlice(NapiSlice&) = delete;
122
122
  NapiSlice& operator=(NapiSlice&) = delete;
123
123
 
124
- std::string self_space_;
124
+ std::array<char, 128> stack_;
125
+ std::unique_ptr<char[]> heap_;
126
+ size_t heap_size_ = 0;
125
127
  };
126
128
 
127
129
  static napi_status GetString(napi_env env, napi_value from, NapiSlice& to) {
@@ -131,10 +133,22 @@ static napi_status GetString(napi_env env, napi_value from, NapiSlice& to) {
131
133
  if (type == napi_string) {
132
134
  size_t length = 0;
133
135
  NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, nullptr, 0, &length));
134
- to.self_space_.resize(length, '\0');
135
- NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, &to.self_space_[0], length + 1, &length));
136
136
 
137
- to.data_ = to.self_space_.data();
137
+ char* data;
138
+ if (length + 1 > to.stack_.size()) {
139
+ if (to.heap_size_ < length + 1) {
140
+ to.heap_size_ = length + 1;
141
+ to.heap_.reset(new char[to.heap_size_]);
142
+ }
143
+ data = to.heap_.get();
144
+ } else {
145
+ data = to.stack_.data();
146
+ }
147
+ data[length] = 0;
148
+
149
+ NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, data, length + 1, &length));
150
+
151
+ to.data_ = data;
138
152
  to.size_ = length;
139
153
  } else {
140
154
  bool isBuffer;