@nxtedition/rocksdb 11.0.9 → 11.1.0

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
@@ -18,10 +18,12 @@
18
18
  #include <rocksdb/table.h>
19
19
  #include <rocksdb/write_batch.h>
20
20
 
21
+
21
22
  #include <iostream>
22
23
  #include <memory>
23
24
  #include <optional>
24
25
  #include <set>
26
+ #include <regex>
25
27
  #include <string>
26
28
  #include <thread>
27
29
  #include <vector>
@@ -1479,6 +1481,69 @@ NAPI_METHOD(batch_iterate) {
1479
1481
  return result;
1480
1482
  }
1481
1483
 
1484
+ NAPI_METHOD(regex_init) {
1485
+ NAPI_ARGV(1);
1486
+
1487
+ std::string pattern;
1488
+ NAPI_STATUS_THROWS(GetString(env, argv[0], pattern));
1489
+
1490
+ auto batch = std::make_unique<std::regex>(pattern);
1491
+
1492
+ napi_value result;
1493
+ NAPI_STATUS_THROWS(napi_create_external(env, batch.get(), Finalize<std::regex>, batch.get(), &result));
1494
+ batch.release();
1495
+
1496
+ return result;
1497
+ }
1498
+
1499
+ NAPI_METHOD(regex_test) {
1500
+ NAPI_ARGV(2);
1501
+
1502
+ std::regex* regex;
1503
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&regex)));
1504
+
1505
+ rocksdb::Slice value;
1506
+ NAPI_STATUS_THROWS(GetValue(env, argv[1], value));
1507
+
1508
+ const bool match = std::regex_match(value.data(), value.data() + value.size(), *regex);
1509
+
1510
+ napi_value result;
1511
+ NAPI_STATUS_THROWS(napi_get_boolean(env, match, &result));
1512
+
1513
+ return result;
1514
+ }
1515
+
1516
+ NAPI_METHOD(regex_test_many) {
1517
+ NAPI_ARGV(2);
1518
+
1519
+ std::regex* regex;
1520
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&regex)));
1521
+
1522
+ uint32_t count;
1523
+ NAPI_STATUS_THROWS(napi_get_array_length(env, argv[1], &count));
1524
+
1525
+ napi_value result;
1526
+ NAPI_STATUS_THROWS(napi_create_array_with_length(env, count, &result));
1527
+
1528
+ for (uint32_t n = 0; n < count; n++) {
1529
+ napi_value valueElement;
1530
+ NAPI_STATUS_THROWS(napi_get_element(env, argv[1], n, &valueElement));
1531
+
1532
+ rocksdb::Slice value;
1533
+ NAPI_STATUS_THROWS(GetValue(env, valueElement, value));
1534
+
1535
+ const bool match = std::regex_match(value.data(), value.data() + value.size(), *regex);
1536
+
1537
+ napi_value matchElement;
1538
+ NAPI_STATUS_THROWS(napi_get_boolean(env, match, &matchElement));
1539
+
1540
+ NAPI_STATUS_THROWS(napi_set_element(env, result, n, matchElement));
1541
+ }
1542
+
1543
+ return result;
1544
+ }
1545
+
1546
+
1482
1547
  NAPI_INIT() {
1483
1548
  NAPI_EXPORT_FUNCTION(db_init);
1484
1549
  NAPI_EXPORT_FUNCTION(db_open);
@@ -1506,4 +1571,8 @@ NAPI_INIT() {
1506
1571
  NAPI_EXPORT_FUNCTION(batch_merge);
1507
1572
  NAPI_EXPORT_FUNCTION(batch_count);
1508
1573
  NAPI_EXPORT_FUNCTION(batch_iterate);
1574
+
1575
+ NAPI_EXPORT_FUNCTION(regex_init);
1576
+ NAPI_EXPORT_FUNCTION(regex_test_many);
1577
+ NAPI_EXPORT_FUNCTION(regex_test);
1509
1578
  }
package/index.js CHANGED
@@ -5,6 +5,7 @@ const { AbstractLevel } = require('abstract-level')
5
5
  const ModuleError = require('module-error')
6
6
  const binding = require('./binding')
7
7
  const { ChainedBatch } = require('./chained-batch')
8
+ const { Regex } = require('./regex')
8
9
  const { Iterator } = require('./iterator')
9
10
  const fs = require('node:fs')
10
11
  const assert = require('node:assert')
@@ -264,3 +265,4 @@ class RocksLevel extends AbstractLevel {
264
265
  }
265
266
 
266
267
  exports.RocksLevel = RocksLevel
268
+ exports.Regex = Regex
package/iterator.js CHANGED
@@ -107,16 +107,19 @@ class Iterator extends AbstractIterator {
107
107
  }
108
108
 
109
109
  _close (callback) {
110
- this[kCache] = kEmpty
111
-
112
110
  try {
113
- binding.iterator_close(this[kContext])
111
+ this._syncClose()
114
112
  process.nextTick(callback)
115
113
  } catch (err) {
116
114
  process.nextTick(callback, err)
117
115
  }
118
116
  }
119
117
 
118
+ _syncClose () {
119
+ this[kCache] = kEmpty
120
+ binding.iterator_close(this[kContext])
121
+ }
122
+
120
123
  _end (callback) {
121
124
  this._close(callback)
122
125
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "11.0.9",
3
+ "version": "11.1.0",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
package/regex.js ADDED
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ const binding = require('./binding')
4
+
5
+ class Regex {
6
+ #context
7
+
8
+ constructor (pattern) {
9
+ this.#context = binding.regex_init(pattern)
10
+ }
11
+
12
+ test (value) {
13
+ return binding.regex_test(this.#context, value)
14
+ }
15
+
16
+ testMany (values) {
17
+ return binding.regex_test_many(this.#context, values)
18
+ }
19
+ }
20
+
21
+ exports.Regex = Regex