Fixed iterator for short nodes.

In some cases the iterator didn't properly return the correct key
because it didn't append fields to the reverse lookup.
poc8
obscuren 10 years ago
parent b05e63c34d
commit 12f1aea38d
  1. 5
      ptrie/iterator.go
  2. 5
      ptrie/iterator_test.go
  3. 3
      ptrie/trie_test.go

@ -65,9 +65,9 @@ func (self *Iterator) next(node Node, key []byte) []byte {
}
} else {
cnode := node.Value()
skey := key[len(k):]
var ret []byte
skey := key[len(k):]
if trie.BeginsWith(key, k) {
ret = self.next(cnode, skey)
} else if bytes.Compare(k, key[:len(k)]) > 0 {
@ -93,7 +93,8 @@ func (self *Iterator) key(node Node) []byte {
return k
} else {
return self.key(node.Value())
k := trie.RemTerm(node.Key())
return append(k, self.key(node.Value())...)
}
case *FullNode:
if node.Value() != nil {

@ -8,12 +8,17 @@ func TestIterator(t *testing.T) {
{"do", "verb"},
{"ether", "wookiedoo"},
{"horse", "stallion"},
{"shaman", "horse"},
{"doge", "coin"},
{"dog", "puppy"},
{"somethingveryoddindeedthis is", "myothernodedata"},
}
v := make(map[string]bool)
for _, val := range vals {
v[val.k] = false
trie.UpdateString(val.k, val.v)
}
trie.Commit()
it := trie.Iterator()
for it.Next() {

@ -122,7 +122,6 @@ func TestEmptyValues(t *testing.T) {
}
func TestReplication(t *testing.T) {
t.Skip()
trie := NewEmpty()
vals := []struct{ k, v string }{
{"do", "verb"},
@ -138,7 +137,7 @@ func TestReplication(t *testing.T) {
for _, val := range vals {
trie.UpdateString(val.k, val.v)
}
trie.Hash()
trie.Commit()
trie2 := New(trie.roothash, trie.cache.backend)
if string(trie2.GetString("horse")) != "stallion" {

Loading…
Cancel
Save