10
10
#include < leveldb/filter_policy.h>
11
11
12
12
#include < map>
13
+ #include < optional>
13
14
#include < vector>
14
15
15
16
/* *
@@ -94,6 +95,13 @@ static bool IsObject (napi_env env, napi_value value) {
94
95
return type == napi_object;
95
96
}
96
97
98
+ std::string toString (napi_env& env, const napi_value& from) {
99
+ LD_STRING_OR_BUFFER_TO_COPY (env, from, to);
100
+ auto str = std::string (toCh_, toSz_);
101
+ delete [] toCh_;
102
+ return str;
103
+ }
104
+
97
105
/* *
98
106
* Create an error object.
99
107
*/
@@ -253,19 +261,16 @@ static size_t StringOrBufferLength (napi_env env, napi_value value) {
253
261
* Takes a Buffer or string property 'name' from 'opts'.
254
262
* Returns null if the property does not exist or is zero-length.
255
263
*/
256
- static std::string* RangeOption (napi_env env, napi_value opts, const char * name) {
264
+ static std::optional<std:: string> RangeOption (napi_env env, napi_value opts, const char * name) {
257
265
if (HasProperty (env, opts, name)) {
258
266
napi_value value = GetProperty (env, opts, name);
259
267
260
268
if (StringOrBufferLength (env, value) >= 0 ) {
261
- LD_STRING_OR_BUFFER_TO_COPY (env, value, to);
262
- std::string* result = new std::string (toCh_, toSz_);
263
- delete [] toCh_;
264
- return result;
269
+ return toString (env, value);
265
270
}
266
271
}
267
272
268
- return NULL ;
273
+ return {} ;
269
274
}
270
275
271
276
/* *
@@ -283,9 +288,7 @@ static std::vector<std::string>* KeyArray (napi_env env, napi_value arr) {
283
288
284
289
if (napi_get_element (env, arr, i, &element) == napi_ok &&
285
290
StringOrBufferLength (env, element) >= 0 ) {
286
- LD_STRING_OR_BUFFER_TO_COPY (env, element, to);
287
- result->emplace_back (toCh_, toSz_);
288
- delete [] toCh_;
291
+ result->push_back (toString (env, element));
289
292
}
290
293
}
291
294
}
@@ -625,20 +628,20 @@ struct PriorityWorker : public BaseWorker {
625
628
struct BaseIterator {
626
629
BaseIterator (Database* database,
627
630
const bool reverse,
628
- std::string* lt,
629
- std::string* lte,
630
- std::string* gt,
631
- std::string* gte,
631
+ std::optional<std:: string> lt,
632
+ std::optional<std:: string> lte,
633
+ std::optional<std:: string> gt,
634
+ std::optional<std:: string> gte,
632
635
const int limit,
633
636
const bool fillCache)
634
637
: database_(database),
635
638
hasClosed_ (false ),
636
639
didSeek_(false ),
637
640
reverse_(reverse),
638
- lt_(lt ),
639
- lte_(lte),
640
- gt_(gt ),
641
- gte_(gte),
641
+ lt_(std::move(lt) ),
642
+ lte_(std::move( lte) ),
643
+ gt_(std::move(gt) ),
644
+ gte_(std::move( gte) ),
642
645
limit_(limit),
643
646
count_(0 ) {
644
647
options_ = new leveldb::ReadOptions ();
@@ -650,11 +653,6 @@ struct BaseIterator {
650
653
virtual ~BaseIterator () {
651
654
assert (hasClosed_);
652
655
653
- if (lt_ != NULL ) delete lt_;
654
- if (gt_ != NULL ) delete gt_;
655
- if (lte_ != NULL ) delete lte_;
656
- if (gte_ != NULL ) delete gte_;
657
-
658
656
delete options_;
659
657
}
660
658
@@ -668,23 +666,23 @@ struct BaseIterator {
668
666
void SeekToRange () {
669
667
didSeek_ = true ;
670
668
671
- if (!reverse_ && gte_ != NULL ) {
669
+ if (!reverse_ && gte_) {
672
670
dbIterator_->Seek (*gte_);
673
- } else if (!reverse_ && gt_ != NULL ) {
671
+ } else if (!reverse_ && gt_) {
674
672
dbIterator_->Seek (*gt_);
675
673
676
674
if (dbIterator_->Valid () && dbIterator_->key ().compare (*gt_) == 0 ) {
677
675
dbIterator_->Next ();
678
676
}
679
- } else if (reverse_ && lte_ != NULL ) {
677
+ } else if (reverse_ && lte_) {
680
678
dbIterator_->Seek (*lte_);
681
679
682
680
if (!dbIterator_->Valid ()) {
683
681
dbIterator_->SeekToLast ();
684
682
} else if (dbIterator_->key ().compare (*lte_) > 0 ) {
685
683
dbIterator_->Prev ();
686
684
}
687
- } else if (reverse_ && lt_ != NULL ) {
685
+ } else if (reverse_ && lt_) {
688
686
dbIterator_->Seek (*lt_);
689
687
690
688
if (!dbIterator_->Valid ()) {
@@ -784,15 +782,15 @@ struct BaseIterator {
784
782
// }
785
783
786
784
// The lte and gte options take precedence over lt and gt respectively
787
- if (lte_ != NULL ) {
785
+ if (lte_) {
788
786
if (target.compare (*lte_) > 0 ) return true ;
789
- } else if (lt_ != NULL ) {
787
+ } else if (lt_) {
790
788
if (target.compare (*lt_) >= 0 ) return true ;
791
789
}
792
790
793
- if (gte_ != NULL ) {
791
+ if (gte_) {
794
792
if (target.compare (*gte_) < 0 ) return true ;
795
- } else if (gt_ != NULL ) {
793
+ } else if (gt_) {
796
794
if (target.compare (*gt_) <= 0 ) return true ;
797
795
}
798
796
@@ -806,10 +804,10 @@ struct BaseIterator {
806
804
leveldb::Iterator* dbIterator_;
807
805
bool didSeek_;
808
806
const bool reverse_;
809
- std::string* lt_;
810
- std::string* lte_;
811
- std::string* gt_;
812
- std::string* gte_;
807
+ std::optional<std:: string> lt_;
808
+ std::optional<std:: string> lte_;
809
+ std::optional<std:: string> gt_;
810
+ std::optional<std:: string> gte_;
813
811
const int limit_;
814
812
int count_;
815
813
leveldb::ReadOptions* options_;
@@ -825,15 +823,15 @@ struct Iterator final : public BaseIterator {
825
823
const bool keys,
826
824
const bool values,
827
825
const int limit,
828
- std::string* lt,
829
- std::string* lte,
830
- std::string* gt,
831
- std::string* gte,
826
+ std::optional<std:: string> lt,
827
+ std::optional<std:: string> lte,
828
+ std::optional<std:: string> gt,
829
+ std::optional<std:: string> gte,
832
830
const bool fillCache,
833
831
const bool keyAsBuffer,
834
832
const bool valueAsBuffer,
835
833
const uint32_t highWaterMarkBytes)
836
- : BaseIterator(database, reverse, lt, lte, gt, gte, limit, fillCache),
834
+ : BaseIterator(database, reverse, std::move(lt), std::move( lte), std::move(gt), std::move( gte) , limit, fillCache),
837
835
id_ (id),
838
836
keys_(keys),
839
837
values_(values),
@@ -1345,12 +1343,12 @@ struct ClearWorker final : public PriorityWorker {
1345
1343
napi_value callback,
1346
1344
const bool reverse,
1347
1345
const int limit,
1348
- std::string* lt,
1349
- std::string* lte,
1350
- std::string* gt,
1351
- std::string* gte)
1346
+ std::optional<std:: string> lt,
1347
+ std::optional<std:: string> lte,
1348
+ std::optional<std:: string> gt,
1349
+ std::optional<std:: string> gte)
1352
1350
: PriorityWorker(env, database, callback, " classic_level.db.clear" ) {
1353
- iterator_ = new BaseIterator (database, reverse, lt, lte, gt, gte, limit, false );
1351
+ iterator_ = new BaseIterator (database, reverse, std::move (lt), std::move ( lte), std::move (gt), std::move ( gte) , limit, false );
1354
1352
writeOptions_ = new leveldb::WriteOptions ();
1355
1353
writeOptions_->sync = false ;
1356
1354
}
@@ -1409,12 +1407,12 @@ NAPI_METHOD(db_clear) {
1409
1407
const bool reverse = BooleanProperty (env, options, " reverse" , false );
1410
1408
const int limit = Int32Property (env, options, " limit" , -1 );
1411
1409
1412
- std::string* lt = RangeOption (env, options, " lt" );
1413
- std::string* lte = RangeOption (env, options, " lte" );
1414
- std::string* gt = RangeOption (env, options, " gt" );
1415
- std::string* gte = RangeOption (env, options, " gte" );
1410
+ const auto lt = RangeOption (env, options, " lt" );
1411
+ const auto lte = RangeOption (env, options, " lte" );
1412
+ const auto gt = RangeOption (env, options, " gt" );
1413
+ const auto gte = RangeOption (env, options, " gte" );
1416
1414
1417
- ClearWorker* worker = new ClearWorker (env, database, callback, reverse, limit, lt, lte, gt, gte);
1415
+ ClearWorker* worker = new ClearWorker (env, database, callback, reverse, limit, std::move (lt), std::move ( lte), std::move (gt), std::move ( gte) );
1418
1416
worker->Queue (env);
1419
1417
1420
1418
NAPI_RETURN_UNDEFINED ();
@@ -1635,14 +1633,14 @@ NAPI_METHOD(iterator_init) {
1635
1633
const int limit = Int32Property (env, options, " limit" , -1 );
1636
1634
const uint32_t highWaterMarkBytes = Uint32Property (env, options, " highWaterMarkBytes" , 16 * 1024 );
1637
1635
1638
- std::string* lt = RangeOption (env, options, " lt" );
1639
- std::string* lte = RangeOption (env, options, " lte" );
1640
- std::string* gt = RangeOption (env, options, " gt" );
1641
- std::string* gte = RangeOption (env, options, " gte" );
1636
+ auto lt = RangeOption (env, options, " lt" );
1637
+ auto lte = RangeOption (env, options, " lte" );
1638
+ auto gt = RangeOption (env, options, " gt" );
1639
+ auto gte = RangeOption (env, options, " gte" );
1642
1640
1643
1641
const uint32_t id = database->currentIteratorId_ ++;
1644
1642
Iterator* iterator = new Iterator (database, id, reverse, keys,
1645
- values, limit, lt, lte, gt, gte, fillCache,
1643
+ values, limit, std::move (lt), std::move ( lte), std::move (gt), std::move ( gte) , fillCache,
1646
1644
keyAsBuffer, valueAsBuffer, highWaterMarkBytes);
1647
1645
napi_value result;
1648
1646
0 commit comments