@nxtedition/rocksdb 7.0.64 → 7.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
@@ -18,6 +18,7 @@
18
18
  #include <rocksdb/table.h>
19
19
  #include <rocksdb/write_batch.h>
20
20
 
21
+ #include <iostream>
21
22
  #include <memory>
22
23
  #include <optional>
23
24
  #include <set>
@@ -519,7 +520,7 @@ template <typename T, typename U>
519
520
  napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
520
521
  rocksdb::ConfigOptions configOptions;
521
522
 
522
- size_t memtable_memory_budget = 256 * 1024 * 1024;
523
+ uint64_t memtable_memory_budget = 256 * 1024 * 1024;
523
524
  NAPI_STATUS_RETURN(GetProperty(env, options, "memtableMemoryBudget", memtable_memory_budget));
524
525
 
525
526
  std::optional<std::string> compactionOpt;
@@ -555,7 +556,7 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
555
556
 
556
557
  // only compress levels >= 2
557
558
  columnOptions.compression_per_level.resize(columnOptions.num_levels);
558
- for (int i = 0; i < columnOptions.compression_per_level.size(); ++i) {
559
+ for (int i = 0; i < columnOptions.num_levels; ++i) {
559
560
  if (i < 2) {
560
561
  columnOptions.compression_per_level[i] = rocksdb::kNoCompression;
561
562
  } else {
@@ -594,8 +595,12 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
594
595
  std::optional<std::string> mergeOperatorOpt;
595
596
  NAPI_STATUS_RETURN(GetProperty(env, options, "mergeOperator", mergeOperatorOpt));
596
597
  if (mergeOperatorOpt) {
597
- ROCKS_STATUS_RETURN_NAPI(
598
- rocksdb::MergeOperator::CreateFromString(configOptions, *mergeOperatorOpt, &columnOptions.merge_operator));
598
+ if (*mergeOperatorOpt == "maxRev") {
599
+ columnOptions.merge_operator = std::make_shared<MaxRevOperator>();
600
+ } else {
601
+ ROCKS_STATUS_RETURN_NAPI(
602
+ rocksdb::MergeOperator::CreateFromString(configOptions, *mergeOperatorOpt, &columnOptions.merge_operator));
603
+ }
599
604
  }
600
605
 
601
606
  uint32_t cacheSize = 8 << 20;
@@ -1107,7 +1112,7 @@ NAPI_METHOD(db_get_property) {
1107
1112
  Database* database;
1108
1113
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1109
1114
 
1110
- rocksdb::PinnableSlice property;
1115
+ NapiSlice property;
1111
1116
  NAPI_STATUS_THROWS(GetValue(env, argv[1], property));
1112
1117
 
1113
1118
  std::string value;
@@ -1203,7 +1208,7 @@ NAPI_METHOD(iterator_seek) {
1203
1208
  Iterator* iterator;
1204
1209
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&iterator)));
1205
1210
 
1206
- rocksdb::PinnableSlice target;
1211
+ NapiSlice target;
1207
1212
  NAPI_STATUS_THROWS(GetValue(env, argv[1], target));
1208
1213
 
1209
1214
  iterator->first_ = true;
@@ -1338,14 +1343,10 @@ NAPI_METHOD(batch_do) {
1338
1343
  uint32_t length;
1339
1344
  NAPI_STATUS_THROWS(napi_get_array_length(env, elements, &length));
1340
1345
 
1341
- rocksdb::PinnableSlice type;
1342
- rocksdb::PinnableSlice key;
1343
- rocksdb::PinnableSlice value;
1344
-
1345
1346
  for (uint32_t i = 0; i < length; i++) {
1346
- type.Reset();
1347
- key.Reset();
1348
- value.Reset();
1347
+ NapiSlice type;
1348
+ NapiSlice key;
1349
+ NapiSlice value;
1349
1350
 
1350
1351
  napi_value element;
1351
1352
  NAPI_STATUS_THROWS(napi_get_element(env, elements, i, &element));
@@ -1395,10 +1396,10 @@ NAPI_METHOD(batch_put) {
1395
1396
  rocksdb::WriteBatch* batch;
1396
1397
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1397
1398
 
1398
- rocksdb::PinnableSlice key;
1399
+ NapiSlice key;
1399
1400
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1400
1401
 
1401
- rocksdb::PinnableSlice val;
1402
+ NapiSlice val;
1402
1403
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1403
1404
 
1404
1405
  const auto options = argv[3];
@@ -1421,7 +1422,7 @@ NAPI_METHOD(batch_del) {
1421
1422
  rocksdb::WriteBatch* batch;
1422
1423
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1423
1424
 
1424
- rocksdb::PinnableSlice key;
1425
+ NapiSlice key;
1425
1426
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1426
1427
 
1427
1428
  const auto options = argv[2];
@@ -1444,10 +1445,10 @@ NAPI_METHOD(batch_merge) {
1444
1445
  rocksdb::WriteBatch* batch;
1445
1446
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)(&batch)));
1446
1447
 
1447
- rocksdb::PinnableSlice key;
1448
+ NapiSlice key;
1448
1449
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1449
1450
 
1450
- rocksdb::PinnableSlice val;
1451
+ NapiSlice val;
1451
1452
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1452
1453
 
1453
1454
  const auto options = argv[3];
@@ -1496,7 +1497,7 @@ NAPI_METHOD(batch_put_log_data) {
1496
1497
  rocksdb::WriteBatch* batch;
1497
1498
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1498
1499
 
1499
- rocksdb::PinnableSlice logData;
1500
+ NapiSlice logData;
1500
1501
  NAPI_STATUS_THROWS(GetValue(env, argv[1], logData));
1501
1502
 
1502
1503
  ROCKS_STATUS_THROWS_NAPI(batch->PutLogData(logData));
@@ -1553,6 +1554,58 @@ NAPI_METHOD(batch_iterate) {
1553
1554
  return result;
1554
1555
  }
1555
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
+
1556
1609
  NAPI_INIT() {
1557
1610
  NAPI_EXPORT_FUNCTION(db_init);
1558
1611
  NAPI_EXPORT_FUNCTION(db_open);
@@ -1561,6 +1614,7 @@ NAPI_INIT() {
1561
1614
  NAPI_EXPORT_FUNCTION(db_clear);
1562
1615
  NAPI_EXPORT_FUNCTION(db_get_property);
1563
1616
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
1617
+ NAPI_EXPORT_FUNCTION(db_get_sorted_wal_files);
1564
1618
 
1565
1619
  NAPI_EXPORT_FUNCTION(iterator_init);
1566
1620
  NAPI_EXPORT_FUNCTION(iterator_seek);
package/binding.gyp CHANGED
@@ -1,83 +1,54 @@
1
1
  {
2
- "variables": { "openssl_fips": "0" },
3
- "targets": [
4
- {
5
- "target_name": "leveldown",
6
- "conditions": [
7
- [
8
- "OS == 'win'",
9
- {
10
- "defines": ["_HAS_EXCEPTIONS=1", "OS_WIN=1"],
11
- "msvs_settings": {
12
- "VCCLCompilerTool": {
13
- "RuntimeTypeInfo": "false",
14
- "EnableFunctionLevelLinking": "true",
15
- "ExceptionHandling": "2",
16
- "DisableSpecificWarnings": [
17
- "4355",
18
- "4530",
19
- "4267",
20
- "4244",
21
- "4506"
2
+ "variables": {"openssl_fips": "0"},
3
+ "targets": [
4
+ {
5
+ "target_name": "leveldown",
6
+ "conditions": [
7
+ [
8
+ "OS == 'linux'",
9
+ {
10
+ "cflags": [
11
+ "-msse4.2",
12
+ "-mpclmul",
13
+ "-mavx",
14
+ "-mavx2",
15
+ "-mbmi",
16
+ "-mlzcnt"
17
+ ],
18
+ "ccflags": ["-flto"],
19
+ "cflags!": ["-fno-exceptions"],
20
+ "cflags_cc!": ["-fno-exceptions"],
21
+ "ldflags": ["-flto", "-fuse-linker-plugin"]
22
+ }
23
+ ],
24
+ [
25
+ "OS == 'mac'",
26
+ {
27
+ "xcode_settings": {
28
+ "WARNING_CFLAGS": [
29
+ "-Wno-sign-compare",
30
+ "-Wno-unused-variable",
31
+ "-Wno-unused-function",
32
+ "-Wno-ignored-qualifiers"
33
+ ],
34
+ "OTHER_CPLUSPLUSFLAGS": [
35
+ "-mmacosx-version-min=12.2.1",
36
+ "-std=c++20",
37
+ "-fno-omit-frame-pointer",
38
+ "-momit-leaf-frame-pointer",
39
+ "-arch x86_64",
40
+ "-arch arm64"
41
+ ],
42
+ "GCC_ENABLE_CPP_RTTI": "YES",
43
+ "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
44
+ "MACOSX_DEPLOYMENT_TARGET": "12.2.1"
45
+ }
46
+ }
22
47
  ]
23
- },
24
- "VCLinkerTool": {
25
- "AdditionalDependencies": ["Shlwapi.lib", "rpcrt4.lib"]
26
- }
27
- }
28
- },
29
- {
30
- "cflags": ["-std=c++20"],
31
- "cflags!": ["-fno-rtti"],
32
- "cflags_cc!": ["-fno-rtti"],
33
- "cflags_cc+": ["-frtti"]
34
- }
35
- ],
36
- [
37
- "OS == 'linux'",
38
- {
39
- "cflags": [
40
- "-msse4.2",
41
- "-mpclmul",
42
- "-mavx",
43
- "-mavx2",
44
- "-mbmi",
45
- "-mlzcnt"
46
48
  ],
47
- "ccflags": ["-flto"],
48
- "cflags!": ["-fno-exceptions"],
49
- "cflags_cc!": ["-fno-exceptions"],
50
- "ldflags": ["-flto", "-fuse-linker-plugin"]
51
- }
52
- ],
53
- [
54
- "OS == 'mac'",
55
- {
56
- "xcode_settings": {
57
- "WARNING_CFLAGS": [
58
- "-Wno-sign-compare",
59
- "-Wno-unused-variable",
60
- "-Wno-unused-function",
61
- "-Wno-ignored-qualifiers"
62
- ],
63
- "OTHER_CPLUSPLUSFLAGS": [
64
- "-mmacosx-version-min=12.2.1",
65
- "-std=c++20",
66
- "-fno-omit-frame-pointer",
67
- "-momit-leaf-frame-pointer",
68
- "-arch x86_64",
69
- "-arch arm64"
70
- ],
71
- "GCC_ENABLE_CPP_RTTI": "YES",
72
- "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
73
- "MACOSX_DEPLOYMENT_TARGET": "12.2.1"
74
- }
75
- }
76
- ]
77
- ],
78
- "dependencies": ["<(module_root_dir)/deps/rocksdb/rocksdb.gyp:rocksdb"],
79
- "include_dirs": ["<!(node -e \"require('napi-macros')\")"],
80
- "sources": ["binding.cc"]
81
- }
82
- ]
49
+ "dependencies": ["<(module_root_dir)/deps/rocksdb/rocksdb.gyp:rocksdb"],
50
+ "include_dirs": ["<!(node -e \"require('napi-macros')\")"],
51
+ "sources": ["binding.cc"]
52
+ }
53
+ ]
83
54
  }
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
@@ -1,5 +1,8 @@
1
1
  #pragma once
2
2
 
3
+ #include <rocksdb/slice.h>
4
+ #include <rocksdb/merge_operator.h>
5
+
3
6
  int compareRev(const rocksdb::Slice& a, const rocksdb::Slice& b) {
4
7
  auto indexA = 0UL;
5
8
  auto indexB = 0UL;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "7.0.64",
3
+ "version": "7.1.0",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
Binary file
package/util.h CHANGED
@@ -111,22 +111,45 @@ static napi_status GetString(napi_env env, napi_value from, std::string& to) {
111
111
  return napi_ok;
112
112
  }
113
113
 
114
- void DestroyReference(void* arg1, void* arg2) {
115
- auto env = reinterpret_cast<napi_env>(arg1);
116
- auto ref = reinterpret_cast<napi_ref>(arg2);
117
- napi_delete_reference(env, ref);
118
- }
114
+ class NapiSlice : public rocksdb::Slice {
115
+ public:
116
+ NapiSlice() {}
117
+
118
+ NapiSlice(NapiSlice&& other) = delete;
119
+ NapiSlice& operator=(NapiSlice&& other) = delete;
120
+
121
+ NapiSlice(NapiSlice&) = delete;
122
+ NapiSlice& operator=(NapiSlice&) = delete;
123
+
124
+ std::array<char, 128> stack_;
125
+ std::unique_ptr<char[]> heap_;
126
+ size_t heap_size_ = 0;
127
+ };
119
128
 
120
- static napi_status GetString(napi_env env, napi_value from, rocksdb::PinnableSlice& to) {
129
+ static napi_status GetString(napi_env env, napi_value from, NapiSlice& to) {
121
130
  napi_valuetype type;
122
131
  NAPI_STATUS_RETURN(napi_typeof(env, from, &type));
123
132
 
124
133
  if (type == napi_string) {
125
134
  size_t length = 0;
126
135
  NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, nullptr, 0, &length));
127
- to.GetSelf()->resize(length, '\0');
128
- NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, &(*to.GetSelf())[0], length + 1, &length));
129
- to.PinSelf();
136
+
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;
152
+ to.size_ = length;
130
153
  } else {
131
154
  bool isBuffer;
132
155
  NAPI_STATUS_RETURN(napi_is_buffer(env, from, &isBuffer));
@@ -136,9 +159,8 @@ static napi_status GetString(napi_env env, napi_value from, rocksdb::PinnableSli
136
159
  size_t length = 0;
137
160
  NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length));
138
161
 
139
- napi_ref ref;
140
- NAPI_STATUS_RETURN(napi_create_reference(env, from, 1, &ref));
141
- to.PinSlice(rocksdb::Slice(buf, length), DestroyReference, env, ref);
162
+ to.data_ = buf;
163
+ to.size_ = length;
142
164
  } else {
143
165
  return napi_invalid_arg;
144
166
  }
@@ -172,18 +194,11 @@ static napi_status GetValue(napi_env env, napi_value value, uint64_t& result) {
172
194
  return napi_ok;
173
195
  }
174
196
 
175
- static napi_status GetValue(napi_env env, napi_value value, unsigned long& result) {
176
- int64_t result2;
177
- NAPI_STATUS_RETURN(napi_get_value_int64(env, value, &result2));
178
- result = static_cast<unsigned long>(result2);
179
- return napi_ok;
180
- }
181
-
182
197
  static napi_status GetValue(napi_env env, napi_value value, std::string& result) {
183
198
  return GetString(env, value, result);
184
199
  }
185
200
 
186
- static napi_status GetValue(napi_env env, napi_value value, rocksdb::PinnableSlice& result) {
201
+ static napi_status GetValue(napi_env env, napi_value value, NapiSlice& result) {
187
202
  return GetString(env, value, result);
188
203
  }
189
204