@nxtedition/rocksdb 14.0.0 → 15.0.1

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
@@ -2034,193 +2034,30 @@ NAPI_METHOD(updates_close) {
2034
2034
  }
2035
2035
  }
2036
2036
 
2037
- NAPI_METHOD(db_open_for_read_only) {
2038
- NAPI_ARGV(3);
2037
+ NAPI_METHOD(db_compact_range_sync) {
2038
+ NAPI_ARGV(2);
2039
2039
 
2040
2040
  Database* database;
2041
2041
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
2042
2042
 
2043
- if (database->db) {
2044
- napi_value columns;
2045
- NAPI_STATUS_THROWS(napi_create_object(env, &columns));
2046
- for (auto& [id, column] : database->columns) {
2047
- napi_value val;
2048
- NAPI_STATUS_THROWS(napi_create_external(env, column.handle, nullptr, nullptr, &val));
2049
- NAPI_STATUS_THROWS(napi_set_named_property(env, columns, column.descriptor.name.c_str(), val));
2050
- }
2051
- return columns;
2052
- } else {
2053
- rocksdb::Options dbOptions;
2054
-
2055
- const auto options = argv[1];
2056
-
2057
- int parallelism = std::max<int>(1, std::thread::hardware_concurrency() / 2);
2058
- NAPI_STATUS_THROWS(GetProperty(env, options, "parallelism", parallelism));
2059
- dbOptions.IncreaseParallelism(parallelism);
2060
-
2061
- NAPI_STATUS_THROWS(GetProperty(env, options, "walDir", dbOptions.wal_dir));
2062
-
2063
- uint32_t walTTL = 0;
2064
- NAPI_STATUS_THROWS(GetProperty(env, options, "walTTL", walTTL));
2065
- dbOptions.WAL_ttl_seconds = walTTL / 1e3;
2066
-
2067
- uint32_t walSizeLimit = 0;
2068
- NAPI_STATUS_THROWS(GetProperty(env, options, "walSizeLimit", walSizeLimit));
2069
- dbOptions.WAL_size_limit_MB = walSizeLimit / 1e6;
2070
-
2071
- NAPI_STATUS_THROWS(GetProperty(env, options, "maxTotalWalSize", dbOptions.max_total_wal_size));
2072
-
2073
- bool walCompression = true;
2074
- NAPI_STATUS_THROWS(GetProperty(env, options, "walCompression", walCompression));
2075
- dbOptions.wal_compression =
2076
- walCompression ? rocksdb::CompressionType::kZSTD : rocksdb::CompressionType::kNoCompression;
2077
-
2078
- dbOptions.avoid_unnecessary_blocking_io = true;
2079
- NAPI_STATUS_THROWS(GetProperty(env, options, "avoidUnnecessaryBlockingIO", dbOptions.avoid_unnecessary_blocking_io));
2080
-
2081
- dbOptions.create_missing_column_families = true;
2082
- NAPI_STATUS_THROWS(GetProperty(env, options, "createMissingColumnFamilies", dbOptions.create_missing_column_families));
2083
-
2084
- NAPI_STATUS_THROWS(GetProperty(env, options, "writeDbIdToManifest", dbOptions.write_dbid_to_manifest));
2085
-
2086
- NAPI_STATUS_THROWS(GetProperty(env, options, "adviseRandomOnOpen", dbOptions.advise_random_on_open));
2087
-
2088
- NAPI_STATUS_THROWS(GetProperty(env, options, "bytesPerSync", dbOptions.bytes_per_sync));
2089
-
2090
- NAPI_STATUS_THROWS(GetProperty(env, options, "walBytesPerSync", dbOptions.wal_bytes_per_sync));
2091
-
2092
- NAPI_STATUS_THROWS(GetProperty(env, options, "strictBytesPerSync", dbOptions.strict_bytes_per_sync));
2093
-
2094
- NAPI_STATUS_THROWS(GetProperty(env, options, "delayedWriteRate", dbOptions.delayed_write_rate));
2095
-
2096
- NAPI_STATUS_THROWS(GetProperty(env, options, "createIfMissing", dbOptions.create_if_missing));
2097
-
2098
- NAPI_STATUS_THROWS(GetProperty(env, options, "errorIfExists", dbOptions.error_if_exists));
2099
-
2100
- NAPI_STATUS_THROWS(GetProperty(env, options, "pipelinedWrite", dbOptions.enable_pipelined_write));
2101
-
2102
- NAPI_STATUS_THROWS(GetProperty(env, options, "dailyOffpeakTime", dbOptions.daily_offpeak_time_utc));
2103
-
2104
- NAPI_STATUS_THROWS(GetProperty(env, options, "unorderedWrite", dbOptions.unordered_write));
2105
-
2106
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapReads", dbOptions.allow_mmap_reads));
2107
-
2108
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapWrites", dbOptions.allow_mmap_writes));
2109
-
2110
- NAPI_STATUS_THROWS(GetProperty(env, options, "memTableHugePageSize", dbOptions.memtable_huge_page_size));
2111
-
2112
- NAPI_STATUS_THROWS(GetProperty(env, options, "useDirectIOReads", dbOptions.use_direct_reads));
2113
-
2114
- NAPI_STATUS_THROWS(GetProperty(env, options, "useDirectIOForFlushAndCompaction", dbOptions.use_direct_io_for_flush_and_compaction));
2115
-
2116
- NAPI_STATUS_THROWS(GetProperty(env, options, "compactionReadaheadSize", dbOptions.compaction_readahead_size));
2117
-
2118
- // TODO (feat): dbOptions.listeners
2119
-
2120
- std::string infoLogLevel;
2121
- NAPI_STATUS_THROWS(GetProperty(env, options, "infoLogLevel", infoLogLevel));
2122
- if (infoLogLevel.size() > 0) {
2123
- rocksdb::InfoLogLevel lvl = {};
2124
-
2125
- if (infoLogLevel == "debug")
2126
- lvl = rocksdb::InfoLogLevel::DEBUG_LEVEL;
2127
- else if (infoLogLevel == "info")
2128
- lvl = rocksdb::InfoLogLevel::INFO_LEVEL;
2129
- else if (infoLogLevel == "warn")
2130
- lvl = rocksdb::InfoLogLevel::WARN_LEVEL;
2131
- else if (infoLogLevel == "error")
2132
- lvl = rocksdb::InfoLogLevel::ERROR_LEVEL;
2133
- else if (infoLogLevel == "fatal")
2134
- lvl = rocksdb::InfoLogLevel::FATAL_LEVEL;
2135
- else if (infoLogLevel == "header")
2136
- lvl = rocksdb::InfoLogLevel::HEADER_LEVEL;
2137
- else
2138
- napi_throw_error(env, nullptr, "invalid log level");
2139
-
2140
- dbOptions.info_log_level = lvl;
2141
- } else {
2142
- // In some places RocksDB checks this option to see if it should prepare
2143
- // debug information (ahead of logging), so set it to the highest level.
2144
- dbOptions.info_log_level = rocksdb::InfoLogLevel::HEADER_LEVEL;
2145
- dbOptions.info_log.reset(new NullLogger());
2146
- }
2147
-
2148
- NAPI_STATUS_THROWS(InitOptions(env, dbOptions, options));
2149
-
2150
- std::vector<rocksdb::ColumnFamilyDescriptor> descriptors;
2151
-
2152
- bool hasColumns;
2153
- NAPI_STATUS_THROWS(napi_has_named_property(env, options, "columns", &hasColumns));
2154
-
2155
- if (hasColumns) {
2156
- napi_value columns;
2157
- NAPI_STATUS_THROWS(napi_get_named_property(env, options, "columns", &columns));
2158
-
2159
- napi_value keys;
2160
- NAPI_STATUS_THROWS(napi_get_property_names(env, columns, &keys));
2161
-
2162
- uint32_t len;
2163
- NAPI_STATUS_THROWS(napi_get_array_length(env, keys, &len));
2164
-
2165
- descriptors.resize(len);
2166
- for (uint32_t n = 0; n < len; ++n) {
2167
- napi_value key;
2168
- NAPI_STATUS_THROWS(napi_get_element(env, keys, n, &key));
2169
-
2170
- napi_value column;
2171
- NAPI_STATUS_THROWS(napi_get_property(env, columns, key, &column));
2172
-
2173
- NAPI_STATUS_THROWS(InitOptions(env, descriptors[n].options, column));
2174
-
2175
- NAPI_STATUS_THROWS(GetValue(env, key, descriptors[n].name));
2176
- }
2177
- }
2178
-
2179
- auto callback = argv[2];
2180
-
2181
- runAsync<std::vector<rocksdb::ColumnFamilyHandle*>>(
2182
- "leveldown.open_for_read_only", env, callback,
2183
- [=](auto& handles) {
2184
- assert(!database->db);
2185
-
2186
- rocksdb::DB* db = nullptr;
2187
-
2188
- const auto status = descriptors.empty()
2189
- ? rocksdb::DB::OpenForReadOnly(dbOptions, database->location, &db)
2190
- : rocksdb::DB::OpenForReadOnly(dbOptions, database->location, descriptors, &handles, &db);
2191
-
2192
- database->db.reset(db);
2193
-
2194
- return status;
2195
- },
2196
- [=](auto& handles, auto env, auto& argv) {
2197
- argv.resize(2);
2043
+ std::optional<std::string> start;
2044
+ std::optional<std::string> end;
2198
2045
 
2199
- NAPI_STATUS_RETURN(napi_create_object(env, &argv[1]));
2046
+ NAPI_STATUS_THROWS(GetProperty(env, argv[1], "start", start));
2047
+ NAPI_STATUS_THROWS(GetProperty(env, argv[1], "end", end));
2200
2048
 
2201
- for (size_t n = 0; n < handles.size(); ++n) {
2202
- ColumnFamily column;
2203
- column.handle = handles[n];
2204
- column.descriptor = descriptors[n];
2205
- database->columns[column.handle->GetID()] = column;
2206
- }
2049
+ rocksdb::CompactRangeOptions options;
2207
2050
 
2208
- napi_value columns = argv[1];
2209
- for (auto& [id, column] : database->columns) {
2210
- napi_value val;
2211
- NAPI_STATUS_RETURN(napi_create_external(env, column.handle, nullptr, nullptr, &val));
2212
- NAPI_STATUS_RETURN(napi_set_named_property(env, columns, column.descriptor.name.c_str(), val));
2213
- }
2051
+ auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2052
+ auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2214
2053
 
2215
- return napi_ok;
2216
- });
2217
- }
2054
+ ROCKS_STATUS_THROWS_NAPI(database->db->CompactRange(options, begin.get(), finish.get()));
2218
2055
 
2219
2056
  return 0;
2220
2057
  }
2221
2058
 
2222
2059
  NAPI_METHOD(db_compact_range) {
2223
- NAPI_ARGV(2);
2060
+ NAPI_ARGV(3);
2224
2061
 
2225
2062
  Database* database;
2226
2063
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
@@ -2231,12 +2068,19 @@ NAPI_METHOD(db_compact_range) {
2231
2068
  NAPI_STATUS_THROWS(GetProperty(env, argv[1], "start", start));
2232
2069
  NAPI_STATUS_THROWS(GetProperty(env, argv[1], "end", end));
2233
2070
 
2234
- rocksdb::CompactRangeOptions options;
2071
+ auto callback = argv[2];
2235
2072
 
2236
- auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2237
- auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2073
+ runAsync<std::nullptr_t>(
2074
+ "leveldown.compact_range", env, callback,
2075
+ [=](auto& state) {
2076
+ rocksdb::CompactRangeOptions options;
2238
2077
 
2239
- ROCKS_STATUS_THROWS_NAPI(database->db->CompactRange(options, begin.get(), finish.get()));
2078
+ auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2079
+ auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2080
+
2081
+ return database->db->CompactRange(options, begin.get(), finish.get());
2082
+ },
2083
+ [](auto& state, auto env, auto& argv) { return napi_ok; });
2240
2084
 
2241
2085
  return 0;
2242
2086
  }
@@ -2254,7 +2098,7 @@ NAPI_INIT() {
2254
2098
  NAPI_EXPORT_FUNCTION(db_get_property);
2255
2099
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
2256
2100
  NAPI_EXPORT_FUNCTION(db_query);
2257
- NAPI_EXPORT_FUNCTION(db_open_for_read_only);
2101
+ NAPI_EXPORT_FUNCTION(db_compact_range_sync);
2258
2102
  NAPI_EXPORT_FUNCTION(db_compact_range);
2259
2103
 
2260
2104
  NAPI_EXPORT_FUNCTION(iterator_init);
package/index.js CHANGED
@@ -255,8 +255,16 @@ class RocksLevel extends AbstractLevel {
255
255
  return binding.db_get_property(this[kContext], property)
256
256
  }
257
257
 
258
- async query (options) {
259
- return this.querySync(options)
258
+ query(options, callback) {
259
+ callback = fromCallback(callback, kPromise)
260
+
261
+ try {
262
+ process.nextTick(callback, null, this.querySync(options))
263
+ } catch (err) {
264
+ process.nextTick(callback, err)
265
+ }
266
+
267
+ return callback[kPromise]
260
268
  }
261
269
 
262
270
  querySync (options) {
@@ -294,50 +302,18 @@ class RocksLevel extends AbstractLevel {
294
302
  }
295
303
  }
296
304
 
297
- openForReadOnly (options, callback) {
298
- if (callback === undefined) {
299
- callback = options
300
- options = {}
301
- }
302
- const doOpen = () => {
303
- let columns
304
- try {
305
- columns = binding.db_open_for_read_only(this[kContext], options, (err, columns) => {
306
- if (err) {
307
- callback?.(err)
308
- } else {
309
- this[kColumns] = columns
310
- const procId = setInterval(() => {
311
- if (this.status === 'opening') {
312
- /**
313
- * Wait until db opens
314
- */
315
- } else {
316
- clearInterval(procId)
317
- callback?.(null)
318
- }
319
- }, 1)
320
- }
321
- })
322
- } catch (err) {
323
- callback?.(err)
324
- }
325
- if (columns) {
326
- this[kColumns] = columns
327
- callback?.(null)
328
- }
329
- }
330
- doOpen()
331
- }
305
+ compactRange (options = {}, callback) {
306
+ callback = fromCallback(callback, kPromise)
332
307
 
333
- compactRange (options = {}) {
334
308
  if (this.status !== 'open') {
335
309
  throw new ModuleError('Database is not open', {
336
310
  code: 'LEVEL_DATABASE_NOT_OPEN'
337
311
  })
338
312
  }
339
313
 
340
- return binding.db_compact_range(this[kContext], options)
314
+ binding.db_compact_range(this[kContext], options, callback)
315
+
316
+ return callback[kPromise]
341
317
  }
342
318
  }
343
319
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "14.0.0",
3
+ "version": "15.0.1",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",