@nxtedition/rocksdb 11.0.5 → 11.0.7

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
@@ -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,89 @@ 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
+ struct State {
1081
+ std::vector<rocksdb::Status> statuses;
1082
+ std::vector<rocksdb::PinnableSlice> values;
1083
+ std::vector<rocksdb::PinnableSlice> keys;
1084
+ } state;
1085
+
1086
+ state.keys.resize(count);
1087
+
1088
+ for (uint32_t n = 0; n < count; n++) {
1089
+ napi_value element;
1090
+ NAPI_STATUS_THROWS(napi_get_element(env, argv[1], n, &element));
1091
+ NAPI_STATUS_THROWS(GetValue(env, element, state.keys[n]));
1092
+ }
1093
+
1094
+ runAsync(std::move(state),
1095
+ "leveldown.get_many", env, callback,
1096
+ [=](auto& state) {
1097
+ rocksdb::ReadOptions readOptions;
1098
+ readOptions.fill_cache = fillCache;
1099
+ readOptions.async_io = true;
1100
+ readOptions.optimize_multiget_for_io = true;
1101
+ readOptions.value_size_soft_limit = highWaterMarkBytes;
1102
+
1103
+ std::vector<rocksdb::Slice> keys{count};
1104
+ for (uint32_t n = 0; n < count; n++) {
1105
+ keys[n] = state.keys[n];
1106
+ }
1107
+
1108
+ state.statuses.resize(count);
1109
+ state.values.resize(count);
1110
+
1111
+ database->db->MultiGet(readOptions, column, count, keys.data(), state.values.data(), state.statuses.data());
1112
+
1113
+ return rocksdb::Status::OK();
1114
+ },
1115
+ [=](auto& state, auto env, auto& argv) {
1116
+ argv.resize(2);
1117
+
1118
+ NAPI_STATUS_RETURN(napi_create_array_with_length(env, count, &argv[1]));
1119
+
1120
+ for (auto n = 0; n < count; n++) {
1121
+ napi_value row;
1122
+ if (state.statuses[n].IsNotFound()) {
1123
+ NAPI_STATUS_RETURN(napi_get_undefined(env, &row));
1124
+ } else if (state.statuses[n].IsAborted()) {
1125
+ NAPI_STATUS_RETURN(napi_get_null(env, &row));
1126
+ } else {
1127
+ ROCKS_STATUS_RETURN_NAPI(state.statuses[n]);
1128
+ NAPI_STATUS_RETURN(Convert(env, &state.values[n], valueEncoding, row));
1129
+ }
1130
+ NAPI_STATUS_RETURN(napi_set_element(env, argv[1], n, row));
1131
+ }
1132
+
1133
+ return napi_ok;
1134
+ });
1135
+
1136
+ return 0;
1063
1137
  }
1064
1138
 
1065
1139
  NAPI_METHOD(db_clear) {
@@ -1264,10 +1338,8 @@ NAPI_METHOD(batch_put) {
1264
1338
  rocksdb::Slice val;
1265
1339
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1266
1340
 
1267
- const auto options = argv[3];
1268
-
1269
1341
  rocksdb::ColumnFamilyHandle* column = nullptr;
1270
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1342
+ NAPI_STATUS_THROWS(GetProperty(env, argv[3], "column", column));
1271
1343
 
1272
1344
  if (column) {
1273
1345
  ROCKS_STATUS_THROWS_NAPI(batch->Put(column, key, val));
@@ -1287,10 +1359,8 @@ NAPI_METHOD(batch_del) {
1287
1359
  rocksdb::Slice key;
1288
1360
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1289
1361
 
1290
- const auto options = argv[2];
1291
-
1292
1362
  rocksdb::ColumnFamilyHandle* column = nullptr;
1293
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1363
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "column", column));
1294
1364
 
1295
1365
  if (column) {
1296
1366
  ROCKS_STATUS_THROWS_NAPI(batch->Delete(column, key));
@@ -1313,10 +1383,8 @@ NAPI_METHOD(batch_merge) {
1313
1383
  rocksdb::Slice val;
1314
1384
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1315
1385
 
1316
- const auto options = argv[3];
1317
-
1318
1386
  rocksdb::ColumnFamilyHandle* column = nullptr;
1319
- NAPI_STATUS_THROWS(GetProperty(env, options, "column", column));
1387
+ NAPI_STATUS_THROWS(GetProperty(env, argv[3], "column", column));
1320
1388
 
1321
1389
  if (column) {
1322
1390
  ROCKS_STATUS_THROWS_NAPI(batch->Merge(column, key, val));
@@ -1339,7 +1407,7 @@ NAPI_METHOD(batch_clear) {
1339
1407
  }
1340
1408
 
1341
1409
  NAPI_METHOD(batch_write) {
1342
- NAPI_ARGV(4);
1410
+ NAPI_ARGV(3);
1343
1411
 
1344
1412
  Database* database;
1345
1413
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
@@ -1347,14 +1415,11 @@ NAPI_METHOD(batch_write) {
1347
1415
  rocksdb::WriteBatch* batch;
1348
1416
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[1], reinterpret_cast<void**>(&batch)));
1349
1417
 
1350
- auto options = argv[2];
1351
- auto callback = argv[3];
1352
-
1353
1418
  bool sync = false;
1354
- NAPI_STATUS_THROWS(GetProperty(env, options, "sync", sync));
1419
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "sync", sync));
1355
1420
 
1356
1421
  bool lowPriority = false;
1357
- NAPI_STATUS_THROWS(GetProperty(env, options, "lowPriority", lowPriority));
1422
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "lowPriority", lowPriority));
1358
1423
 
1359
1424
  rocksdb::WriteOptions writeOptions;
1360
1425
  writeOptions.sync = sync;
@@ -1421,6 +1486,7 @@ NAPI_INIT() {
1421
1486
  NAPI_EXPORT_FUNCTION(db_get_location);
1422
1487
  NAPI_EXPORT_FUNCTION(db_close);
1423
1488
  NAPI_EXPORT_FUNCTION(db_get_many);
1489
+ NAPI_EXPORT_FUNCTION(db_get_many_sync);
1424
1490
  NAPI_EXPORT_FUNCTION(db_clear);
1425
1491
  NAPI_EXPORT_FUNCTION(db_get_property);
1426
1492
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
package/chained-batch.js CHANGED
@@ -72,6 +72,7 @@ class ChainedBatch extends AbstractChainedBatch {
72
72
  }
73
73
 
74
74
  _close (callback) {
75
+ binding.batch_clear(this[kBatchContext])
75
76
  process.nextTick(callback)
76
77
  }
77
78
 
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.7",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",