From f3e9b477d819b72a03fdfc235de2693de2b27ad8 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Sun, 20 Oct 2019 11:37:18 +0200 Subject: [PATCH 1/3] Use slice.compare(*string) in initial seek --- binding.cc | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/binding.cc b/binding.cc index 26de429e..ffbfc00e 100644 --- a/binding.cc +++ b/binding.cc @@ -587,27 +587,22 @@ struct Iterator { if (!dbIterator_->Valid()) { dbIterator_->SeekToLast(); } else { - std::string keyStr = dbIterator_->key().ToString(); - - if (lt_ != NULL) { - if (lt_->compare(keyStr) <= 0) - dbIterator_->Prev(); - } else if (lte_ != NULL) { - if (lte_->compare(keyStr) < 0) - dbIterator_->Prev(); - } else if (start_ != NULL) { - if (start_->compare(keyStr)) - dbIterator_->Prev(); + leveldb::Slice key = dbIterator_->key(); + + if ((lt_ != NULL && key.compare(*lt_) >= 0) || + (lte_ != NULL && key.compare(*lte_) > 0) || + (start_ != NULL && key.compare(*start_) > 0)) { + dbIterator_->Prev(); } } if (dbIterator_->Valid() && lt_ != NULL) { - if (lt_->compare(dbIterator_->key().ToString()) <= 0) + if (dbIterator_->key().compare(*lt_) >= 0) dbIterator_->Prev(); } } else { if (dbIterator_->Valid() && gt_ != NULL - && gt_->compare(dbIterator_->key().ToString()) == 0) + && dbIterator_->key().compare(*gt_) == 0) dbIterator_->Next(); } } else if (reverse_) { @@ -1306,8 +1301,7 @@ NAPI_METHOD(iterator_seek) { dbIterator->SeekToLast(); dbIterator->Next(); } - } - else if (dbIterator->Valid()) { + } else if (dbIterator->Valid()) { int cmp = dbIterator->key().compare(target); if (cmp > 0 && iterator->reverse_) { dbIterator->Prev(); From fb7e970ba3dc68d652b0c4be5a038c71c9ed7c70 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Sun, 20 Oct 2019 15:45:01 +0200 Subject: [PATCH 2/3] Is this dead code? --- binding.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/binding.cc b/binding.cc index ffbfc00e..0ee7a51d 100644 --- a/binding.cc +++ b/binding.cc @@ -598,7 +598,7 @@ struct Iterator { if (dbIterator_->Valid() && lt_ != NULL) { if (dbIterator_->key().compare(*lt_) >= 0) - dbIterator_->Prev(); + assert(false); } } else { if (dbIterator_->Valid() && gt_ != NULL From d69efd87b592dee2c95fec793b667c7fd63378c4 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Mon, 21 Oct 2019 23:29:43 +0200 Subject: [PATCH 3/3] Keep the dead code for now --- binding.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/binding.cc b/binding.cc index 0ee7a51d..843b4941 100644 --- a/binding.cc +++ b/binding.cc @@ -596,9 +596,11 @@ struct Iterator { } } + // TODO: this looks like dead code. Remove it in a + // next major release together with Level/community#86. if (dbIterator_->Valid() && lt_ != NULL) { if (dbIterator_->key().compare(*lt_) >= 0) - assert(false); + dbIterator_->Prev(); } } else { if (dbIterator_->Valid() && gt_ != NULL