@nxtedition/rocksdb 7.0.28 → 7.0.29

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
@@ -10,11 +10,11 @@
10
10
  #include <rocksdb/db.h>
11
11
  #include <rocksdb/env.h>
12
12
  #include <rocksdb/filter_policy.h>
13
+ #include <rocksdb/merge_operator.h>
13
14
  #include <rocksdb/options.h>
14
15
  #include <rocksdb/slice_transform.h>
15
16
  #include <rocksdb/table.h>
16
17
  #include <rocksdb/write_batch.h>
17
- #include <rocksdb/merge_operator.h>
18
18
 
19
19
  #include <array>
20
20
  #include <memory>
@@ -543,19 +543,8 @@ struct Updates {
543
543
  bool keys,
544
544
  bool values,
545
545
  bool data,
546
- const std::optional<std::string>& column)
547
- : database_(database), seqNumber_(seqNumber), keys_(keys), values_(values), data_(data) {
548
- if (column) {
549
- auto columns = database->columns_;
550
- auto columnIt = std::find_if(columns.begin(), columns.end(),
551
- [&](const auto& handle) { return handle->GetName() == *column; });
552
- if (columnIt != columns.end()) {
553
- column_family_id_ = (*columnIt)->GetID();
554
- } else {
555
- // TODO: Throw?
556
- }
557
- }
558
- }
546
+ const rocksdb::ColumnFamilyHandle* column)
547
+ : database_(database), seqNumber_(seqNumber), keys_(keys), values_(values), data_(data), column_(column) {}
559
548
 
560
549
  void Close() { iterator_.reset(); }
561
550
 
@@ -577,7 +566,7 @@ struct Updates {
577
566
  bool keys_;
578
567
  bool values_;
579
568
  bool data_;
580
- std::optional<uint32_t> column_family_id_;
569
+ const rocksdb::ColumnFamilyHandle* column_;
581
570
 
582
571
  private:
583
572
  napi_ref ref_ = nullptr;
@@ -586,7 +575,8 @@ struct Updates {
586
575
  static napi_status GetColumnFamily(Database* database,
587
576
  napi_env env,
588
577
  napi_value options,
589
- rocksdb::ColumnFamilyHandle** column) {
578
+ rocksdb::ColumnFamilyHandle** column,
579
+ bool fallback = true) {
590
580
  bool hasColumn = false;
591
581
  NAPI_STATUS_RETURN(napi_has_named_property(env, options, "column", &hasColumn));
592
582
 
@@ -594,8 +584,10 @@ static napi_status GetColumnFamily(Database* database,
594
584
  napi_value value = nullptr;
595
585
  NAPI_STATUS_RETURN(napi_get_named_property(env, options, "column", &value));
596
586
  NAPI_STATUS_RETURN(napi_get_value_external(env, value, reinterpret_cast<void**>(column)));
597
- } else {
587
+ } else if (fallback) {
598
588
  *column = database->db_->DefaultColumnFamily();
589
+ } else {
590
+ *column = nullptr;
599
591
  }
600
592
 
601
593
  return napi_ok;
@@ -841,6 +833,7 @@ NAPI_METHOD(db_open) {
841
833
  dbOptions.wal_compression = BooleanProperty(env, argv[2], "walCompression").value_or(false)
842
834
  ? rocksdb::CompressionType::kZSTD
843
835
  : rocksdb::CompressionType::kNoCompression;
836
+ dbOptions.manual_wal_flush = BooleanProperty(env, argv[2], "manualWalFlush").value_or(false);
844
837
 
845
838
  // TODO (feat): dbOptions.listeners
846
839
 
@@ -1013,57 +1006,82 @@ struct UpdatesNextWorker final : public rocksdb::WriteBatch::Handler, public Wor
1013
1006
  }
1014
1007
 
1015
1008
  rocksdb::Status PutCF(uint32_t column_family_id, const rocksdb::Slice& key, const rocksdb::Slice& value) override {
1016
- if (updates_->column_family_id_ && *updates_->column_family_id_ != column_family_id) {
1009
+ if (updates_->column_ && updates_->column_->GetID() != column_family_id) {
1017
1010
  return rocksdb::Status::OK();
1018
1011
  }
1012
+
1019
1013
  cache_.emplace_back("put");
1014
+
1020
1015
  if (updates_->keys_) {
1021
1016
  cache_.emplace_back(key.ToStringView());
1022
1017
  } else {
1023
1018
  cache_.emplace_back(std::nullopt);
1024
1019
  }
1020
+
1025
1021
  if (updates_->values_) {
1026
1022
  cache_.emplace_back(value.ToStringView());
1027
1023
  } else {
1028
1024
  cache_.emplace_back(std::nullopt);
1029
1025
  }
1030
- cache_.emplace_back(GetColumnName(column_family_id));
1026
+
1027
+ if (!updates_->column_) {
1028
+ cache_.emplace_back(GetColumnName(column_family_id));
1029
+ } else {
1030
+ cache_.emplace_back(std::nullopt);
1031
+ }
1032
+
1031
1033
  return rocksdb::Status::OK();
1032
1034
  }
1033
1035
 
1034
1036
  rocksdb::Status DeleteCF(uint32_t column_family_id, const rocksdb::Slice& key) override {
1035
- if (updates_->column_family_id_ && *updates_->column_family_id_ != column_family_id) {
1037
+ if (updates_->column_ && updates_->column_->GetID() != column_family_id) {
1036
1038
  return rocksdb::Status::OK();
1037
1039
  }
1040
+
1038
1041
  cache_.emplace_back("del");
1042
+
1039
1043
  if (updates_->keys_) {
1040
1044
  cache_.emplace_back(key.ToStringView());
1041
1045
  } else {
1042
1046
  cache_.emplace_back(std::nullopt);
1043
1047
  }
1048
+
1044
1049
  cache_.emplace_back(std::nullopt);
1045
- cache_.emplace_back(GetColumnName(column_family_id));
1050
+
1051
+ if (!updates_->column_) {
1052
+ cache_.emplace_back(GetColumnName(column_family_id));
1053
+ } else {
1054
+ cache_.emplace_back(std::nullopt);
1055
+ }
1056
+
1046
1057
  return rocksdb::Status::OK();
1047
1058
  }
1048
1059
 
1049
1060
  rocksdb::Status MergeCF(uint32_t column_family_id, const rocksdb::Slice& key, const rocksdb::Slice& value) override {
1050
- if (updates_->column_family_id_ && *updates_->column_family_id_ != column_family_id) {
1061
+ if (updates_->column_ && updates_->column_->GetID() != column_family_id) {
1051
1062
  return rocksdb::Status::OK();
1052
1063
  }
1064
+
1053
1065
  cache_.emplace_back("put");
1066
+
1054
1067
  if (updates_->keys_) {
1055
1068
  cache_.emplace_back(key.ToStringView());
1056
1069
  } else {
1057
1070
  cache_.emplace_back(std::nullopt);
1058
1071
  }
1072
+
1059
1073
  if (updates_->values_) {
1060
1074
  cache_.emplace_back(value.ToStringView());
1061
1075
  } else {
1062
1076
  cache_.emplace_back(std::nullopt);
1063
1077
  }
1064
- if (!updates_->column_family_id_) {
1078
+
1079
+ if (!updates_->column_) {
1065
1080
  cache_.emplace_back(GetColumnName(column_family_id));
1081
+ } else {
1082
+ cache_.emplace_back(std::nullopt);
1066
1083
  }
1084
+
1067
1085
  return rocksdb::Status::OK();
1068
1086
  }
1069
1087
 
@@ -1094,7 +1112,9 @@ NAPI_METHOD(updates_init) {
1094
1112
  const auto keys = BooleanProperty(env, argv[1], "keys").value_or(true);
1095
1113
  const auto values = BooleanProperty(env, argv[1], "values").value_or(true);
1096
1114
  const auto data = BooleanProperty(env, argv[1], "data").value_or(true);
1097
- const auto column = StringProperty(env, argv[1], "column");
1115
+
1116
+ rocksdb::ColumnFamilyHandle* column;
1117
+ NAPI_STATUS_THROWS(GetColumnFamily(database, env, argv[1], &column, false));
1098
1118
 
1099
1119
  auto updates = std::make_unique<Updates>(database, seqNumber, keys, values, data, column);
1100
1120
 
@@ -1858,6 +1878,19 @@ NAPI_METHOD(batch_merge) {
1858
1878
  return 0;
1859
1879
  }
1860
1880
 
1881
+ NAPI_METHOD(db_flush_wal) {
1882
+ NAPI_ARGV(2);
1883
+
1884
+ Database* database;
1885
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1886
+
1887
+ const auto flush = BooleanProperty(env, argv[1], "flush").value_or(false);
1888
+
1889
+ ROCKS_STATUS_THROWS(database->db_->FlushWAL(flush));
1890
+
1891
+ return 0;
1892
+ }
1893
+
1861
1894
  NAPI_INIT() {
1862
1895
  NAPI_EXPORT_FUNCTION(db_init);
1863
1896
  NAPI_EXPORT_FUNCTION(db_open);
@@ -1880,6 +1913,8 @@ NAPI_INIT() {
1880
1913
  NAPI_EXPORT_FUNCTION(updates_close);
1881
1914
  NAPI_EXPORT_FUNCTION(updates_next);
1882
1915
 
1916
+ NAPI_EXPORT_FUNCTION(db_flush_wal);
1917
+
1883
1918
  NAPI_EXPORT_FUNCTION(batch_do);
1884
1919
  NAPI_EXPORT_FUNCTION(batch_init);
1885
1920
  NAPI_EXPORT_FUNCTION(batch_put);
package/index.js CHANGED
@@ -145,6 +145,10 @@ class RocksLevel extends AbstractLevel {
145
145
  return binding.db_get_property(this[kContext], property)
146
146
  }
147
147
 
148
+ async flushWAL (options) {
149
+ binding.db_flush_wal(this[kContext], options)
150
+ }
151
+
148
152
  async query (options) {
149
153
  if (this.status !== 'open') {
150
154
  throw new ModuleError('Database is not open', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "7.0.28",
3
+ "version": "7.0.29",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
Binary file