forked from cerc-io/plugeth
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:
parent
b05e63c34d
commit
12f1aea38d
@ -65,9 +65,9 @@ func (self *Iterator) next(node Node, key []byte) []byte {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cnode := node.Value()
|
cnode := node.Value()
|
||||||
skey := key[len(k):]
|
|
||||||
|
|
||||||
var ret []byte
|
var ret []byte
|
||||||
|
skey := key[len(k):]
|
||||||
if trie.BeginsWith(key, k) {
|
if trie.BeginsWith(key, k) {
|
||||||
ret = self.next(cnode, skey)
|
ret = self.next(cnode, skey)
|
||||||
} else if bytes.Compare(k, key[:len(k)]) > 0 {
|
} else if bytes.Compare(k, key[:len(k)]) > 0 {
|
||||||
@ -93,7 +93,8 @@ func (self *Iterator) key(node Node) []byte {
|
|||||||
|
|
||||||
return k
|
return k
|
||||||
} else {
|
} else {
|
||||||
return self.key(node.Value())
|
k := trie.RemTerm(node.Key())
|
||||||
|
return append(k, self.key(node.Value())...)
|
||||||
}
|
}
|
||||||
case *FullNode:
|
case *FullNode:
|
||||||
if node.Value() != nil {
|
if node.Value() != nil {
|
||||||
|
@ -8,12 +8,17 @@ func TestIterator(t *testing.T) {
|
|||||||
{"do", "verb"},
|
{"do", "verb"},
|
||||||
{"ether", "wookiedoo"},
|
{"ether", "wookiedoo"},
|
||||||
{"horse", "stallion"},
|
{"horse", "stallion"},
|
||||||
|
{"shaman", "horse"},
|
||||||
|
{"doge", "coin"},
|
||||||
|
{"dog", "puppy"},
|
||||||
|
{"somethingveryoddindeedthis is", "myothernodedata"},
|
||||||
}
|
}
|
||||||
v := make(map[string]bool)
|
v := make(map[string]bool)
|
||||||
for _, val := range vals {
|
for _, val := range vals {
|
||||||
v[val.k] = false
|
v[val.k] = false
|
||||||
trie.UpdateString(val.k, val.v)
|
trie.UpdateString(val.k, val.v)
|
||||||
}
|
}
|
||||||
|
trie.Commit()
|
||||||
|
|
||||||
it := trie.Iterator()
|
it := trie.Iterator()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
|
@ -122,7 +122,6 @@ func TestEmptyValues(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReplication(t *testing.T) {
|
func TestReplication(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
trie := NewEmpty()
|
trie := NewEmpty()
|
||||||
vals := []struct{ k, v string }{
|
vals := []struct{ k, v string }{
|
||||||
{"do", "verb"},
|
{"do", "verb"},
|
||||||
@ -138,7 +137,7 @@ func TestReplication(t *testing.T) {
|
|||||||
for _, val := range vals {
|
for _, val := range vals {
|
||||||
trie.UpdateString(val.k, val.v)
|
trie.UpdateString(val.k, val.v)
|
||||||
}
|
}
|
||||||
trie.Hash()
|
trie.Commit()
|
||||||
|
|
||||||
trie2 := New(trie.roothash, trie.cache.backend)
|
trie2 := New(trie.roothash, trie.cache.backend)
|
||||||
if string(trie2.GetString("horse")) != "stallion" {
|
if string(trie2.GetString("horse")) != "stallion" {
|
||||||
|
Loading…
Reference in New Issue
Block a user