@nxtedition/rocksdb 10.0.15 → 10.0.16
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 +59 -80
- package/chained-batch.js +8 -10
- package/index.js +5 -3
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/util.h +38 -66
package/binding.cc
CHANGED
|
@@ -512,17 +512,17 @@ NAPI_METHOD(db_init) {
|
|
|
512
512
|
NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, argv[0], &location[0], length + 1, &length));
|
|
513
513
|
|
|
514
514
|
database = new Database(location);
|
|
515
|
-
|
|
516
|
-
|
|
515
|
+
napi_add_env_cleanup_hook(env, env_cleanup_hook, database);
|
|
516
|
+
NAPI_STATUS_THROWS(napi_create_external(env, database, FinalizeDatabase, nullptr, &result));
|
|
517
517
|
} else if (type == napi_bigint) {
|
|
518
518
|
int64_t value;
|
|
519
519
|
bool lossless;
|
|
520
520
|
NAPI_STATUS_THROWS(napi_get_value_bigint_int64(env, argv[0], &value, &lossless));
|
|
521
521
|
|
|
522
522
|
database = reinterpret_cast<Database*>(value);
|
|
523
|
-
|
|
523
|
+
NAPI_STATUS_THROWS(napi_create_external(env, database, nullptr, nullptr, &result));
|
|
524
524
|
|
|
525
|
-
|
|
525
|
+
// We should have an env_cleanup_hook for closing iterators...
|
|
526
526
|
} else {
|
|
527
527
|
NAPI_STATUS_THROWS(napi_invalid_arg);
|
|
528
528
|
}
|
|
@@ -966,6 +966,7 @@ NAPI_METHOD(db_get_many) {
|
|
|
966
966
|
Database* database;
|
|
967
967
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
|
|
968
968
|
|
|
969
|
+
// TODO (fix): Ensure lifetime of buffer?
|
|
969
970
|
std::vector<rocksdb::Slice> keys;
|
|
970
971
|
{
|
|
971
972
|
uint32_t length;
|
|
@@ -975,12 +976,7 @@ NAPI_METHOD(db_get_many) {
|
|
|
975
976
|
for (uint32_t n = 0; n < length; n++) {
|
|
976
977
|
napi_value element;
|
|
977
978
|
NAPI_STATUS_THROWS(napi_get_element(env, argv[1], n, &element));
|
|
978
|
-
|
|
979
|
-
char* buf = nullptr;
|
|
980
|
-
size_t length = 0;
|
|
981
|
-
NAPI_STATUS_THROWS(napi_get_buffer_info(env, element, reinterpret_cast<void**>(&buf), &length));
|
|
982
|
-
|
|
983
|
-
keys[n] = { buf, length };
|
|
979
|
+
NAPI_STATUS_THROWS(GetValue(env, element, keys[n]));
|
|
984
980
|
}
|
|
985
981
|
}
|
|
986
982
|
|
|
@@ -1037,8 +1033,8 @@ NAPI_METHOD(db_get_many) {
|
|
|
1037
1033
|
for (size_t idx = 0; idx < values.size(); idx++) {
|
|
1038
1034
|
napi_value element;
|
|
1039
1035
|
if (values[idx].GetSelf()) {
|
|
1040
|
-
|
|
1041
|
-
|
|
1036
|
+
auto ptr = new rocksdb::PinnableSlice(std::move(values[idx]));
|
|
1037
|
+
NAPI_STATUS_RETURN(napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()), Finalize<rocksdb::PinnableSlice>, ptr, &element));
|
|
1042
1038
|
} else {
|
|
1043
1039
|
NAPI_STATUS_RETURN(napi_get_undefined(env, &element));
|
|
1044
1040
|
}
|
|
@@ -1160,7 +1156,7 @@ NAPI_METHOD(db_get_property) {
|
|
|
1160
1156
|
Database* database;
|
|
1161
1157
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
|
|
1162
1158
|
|
|
1163
|
-
|
|
1159
|
+
rocksdb::PinnableSlice property;
|
|
1164
1160
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], property));
|
|
1165
1161
|
|
|
1166
1162
|
std::string value;
|
|
@@ -1259,7 +1255,7 @@ NAPI_METHOD(iterator_seek) {
|
|
|
1259
1255
|
Iterator* iterator;
|
|
1260
1256
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&iterator)));
|
|
1261
1257
|
|
|
1262
|
-
|
|
1258
|
+
rocksdb::PinnableSlice target;
|
|
1263
1259
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], target));
|
|
1264
1260
|
|
|
1265
1261
|
iterator->first_ = true;
|
|
@@ -1306,7 +1302,7 @@ NAPI_METHOD(iterator_nextv) {
|
|
|
1306
1302
|
auto callback = argv[2];
|
|
1307
1303
|
|
|
1308
1304
|
struct State {
|
|
1309
|
-
std::vector<
|
|
1305
|
+
std::vector<rocksdb::PinnableSlice> cache;
|
|
1310
1306
|
bool finished = false;
|
|
1311
1307
|
};
|
|
1312
1308
|
|
|
@@ -1329,24 +1325,22 @@ NAPI_METHOD(iterator_nextv) {
|
|
|
1329
1325
|
if (!iterator->Valid() || !iterator->Increment())
|
|
1330
1326
|
break;
|
|
1331
1327
|
|
|
1328
|
+
auto k = rocksdb::PinnableSlice();
|
|
1329
|
+
auto v = rocksdb::PinnableSlice();
|
|
1330
|
+
|
|
1332
1331
|
if (iterator->keys_ && iterator->values_) {
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
bytesRead += k.size() + v.size();
|
|
1336
|
-
state.cache.push_back(k.ToString());
|
|
1337
|
-
state.cache.push_back(v.ToString());
|
|
1332
|
+
k.PinSelf(iterator->CurrentKey());
|
|
1333
|
+
v.PinSelf(iterator->CurrentValue());
|
|
1338
1334
|
} else if (iterator->keys_) {
|
|
1339
|
-
|
|
1340
|
-
bytesRead += k.size();
|
|
1341
|
-
state.cache.push_back(k.ToString());
|
|
1342
|
-
state.cache.push_back(std::nullopt);
|
|
1335
|
+
k.PinSelf(iterator->CurrentKey());
|
|
1343
1336
|
} else if (iterator->values_) {
|
|
1344
|
-
|
|
1345
|
-
bytesRead += v.size();
|
|
1346
|
-
state.cache.push_back(std::nullopt);
|
|
1347
|
-
state.cache.push_back(v.ToString());
|
|
1337
|
+
v.PinSelf(iterator->CurrentValue());
|
|
1348
1338
|
}
|
|
1349
1339
|
|
|
1340
|
+
bytesRead += k.size() + v.size();
|
|
1341
|
+
state.cache.push_back(std::move(k));
|
|
1342
|
+
state.cache.push_back(std::move(v));
|
|
1343
|
+
|
|
1350
1344
|
if (bytesRead > iterator->highWaterMarkBytes_ || state.cache.size() / 2 >= size) {
|
|
1351
1345
|
state.finished = false;
|
|
1352
1346
|
return rocksdb::Status::OK();
|
|
@@ -1366,8 +1360,8 @@ NAPI_METHOD(iterator_nextv) {
|
|
|
1366
1360
|
napi_value key;
|
|
1367
1361
|
napi_value val;
|
|
1368
1362
|
|
|
1369
|
-
NAPI_STATUS_RETURN(Convert(env, state.cache[n + 0], iterator->keyEncoding_, key));
|
|
1370
|
-
NAPI_STATUS_RETURN(Convert(env, state.cache[n + 1], iterator->valueEncoding_, val));
|
|
1363
|
+
NAPI_STATUS_RETURN(Convert(env, &state.cache[n + 0], iterator->keyEncoding_, key));
|
|
1364
|
+
NAPI_STATUS_RETURN(Convert(env, &state.cache[n + 1], iterator->valueEncoding_, val));
|
|
1371
1365
|
|
|
1372
1366
|
NAPI_STATUS_RETURN(napi_set_element(env, argv[1], static_cast<int>(n + 0), key));
|
|
1373
1367
|
NAPI_STATUS_RETURN(napi_set_element(env, argv[1], static_cast<int>(n + 1), val));
|
|
@@ -1400,9 +1394,9 @@ NAPI_METHOD(batch_do) {
|
|
|
1400
1394
|
NAPI_STATUS_THROWS(napi_get_array_length(env, elements, &length));
|
|
1401
1395
|
|
|
1402
1396
|
for (uint32_t i = 0; i < length; i++) {
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1397
|
+
rocksdb::PinnableSlice type;
|
|
1398
|
+
rocksdb::PinnableSlice key;
|
|
1399
|
+
rocksdb::PinnableSlice value;
|
|
1406
1400
|
|
|
1407
1401
|
napi_value element;
|
|
1408
1402
|
NAPI_STATUS_THROWS(napi_get_element(env, elements, i, &element));
|
|
@@ -1466,10 +1460,10 @@ NAPI_METHOD(batch_put) {
|
|
|
1466
1460
|
rocksdb::WriteBatch* batch;
|
|
1467
1461
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
|
|
1468
1462
|
|
|
1469
|
-
|
|
1463
|
+
rocksdb::Slice key;
|
|
1470
1464
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
|
|
1471
1465
|
|
|
1472
|
-
|
|
1466
|
+
rocksdb::Slice val;
|
|
1473
1467
|
NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
|
|
1474
1468
|
|
|
1475
1469
|
const auto options = argv[3];
|
|
@@ -1492,7 +1486,7 @@ NAPI_METHOD(batch_del) {
|
|
|
1492
1486
|
rocksdb::WriteBatch* batch;
|
|
1493
1487
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
|
|
1494
1488
|
|
|
1495
|
-
|
|
1489
|
+
rocksdb::Slice key;
|
|
1496
1490
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
|
|
1497
1491
|
|
|
1498
1492
|
const auto options = argv[2];
|
|
@@ -1515,10 +1509,10 @@ NAPI_METHOD(batch_merge) {
|
|
|
1515
1509
|
rocksdb::WriteBatch* batch;
|
|
1516
1510
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
|
|
1517
1511
|
|
|
1518
|
-
|
|
1512
|
+
rocksdb::Slice key;
|
|
1519
1513
|
NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
|
|
1520
1514
|
|
|
1521
|
-
|
|
1515
|
+
rocksdb::Slice val;
|
|
1522
1516
|
NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
|
|
1523
1517
|
|
|
1524
1518
|
const auto options = argv[3];
|
|
@@ -1549,7 +1543,7 @@ NAPI_METHOD(batch_clear) {
|
|
|
1549
1543
|
NAPI_METHOD(batch_write) {
|
|
1550
1544
|
NAPI_ARGV(4);
|
|
1551
1545
|
|
|
1552
|
-
|
|
1546
|
+
napi_value result = 0;
|
|
1553
1547
|
|
|
1554
1548
|
Database* database;
|
|
1555
1549
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
|
|
@@ -1566,51 +1560,37 @@ NAPI_METHOD(batch_write) {
|
|
|
1566
1560
|
bool lowPriority = false;
|
|
1567
1561
|
NAPI_STATUS_THROWS(GetProperty(env, options, "lowPriority", lowPriority));
|
|
1568
1562
|
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
const auto status = database->db->Write(writeOptions, batch);
|
|
1575
|
-
|
|
1576
|
-
if (status == rocksdb::Status::Incomplete()) {
|
|
1577
|
-
napi_ref batchRef;
|
|
1578
|
-
NAPI_STATUS_THROWS(napi_create_reference(env, argv[1], 1, &batchRef));
|
|
1579
|
-
|
|
1580
|
-
runAsync<int64_t>(
|
|
1581
|
-
"leveldown.batch.write", env, callback,
|
|
1582
|
-
[=](int64_t& seq) {
|
|
1583
|
-
rocksdb::WriteOptions writeOptions;
|
|
1584
|
-
writeOptions.sync = sync;
|
|
1585
|
-
writeOptions.low_pri = lowPriority;
|
|
1586
|
-
return database->db->Write(writeOptions, batch);
|
|
1587
|
-
},
|
|
1588
|
-
[=](int64_t& seq, auto env, auto& argv) {
|
|
1589
|
-
NAPI_STATUS_RETURN(napi_delete_reference(env, batchRef));
|
|
1590
|
-
return napi_ok;
|
|
1591
|
-
});
|
|
1592
|
-
|
|
1593
|
-
NAPI_STATUS_THROWS(napi_get_boolean(env, false, &result));
|
|
1594
|
-
} else {
|
|
1595
|
-
ROCKS_STATUS_THROWS_NAPI(status);
|
|
1596
|
-
NAPI_STATUS_THROWS(napi_get_boolean(env, true, &result));
|
|
1597
|
-
}
|
|
1563
|
+
rocksdb::WriteOptions writeOptions;
|
|
1564
|
+
writeOptions.sync = sync;
|
|
1565
|
+
writeOptions.low_pri = lowPriority;
|
|
1566
|
+
writeOptions.no_slowdown = true;
|
|
1598
1567
|
|
|
1599
|
-
|
|
1600
|
-
}
|
|
1568
|
+
const auto status = database->db->Write(writeOptions, batch);
|
|
1601
1569
|
|
|
1602
|
-
|
|
1603
|
-
|
|
1570
|
+
if (status == rocksdb::Status::Incomplete()) {
|
|
1571
|
+
napi_ref batchRef;
|
|
1572
|
+
NAPI_STATUS_THROWS(napi_create_reference(env, argv[1], 1, &batchRef));
|
|
1604
1573
|
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1574
|
+
runAsync<int64_t>(
|
|
1575
|
+
"leveldown.batch.write", env, callback,
|
|
1576
|
+
[=](int64_t& seq) {
|
|
1577
|
+
rocksdb::WriteOptions writeOptions;
|
|
1578
|
+
writeOptions.sync = sync;
|
|
1579
|
+
writeOptions.low_pri = lowPriority;
|
|
1580
|
+
return database->db->Write(writeOptions, batch);
|
|
1581
|
+
},
|
|
1582
|
+
[=](int64_t& seq, auto env, auto& argv) {
|
|
1583
|
+
NAPI_STATUS_RETURN(napi_delete_reference(env, batchRef));
|
|
1584
|
+
return napi_ok;
|
|
1585
|
+
});
|
|
1610
1586
|
|
|
1611
|
-
|
|
1587
|
+
NAPI_STATUS_THROWS(napi_get_boolean(env, false, &result));
|
|
1588
|
+
} else {
|
|
1589
|
+
ROCKS_STATUS_THROWS_NAPI(status);
|
|
1590
|
+
NAPI_STATUS_THROWS(napi_get_boolean(env, true, &result));
|
|
1591
|
+
}
|
|
1612
1592
|
|
|
1613
|
-
return
|
|
1593
|
+
return result;
|
|
1614
1594
|
}
|
|
1615
1595
|
|
|
1616
1596
|
NAPI_METHOD(batch_count) {
|
|
@@ -1687,7 +1667,6 @@ NAPI_INIT() {
|
|
|
1687
1667
|
NAPI_EXPORT_FUNCTION(batch_del);
|
|
1688
1668
|
NAPI_EXPORT_FUNCTION(batch_clear);
|
|
1689
1669
|
NAPI_EXPORT_FUNCTION(batch_write);
|
|
1690
|
-
NAPI_EXPORT_FUNCTION(batch_put_log_data);
|
|
1691
1670
|
NAPI_EXPORT_FUNCTION(batch_merge);
|
|
1692
1671
|
NAPI_EXPORT_FUNCTION(batch_count);
|
|
1693
1672
|
NAPI_EXPORT_FUNCTION(batch_iterate);
|
package/chained-batch.js
CHANGED
|
@@ -34,6 +34,9 @@ class ChainedBatch extends AbstractChainedBatch {
|
|
|
34
34
|
})
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
key = typeof key === 'string' ? Buffer.from(key) : key
|
|
38
|
+
value = typeof value === 'string' ? Buffer.from(value) : value
|
|
39
|
+
|
|
37
40
|
binding.batch_put(this[kBatchContext], key, value, options ?? EMPTY)
|
|
38
41
|
}
|
|
39
42
|
|
|
@@ -44,6 +47,8 @@ class ChainedBatch extends AbstractChainedBatch {
|
|
|
44
47
|
})
|
|
45
48
|
}
|
|
46
49
|
|
|
50
|
+
key = typeof key === 'string' ? Buffer.from(key) : key
|
|
51
|
+
|
|
47
52
|
binding.batch_del(this[kBatchContext], key, options ?? EMPTY)
|
|
48
53
|
}
|
|
49
54
|
|
|
@@ -67,16 +72,6 @@ class ChainedBatch extends AbstractChainedBatch {
|
|
|
67
72
|
return binding.batch_count(this[kBatchContext])
|
|
68
73
|
}
|
|
69
74
|
|
|
70
|
-
_putLogData (value, options) {
|
|
71
|
-
if (value === null || value === undefined) {
|
|
72
|
-
throw new ModuleError('value cannot be null or undefined', {
|
|
73
|
-
code: 'LEVEL_INVALID_VALUE'
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
binding.batch_put_log_data(this[kBatchContext], value, options ?? EMPTY)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
75
|
_merge (key, value, options) {
|
|
81
76
|
if (key === null || key === undefined) {
|
|
82
77
|
throw new ModuleError('Key cannot be null or undefined', {
|
|
@@ -90,6 +85,9 @@ class ChainedBatch extends AbstractChainedBatch {
|
|
|
90
85
|
})
|
|
91
86
|
}
|
|
92
87
|
|
|
88
|
+
key = typeof key === 'string' ? Buffer.from(key) : key
|
|
89
|
+
value = typeof value === 'string' ? Buffer.from(value) : value
|
|
90
|
+
|
|
93
91
|
binding.batch_merge(this[kBatchContext], key, value, options ?? EMPTY)
|
|
94
92
|
}
|
|
95
93
|
|
package/index.js
CHANGED
|
@@ -148,15 +148,17 @@ class RocksLevel extends AbstractLevel {
|
|
|
148
148
|
_getMany (keys, options, callback) {
|
|
149
149
|
callback = fromCallback(callback, kPromise)
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
const { keysEncoding, valueEncoding } = options ?? EMPTY
|
|
152
|
+
|
|
153
|
+
if (keysEncoding !== 'buffer') {
|
|
152
154
|
keys = keys.map(key => Buffer.from(key))
|
|
153
155
|
}
|
|
154
156
|
|
|
155
157
|
try {
|
|
156
158
|
this[kRef]()
|
|
157
159
|
binding.db_get_many(this[kContext], keys, options ?? EMPTY, (err, val) => {
|
|
158
|
-
if (
|
|
159
|
-
val = val.map(v => v != null ? v.toString(
|
|
160
|
+
if (valueEncoding !== 'buffer') {
|
|
161
|
+
val = val.map(v => v != null ? v.toString(valueEncoding) : v)
|
|
160
162
|
}
|
|
161
163
|
callback(err, val, keys)
|
|
162
164
|
this[kUnref]()
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
package/util.h
CHANGED
|
@@ -91,6 +91,22 @@ static napi_value ToError(napi_env env, const rocksdb::Status& status) {
|
|
|
91
91
|
return CreateError(env, {}, msg);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
static napi_status GetString(napi_env env, napi_value from, rocksdb::Slice& to) {
|
|
95
|
+
bool isBuffer;
|
|
96
|
+
NAPI_STATUS_RETURN(napi_is_buffer(env, from, &isBuffer));
|
|
97
|
+
|
|
98
|
+
if (isBuffer) {
|
|
99
|
+
char* buf = nullptr;
|
|
100
|
+
size_t length = 0;
|
|
101
|
+
NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length));
|
|
102
|
+
to = {buf, length};
|
|
103
|
+
} else {
|
|
104
|
+
return napi_invalid_arg;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return napi_ok;
|
|
108
|
+
}
|
|
109
|
+
|
|
94
110
|
static napi_status GetString(napi_env env, napi_value from, std::string& to) {
|
|
95
111
|
napi_valuetype type;
|
|
96
112
|
NAPI_STATUS_RETURN(napi_typeof(env, from, &type));
|
|
@@ -117,60 +133,12 @@ static napi_status GetString(napi_env env, napi_value from, std::string& to) {
|
|
|
117
133
|
return napi_ok;
|
|
118
134
|
}
|
|
119
135
|
|
|
120
|
-
|
|
121
|
-
public:
|
|
122
|
-
NapiSlice() {}
|
|
123
|
-
|
|
124
|
-
NapiSlice(NapiSlice&& other) = delete;
|
|
125
|
-
NapiSlice& operator=(NapiSlice&& other) = delete;
|
|
126
|
-
|
|
127
|
-
NapiSlice(NapiSlice&) = delete;
|
|
128
|
-
NapiSlice& operator=(NapiSlice&) = delete;
|
|
129
|
-
|
|
130
|
-
std::array<char, 128> stack_;
|
|
131
|
-
std::unique_ptr<char[]> heap_;
|
|
132
|
-
size_t heap_size_ = 0;
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
static napi_status GetString(napi_env env, napi_value from, NapiSlice& to) {
|
|
136
|
+
static napi_status GetString(napi_env env, napi_value from, rocksdb::PinnableSlice& to) {
|
|
136
137
|
napi_valuetype type;
|
|
137
138
|
NAPI_STATUS_RETURN(napi_typeof(env, from, &type));
|
|
138
139
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, nullptr, 0, &length));
|
|
142
|
-
|
|
143
|
-
char* data;
|
|
144
|
-
if (length + 1 > to.stack_.size()) {
|
|
145
|
-
if (to.heap_size_ < length + 1) {
|
|
146
|
-
to.heap_size_ = length + 1;
|
|
147
|
-
to.heap_.reset(new char[to.heap_size_]);
|
|
148
|
-
}
|
|
149
|
-
data = to.heap_.get();
|
|
150
|
-
} else {
|
|
151
|
-
data = to.stack_.data();
|
|
152
|
-
}
|
|
153
|
-
data[length] = 0;
|
|
154
|
-
|
|
155
|
-
NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, data, length + 1, &length));
|
|
156
|
-
|
|
157
|
-
to.data_ = data;
|
|
158
|
-
to.size_ = length;
|
|
159
|
-
} else {
|
|
160
|
-
bool isBuffer;
|
|
161
|
-
NAPI_STATUS_RETURN(napi_is_buffer(env, from, &isBuffer));
|
|
162
|
-
|
|
163
|
-
if (isBuffer) {
|
|
164
|
-
char* buf = nullptr;
|
|
165
|
-
size_t length = 0;
|
|
166
|
-
NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length));
|
|
167
|
-
|
|
168
|
-
to.data_ = buf;
|
|
169
|
-
to.size_ = length;
|
|
170
|
-
} else {
|
|
171
|
-
return napi_invalid_arg;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
140
|
+
NAPI_STATUS_RETURN(GetString(env, from, *to.GetSelf()));
|
|
141
|
+
to.PinSelf();
|
|
174
142
|
|
|
175
143
|
return napi_ok;
|
|
176
144
|
}
|
|
@@ -204,7 +172,11 @@ static napi_status GetValue(napi_env env, napi_value value, std::string& result)
|
|
|
204
172
|
return GetString(env, value, result);
|
|
205
173
|
}
|
|
206
174
|
|
|
207
|
-
static napi_status GetValue(napi_env env, napi_value value,
|
|
175
|
+
static napi_status GetValue(napi_env env, napi_value value, rocksdb::PinnableSlice& result) {
|
|
176
|
+
return GetString(env, value, result);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static napi_status GetValue(napi_env env, napi_value value, rocksdb::Slice& result) {
|
|
208
180
|
return GetString(env, value, result);
|
|
209
181
|
}
|
|
210
182
|
|
|
@@ -270,11 +242,12 @@ static napi_status GetProperty(napi_env env,
|
|
|
270
242
|
|
|
271
243
|
template <typename T>
|
|
272
244
|
napi_status Convert(napi_env env, rocksdb::PinnableSlice* s, Encoding encoding, napi_value& result) {
|
|
273
|
-
if (!s) {
|
|
245
|
+
if (!s || !s->IsPinned()) {
|
|
274
246
|
return napi_get_null(env, &result);
|
|
275
247
|
} else if (encoding == Encoding::Buffer) {
|
|
276
|
-
|
|
277
|
-
|
|
248
|
+
auto ptr = new rocksdb::PinnableSlice(std::move(*s));
|
|
249
|
+
return napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()),
|
|
250
|
+
Finalize<rocksdb::PinnableSlice>, ptr, &result);
|
|
278
251
|
} else if (encoding == Encoding::String) {
|
|
279
252
|
return napi_create_string_utf8(env, s->data(), s->size(), &result);
|
|
280
253
|
} else {
|
|
@@ -287,8 +260,6 @@ napi_status Convert(napi_env env, T&& s, Encoding encoding, napi_value& result)
|
|
|
287
260
|
if (!s) {
|
|
288
261
|
return napi_get_null(env, &result);
|
|
289
262
|
} else if (encoding == Encoding::Buffer) {
|
|
290
|
-
// napi_create_external_buffer would be nice but is unsafe since node
|
|
291
|
-
// buffers are not read-only.
|
|
292
263
|
return napi_create_buffer_copy(env, s->size(), s->data(), nullptr, &result);
|
|
293
264
|
} else if (encoding == Encoding::String) {
|
|
294
265
|
return napi_create_string_utf8(env, s->data(), s->size(), &result);
|
|
@@ -298,7 +269,12 @@ napi_status Convert(napi_env env, T&& s, Encoding encoding, napi_value& result)
|
|
|
298
269
|
}
|
|
299
270
|
|
|
300
271
|
template <typename State, typename T1, typename T2>
|
|
301
|
-
napi_status runAsync(State&& state,
|
|
272
|
+
napi_status runAsync(State&& state,
|
|
273
|
+
const std::string& name,
|
|
274
|
+
napi_env env,
|
|
275
|
+
napi_value callback,
|
|
276
|
+
T1&& execute,
|
|
277
|
+
T2&& then) {
|
|
302
278
|
struct Worker final {
|
|
303
279
|
static void Execute(napi_env env, void* data) {
|
|
304
280
|
auto worker = reinterpret_cast<Worker*>(data);
|
|
@@ -355,17 +331,13 @@ napi_status runAsync(State&& state, const std::string& name, napi_env env, napi_
|
|
|
355
331
|
|
|
356
332
|
State state;
|
|
357
333
|
|
|
358
|
-
|
|
334
|
+
napi_ref callbackRef = nullptr;
|
|
359
335
|
napi_async_work asyncWork = nullptr;
|
|
360
336
|
rocksdb::Status status = rocksdb::Status::OK();
|
|
361
337
|
};
|
|
362
338
|
|
|
363
|
-
auto worker =
|
|
364
|
-
|
|
365
|
-
std::forward<T1>(execute),
|
|
366
|
-
std::forward<T2>(then),
|
|
367
|
-
std::move(state)
|
|
368
|
-
});
|
|
339
|
+
auto worker =
|
|
340
|
+
std::unique_ptr<Worker>(new Worker{env, std::forward<T1>(execute), std::forward<T2>(then), std::move(state)});
|
|
369
341
|
|
|
370
342
|
NAPI_STATUS_RETURN(napi_create_reference(env, callback, 1, &worker->callbackRef));
|
|
371
343
|
napi_value asyncResourceName;
|
|
@@ -381,5 +353,5 @@ napi_status runAsync(State&& state, const std::string& name, napi_env env, napi_
|
|
|
381
353
|
}
|
|
382
354
|
template <typename State, typename T1, typename T2>
|
|
383
355
|
napi_status runAsync(const std::string& name, napi_env env, napi_value callback, T1&& execute, T2&& then) {
|
|
384
|
-
|
|
356
|
+
return runAsync<State>(State{}, name, env, callback, std::forward<T1>(execute), std::forward<T2>(then));
|
|
385
357
|
}
|