@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 +73 -19
- package/binding.gyp +50 -79
- package/index.js +6 -0
- package/max_rev_operator.h +3 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/util.h +35 -20
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
|
-
|
|
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.
|
|
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
|
-
|
|
598
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1347
|
-
key
|
|
1348
|
-
value
|
|
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
|
-
|
|
1399
|
+
NapiSlice key;
|
|
1399
1400
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
|
|
1400
1401
|
|
|
1401
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1448
|
+
NapiSlice key;
|
|
1448
1449
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
|
|
1449
1450
|
|
|
1450
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
|
|
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
|
package/max_rev_operator.h
CHANGED
package/package.json
CHANGED
|
Binary file
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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,
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
to.
|
|
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
|
-
|
|
140
|
-
|
|
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,
|
|
201
|
+
static napi_status GetValue(napi_env env, napi_value value, NapiSlice& result) {
|
|
187
202
|
return GetString(env, value, result);
|
|
188
203
|
}
|
|
189
204
|
|