@nxtedition/rocksdb 11.0.5 → 11.0.6

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.
Files changed (3) hide show
  1. package/binding.cc +90 -25
  2. package/index.js +6 -5
  3. package/package.json +1 -1
package/binding.cc CHANGED
@@ -643,7 +643,6 @@ NAPI_METHOD(db_get_location) {
643
643
  return result;
644
644
  }
645
645
 
646
-
647
646
  NAPI_METHOD(db_query) {
648
647
  NAPI_ARGV(2);
649
648
 
@@ -997,7 +996,7 @@ NAPI_METHOD(db_close) {
997
996
  return 0;
998
997
  }
999
998
 
1000
- NAPI_METHOD(db_get_many) {
999
+ NAPI_METHOD(db_get_many_sync) {
1001
1000
  NAPI_ARGV(3);
1002
1001
 
1003
1002
  Database* database;
@@ -1039,9 +1038,6 @@ NAPI_METHOD(db_get_many) {
1039
1038
  napi_value rows;
1040
1039
  NAPI_STATUS_THROWS(napi_create_array_with_length(env, count, &rows));
1041
1040
 
1042
- napi_value finished;
1043
- NAPI_STATUS_THROWS(napi_get_boolean(env, true, &finished));
1044
-
1045
1041
  for (auto n = 0; n < count; n++) {
1046
1042
  napi_value row;
1047
1043
  if (statuses[n].IsNotFound()) {
@@ -1055,11 +1051,88 @@ NAPI_METHOD(db_get_many) {
1055
1051
  NAPI_STATUS_THROWS(napi_set_element(env, rows, n, row));
1056
1052
  }
1057
1053
 
1058
- napi_value ret;
1059
- NAPI_STATUS_THROWS(napi_create_object(env, &ret));
1060
- NAPI_STATUS_THROWS(napi_set_named_property(env, ret, "rows", rows));
1061
- NAPI_STATUS_THROWS(napi_set_named_property(env, ret, "finished", finished));
1062
- return ret;
1054
+ return rows;
1055
+ }
1056
+
1057
+ NAPI_METHOD(db_get_many) {
1058
+ NAPI_ARGV(4);
1059
+
1060
+ Database* database;
1061
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1062
+
1063
+ uint32_t count;
1064
+ NAPI_STATUS_THROWS(napi_get_array_length(env, argv[1], &count));
1065
+
1066
+ bool fillCache = true;
1067
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "fillCache", fillCache));
1068
+
1069
+ rocksdb::ColumnFamilyHandle* column = database->db->DefaultColumnFamily();
1070
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "column", column));
1071
+
1072
+ Encoding valueEncoding = Encoding::Buffer;
1073
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "valueEncoding", valueEncoding));
1074
+
1075
+ int32_t highWaterMarkBytes = std::numeric_limits<int32_t>::max();
1076
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "highWaterMarkBytes", highWaterMarkBytes));
1077
+
1078
+ auto callback = argv[3];
1079
+
1080
+ std::vector<rocksdb::PinnableSlice> keys{count};
1081
+
1082
+ for (uint32_t n = 0; n < count; n++) {
1083
+ napi_value element;
1084
+ NAPI_STATUS_THROWS(napi_get_element(env, argv[1], n, &element));
1085
+ NAPI_STATUS_THROWS(GetValue(env, element, keys[n]));
1086
+ }
1087
+
1088
+ struct State {
1089
+ std::vector<rocksdb::Status> statuses;
1090
+ std::vector<rocksdb::PinnableSlice> values;
1091
+ };
1092
+
1093
+ runAsync<State>(
1094
+ "leveldown.get_many", env, callback,
1095
+ [=, keys = std::move(keys)](auto& state) {
1096
+ std::vector<rocksdb::Slice> keys2{count};
1097
+ for (uint32_t n = 0; n < count; n++) {
1098
+ keys2[n] = keys[n];
1099
+ }
1100
+
1101
+ rocksdb::ReadOptions readOptions;
1102
+ readOptions.fill_cache = fillCache;
1103
+ readOptions.async_io = true;
1104
+ readOptions.optimize_multiget_for_io = true;
1105
+ readOptions.value_size_soft_limit = highWaterMarkBytes;
1106
+
1107
+ state.statuses.resize(count);
1108
+ state.values.resize(count);
1109
+
1110
+ database->db->MultiGet(readOptions, column, count, keys2.data(), state.values.data(), state.statuses.data());
1111
+
1112
+ return rocksdb::Status::OK();
1113
+ },
1114
+ [=](auto& state, auto env, auto& argv) {
1115
+ argv.resize(2);
1116
+
1117
+ NAPI_STATUS_RETURN(napi_create_array_with_length(env, count, &argv[1]));
1118
+
1119
+ for (auto n = 0; n < count; n++) {
1120
+ napi_value row;
1121
+ if (state.statuses[n].IsNotFound()) {
1122
+ NAPI_STATUS_RETURN(napi_get_undefined(env, &row));
1123
+ } else if (state.statuses[n].IsAborted()) {
1124
+ NAPI_STATUS_RETURN(napi_get_null(env, &row));
1125
+ } else {
1126
+ ROCKS_STATUS_RETURN_NAPI(state.statuses[n]);
1127
+ NAPI_STATUS_RETURN(Convert(env, &state.values[n], valueEncoding, row));
1128
+ }
1129
+ NAPI_STATUS_RETURN(napi_set_element(env, argv[1], n, row));
1130
+ }
1131
+
1132
+ return napi_ok;
1133
+ });
1134
+
1135
+ return 0;
1063
1136
  }
1064
1137
 
1065
1138
  NAPI_METHOD(db_clear) {
@@ -1264,10 +1337,8 @@ NAPI_METHOD(batch_put) {
1264
1337
  rocksdb::Slice val;
1265
1338
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1266
1339
 
1267
- const auto options = argv[3];
1268
-
1269
1340
  rocksdb::ColumnFamilyHandle* column = nullptr;
1270
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1341
+ NAPI_STATUS_THROWS(GetProperty(env, argv[3], "column", column));
1271
1342
 
1272
1343
  if (column) {
1273
1344
  ROCKS_STATUS_THROWS_NAPI(batch->Put(column, key, val));
@@ -1287,10 +1358,8 @@ NAPI_METHOD(batch_del) {
1287
1358
  rocksdb::Slice key;
1288
1359
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1289
1360
 
1290
- const auto options = argv[2];
1291
-
1292
1361
  rocksdb::ColumnFamilyHandle* column = nullptr;
1293
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1362
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "column", column));
1294
1363
 
1295
1364
  if (column) {
1296
1365
  ROCKS_STATUS_THROWS_NAPI(batch->Delete(column, key));
@@ -1313,10 +1382,8 @@ NAPI_METHOD(batch_merge) {
1313
1382
  rocksdb::Slice val;
1314
1383
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1315
1384
 
1316
- const auto options = argv[3];
1317
-
1318
1385
  rocksdb::ColumnFamilyHandle* column = nullptr;
1319
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1386
+ NAPI_STATUS_THROWS(GetProperty(env, argv[3], "column", column));
1320
1387
 
1321
1388
  if (column) {
1322
1389
  ROCKS_STATUS_THROWS_NAPI(batch->Merge(column, key, val));
@@ -1339,7 +1406,7 @@ NAPI_METHOD(batch_clear) {
1339
1406
  }
1340
1407
 
1341
1408
  NAPI_METHOD(batch_write) {
1342
- NAPI_ARGV(4);
1409
+ NAPI_ARGV(3);
1343
1410
 
1344
1411
  Database* database;
1345
1412
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
@@ -1347,14 +1414,11 @@ NAPI_METHOD(batch_write) {
1347
1414
  rocksdb::WriteBatch* batch;
1348
1415
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[1], reinterpret_cast<void**>(&batch)));
1349
1416
 
1350
- auto options = argv[2];
1351
- auto callback = argv[3];
1352
-
1353
1417
  bool sync = false;
1354
- NAPI_STATUS_THROWS(GetProperty(env, options, "sync", sync));
1418
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "sync", sync));
1355
1419
 
1356
1420
  bool lowPriority = false;
1357
- NAPI_STATUS_THROWS(GetProperty(env, options, "lowPriority", lowPriority));
1421
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "lowPriority", lowPriority));
1358
1422
 
1359
1423
  rocksdb::WriteOptions writeOptions;
1360
1424
  writeOptions.sync = sync;
@@ -1421,6 +1485,7 @@ NAPI_INIT() {
1421
1485
  NAPI_EXPORT_FUNCTION(db_get_location);
1422
1486
  NAPI_EXPORT_FUNCTION(db_close);
1423
1487
  NAPI_EXPORT_FUNCTION(db_get_many);
1488
+ NAPI_EXPORT_FUNCTION(db_get_many_sync);
1424
1489
  NAPI_EXPORT_FUNCTION(db_clear);
1425
1490
  NAPI_EXPORT_FUNCTION(db_get_property);
1426
1491
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
package/index.js CHANGED
@@ -152,11 +152,14 @@ class RocksLevel extends AbstractLevel {
152
152
  }
153
153
 
154
154
  _getMany (keys, options, callback) {
155
+ if (keys.some(key => typeof key === 'string')) {
156
+ keys = keys.map(key => typeof key === 'string' ? Buffer.from(key) : key)
157
+ }
158
+
155
159
  callback = fromCallback(callback, kPromise)
156
160
 
157
161
  try {
158
- // TODO (fix): highWaterMark and limit with async between...
159
- process.nextTick(callback, null, this._getManySync(keys, options ?? kEmpty))
162
+ binding.db_get_many(this[kContext], keys, options ?? kEmpty, callback)
160
163
  } catch (err) {
161
164
  process.nextTick(callback, err)
162
165
  }
@@ -169,9 +172,7 @@ class RocksLevel extends AbstractLevel {
169
172
  keys = keys.map(key => typeof key === 'string' ? Buffer.from(key) : key)
170
173
  }
171
174
 
172
- const { rows, finished } = binding.db_get_many(this[kContext], keys, options ?? kEmpty)
173
- assert(finished)
174
- return rows
175
+ return binding.db_get_many_sync(this[kContext], keys, options ?? kEmpty)
175
176
  }
176
177
 
177
178
  _del (key, options, callback) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "11.0.5",
3
+ "version": "11.0.6",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",