1
0
Fork 0
forked from forks/go-ethereum

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.
This commit is contained in:
obscuren 2014-11-20 18:11:31 +01:00
parent b05e63c34d
commit 12f1aea38d
3 changed files with 9 additions and 4 deletions

View file

@ -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 {

View file

@ -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() {

View file

@ -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" {