@@ -512,8 +512,6 @@ struct PriorityWorker : public BaseWorker {
512512struct Iterator {
513513 Iterator (Database* database,
514514 uint32_t id,
515- std::string* start,
516- std::string* end,
517515 bool reverse,
518516 bool keys,
519517 bool values,
@@ -528,8 +526,6 @@ struct Iterator {
528526 uint32_t highWaterMark)
529527 : database_(database),
530528 id_ (id),
531- start_(start),
532- end_(end),
533529 reverse_(reverse),
534530 keys_(keys),
535531 values_(values),
@@ -558,8 +554,6 @@ struct Iterator {
558554 ~Iterator () {
559555 assert (ended_);
560556
561- if (start_ != NULL ) delete start_;
562- if (end_ != NULL ) delete end_;
563557 if (lt_ != NULL ) delete lt_;
564558 if (gt_ != NULL ) delete gt_;
565559 if (lte_ != NULL ) delete lte_;
@@ -593,32 +587,29 @@ struct Iterator {
593587
594588 dbIterator_ = database_->NewIterator (options_);
595589
596- if (start_ != NULL ) {
597- dbIterator_->Seek (*start_);
590+ if (!reverse_ && gte_ != NULL ) {
591+ dbIterator_->Seek (*gte_);
592+ } else if (!reverse_ && gt_ != NULL ) {
593+ dbIterator_->Seek (*gt_);
598594
599- if (reverse_) {
600- if (!dbIterator_->Valid ()) {
601- dbIterator_->SeekToLast ();
602- } else {
603- leveldb::Slice key = dbIterator_->key ();
604-
605- if ((lt_ != NULL && key.compare (*lt_) >= 0 ) ||
606- (lte_ != NULL && key.compare (*lte_) > 0 ) ||
607- (start_ != NULL && key.compare (*start_) > 0 )) {
608- dbIterator_->Prev ();
609- }
610- }
595+ if (dbIterator_->Valid () && dbIterator_->key ().compare (*gt_) == 0 ) {
596+ dbIterator_->Next ();
597+ }
598+ } else if (reverse_ && lte_ != NULL ) {
599+ dbIterator_->Seek (*lte_);
611600
612- // TODO: this looks like dead code. Remove it in a
613- // next major release together with Level/community#86.
614- if (dbIterator_->Valid () && lt_ != NULL ) {
615- if (dbIterator_->key ().compare (*lt_) >= 0 )
616- dbIterator_->Prev ();
617- }
618- } else {
619- if (dbIterator_->Valid () && gt_ != NULL
620- && dbIterator_->key ().compare (*gt_) == 0 )
621- dbIterator_->Next ();
601+ if (!dbIterator_->Valid ()) {
602+ dbIterator_->SeekToLast ();
603+ } else if (dbIterator_->key ().compare (*lte_) > 0 ) {
604+ dbIterator_->Prev ();
605+ }
606+ } else if (reverse_ && lt_ != NULL ) {
607+ dbIterator_->Seek (*lt_);
608+
609+ if (!dbIterator_->Valid ()) {
610+ dbIterator_->SeekToLast ();
611+ } else if (dbIterator_->key ().compare (*lt_) >= 0 ) {
612+ dbIterator_->Prev ();
622613 }
623614 } else if (reverse_) {
624615 dbIterator_->SeekToLast ();
@@ -643,12 +634,8 @@ struct Iterator {
643634
644635 if (dbIterator_->Valid ()) {
645636 std::string keyStr = dbIterator_->key ().ToString ();
646- const int isEnd = end_ == NULL ? 1 : end_->compare (keyStr);
647637
648638 if ((limit_ < 0 || ++count_ <= limit_)
649- && (end_ == NULL
650- || (reverse_ && (isEnd <= 0 ))
651- || (!reverse_ && (isEnd >= 0 )))
652639 && ( lt_ != NULL ? (lt_->compare (keyStr) > 0 )
653640 : lte_ != NULL ? (lte_->compare (keyStr) >= 0 )
654641 : true )
@@ -670,20 +657,10 @@ struct Iterator {
670657 }
671658
672659 bool OutOfRange (leveldb::Slice& target) {
673- if ((lt_ != NULL && target.compare (*lt_) >= 0 ) ||
674- (lte_ != NULL && target.compare (*lte_) > 0 ) ||
675- (start_ != NULL && reverse_ && target.compare (*start_) > 0 )) {
676- return true ;
677- }
678-
679- if (end_ != NULL ) {
680- int d = target.compare (*end_);
681- if (reverse_ ? d < 0 : d > 0 ) return true ;
682- }
683-
684- return ((gt_ != NULL && target.compare (*gt_) <= 0 ) ||
685- (gte_ != NULL && target.compare (*gte_) < 0 ) ||
686- (start_ != NULL && !reverse_ && target.compare (*start_) < 0 ));
660+ return ((lt_ != NULL && target.compare (*lt_) >= 0 ) ||
661+ (lte_ != NULL && target.compare (*lte_) > 0 ) ||
662+ (gt_ != NULL && target.compare (*gt_) <= 0 ) ||
663+ (gte_ != NULL && target.compare (*gte_) < 0 ));
687664 }
688665
689666 bool IteratorNext (std::vector<std::pair<std::string, std::string> >& result) {
@@ -716,8 +693,6 @@ struct Iterator {
716693
717694 Database* database_;
718695 uint32_t id_;
719- std::string* start_;
720- std::string* end_;
721696 bool reverse_;
722697 bool keys_;
723698 bool values_;
@@ -1305,21 +1280,13 @@ NAPI_METHOD(iterator_init) {
13051280 uint32_t highWaterMark = Uint32Property (env, options, " highWaterMark" ,
13061281 16 * 1024 );
13071282
1308- std::string* start = NULL ;
1309- std::string* end = RangeOption (env, options, " end" );
13101283 std::string* lt = RangeOption (env, options, " lt" );
13111284 std::string* lte = RangeOption (env, options, " lte" );
13121285 std::string* gt = RangeOption (env, options, " gt" );
13131286 std::string* gte = RangeOption (env, options, " gte" );
13141287
1315- if (!reverse && gte != NULL ) start = new std::string (*gte);
1316- else if (!reverse && gt != NULL ) start = new std::string (*gt);
1317- else if (reverse && lte != NULL ) start = new std::string (*lte);
1318- else if (reverse && lt != NULL ) start = new std::string (*lt);
1319- else start = RangeOption (env, options, " start" );
1320-
13211288 uint32_t id = database->currentIteratorId_ ++;
1322- Iterator* iterator = new Iterator (database, id, start, end, reverse, keys,
1289+ Iterator* iterator = new Iterator (database, id, reverse, keys,
13231290 values, limit, lt, lte, gt, gte, fillCache,
13241291 keyAsBuffer, valueAsBuffer, highWaterMark);
13251292 napi_value result;
0 commit comments