forked from cerc-io/plugeth
Moved methods
This commit is contained in:
parent
e4d2d00d41
commit
6748158ab4
@ -150,25 +150,11 @@ func NewTrie(db ethutil.Database, Root interface{}) *Trie {
|
|||||||
return &Trie{cache: NewCache(db), Root: r, prevRoot: p}
|
return &Trie{cache: NewCache(db), Root: r, prevRoot: p}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the cached value to the database.
|
|
||||||
func (t *Trie) Sync() {
|
|
||||||
t.cache.Commit()
|
|
||||||
t.prevRoot = copyRoot(t.Root)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Trie) Undo() {
|
|
||||||
t.cache.Undo()
|
|
||||||
t.Root = t.prevRoot
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Trie) Cache() *Cache {
|
|
||||||
return t.cache
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Public (query) interface functions
|
* Public (query) interface functions
|
||||||
*/
|
*/
|
||||||
func (t *Trie) Update(key string, value string) {
|
|
||||||
|
func (t *Trie) Update(key, value string) {
|
||||||
t.mut.Lock()
|
t.mut.Lock()
|
||||||
defer t.mut.Unlock()
|
defer t.mut.Unlock()
|
||||||
|
|
||||||
@ -190,7 +176,7 @@ func (t *Trie) Get(key string) string {
|
|||||||
defer t.mut.RUnlock()
|
defer t.mut.RUnlock()
|
||||||
|
|
||||||
k := CompactHexDecode(key)
|
k := CompactHexDecode(key)
|
||||||
c := ethutil.NewValue(t.GetState(t.Root, k))
|
c := ethutil.NewValue(t.getState(t.Root, k))
|
||||||
|
|
||||||
return c.Str()
|
return c.Str()
|
||||||
}
|
}
|
||||||
@ -201,7 +187,7 @@ func (t *Trie) Delete(key string) {
|
|||||||
|
|
||||||
k := CompactHexDecode(key)
|
k := CompactHexDecode(key)
|
||||||
|
|
||||||
root := t.DeleteState(t.Root, k)
|
root := t.deleteState(t.Root, k)
|
||||||
switch root.(type) {
|
switch root.(type) {
|
||||||
case string:
|
case string:
|
||||||
t.Root = root
|
t.Root = root
|
||||||
@ -212,14 +198,44 @@ func (t *Trie) Delete(key string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Trie) GetState(node interface{}, key []int) interface{} {
|
// Simple compare function which creates a rlp value out of the evaluated objects
|
||||||
|
func (t *Trie) Cmp(trie *Trie) bool {
|
||||||
|
return ethutil.NewValue(t.Root).Cmp(ethutil.NewValue(trie.Root))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a copy of this trie
|
||||||
|
func (t *Trie) Copy() *Trie {
|
||||||
|
trie := NewTrie(t.cache.db, t.Root)
|
||||||
|
for key, node := range t.cache.nodes {
|
||||||
|
trie.cache.nodes[key] = node.Copy()
|
||||||
|
}
|
||||||
|
|
||||||
|
return trie
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the cached value to the database.
|
||||||
|
func (t *Trie) Sync() {
|
||||||
|
t.cache.Commit()
|
||||||
|
t.prevRoot = copyRoot(t.Root)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) Undo() {
|
||||||
|
t.cache.Undo()
|
||||||
|
t.Root = t.prevRoot
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) Cache() *Cache {
|
||||||
|
return t.cache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) getState(node interface{}, key []int) interface{} {
|
||||||
n := ethutil.NewValue(node)
|
n := ethutil.NewValue(node)
|
||||||
// Return the node if key is empty (= found)
|
// Return the node if key is empty (= found)
|
||||||
if len(key) == 0 || n.IsNil() || n.Len() == 0 {
|
if len(key) == 0 || n.IsNil() || n.Len() == 0 {
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode := t.GetNode(node)
|
currentNode := t.getNode(node)
|
||||||
length := currentNode.Len()
|
length := currentNode.Len()
|
||||||
|
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
@ -230,20 +246,20 @@ func (t *Trie) GetState(node interface{}, key []int) interface{} {
|
|||||||
v := currentNode.Get(1).Raw()
|
v := currentNode.Get(1).Raw()
|
||||||
|
|
||||||
if len(key) >= len(k) && CompareIntSlice(k, key[:len(k)]) {
|
if len(key) >= len(k) && CompareIntSlice(k, key[:len(k)]) {
|
||||||
return t.GetState(v, key[len(k):])
|
return t.getState(v, key[len(k):])
|
||||||
} else {
|
} else {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
} else if length == 17 {
|
} else if length == 17 {
|
||||||
return t.GetState(currentNode.Get(key[0]).Raw(), key[1:])
|
return t.getState(currentNode.Get(key[0]).Raw(), key[1:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// It shouldn't come this far
|
// It shouldn't come this far
|
||||||
fmt.Println("GetState unexpected return")
|
fmt.Println("getState unexpected return")
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Trie) GetNode(node interface{}) *ethutil.Value {
|
func (t *Trie) getNode(node interface{}) *ethutil.Value {
|
||||||
n := ethutil.NewValue(node)
|
n := ethutil.NewValue(node)
|
||||||
|
|
||||||
if !n.Get(0).IsNil() {
|
if !n.Get(0).IsNil() {
|
||||||
@ -299,7 +315,7 @@ func (t *Trie) InsertState(node interface{}, key []int, value interface{}) inter
|
|||||||
return t.Put(newNode)
|
return t.Put(newNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode := t.GetNode(node)
|
currentNode := t.getNode(node)
|
||||||
// Check for "special" 2 slice type node
|
// Check for "special" 2 slice type node
|
||||||
if currentNode.Len() == 2 {
|
if currentNode.Len() == 2 {
|
||||||
// Decode the key
|
// Decode the key
|
||||||
@ -358,7 +374,7 @@ func (t *Trie) InsertState(node interface{}, key []int, value interface{}) inter
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
func (t *Trie) deleteState(node interface{}, key []int) interface{} {
|
||||||
if len(key) == 0 {
|
if len(key) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -369,7 +385,7 @@ func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode := t.GetNode(node)
|
currentNode := t.getNode(node)
|
||||||
// Check for "special" 2 slice type node
|
// Check for "special" 2 slice type node
|
||||||
if currentNode.Len() == 2 {
|
if currentNode.Len() == 2 {
|
||||||
// Decode the key
|
// Decode the key
|
||||||
@ -380,8 +396,8 @@ func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
|||||||
if CompareIntSlice(k, key) {
|
if CompareIntSlice(k, key) {
|
||||||
return ""
|
return ""
|
||||||
} else if CompareIntSlice(key[:len(k)], k) {
|
} else if CompareIntSlice(key[:len(k)], k) {
|
||||||
hash := t.DeleteState(v, key[len(k):])
|
hash := t.deleteState(v, key[len(k):])
|
||||||
child := t.GetNode(hash)
|
child := t.getNode(hash)
|
||||||
|
|
||||||
var newNode []interface{}
|
var newNode []interface{}
|
||||||
if child.Len() == 2 {
|
if child.Len() == 2 {
|
||||||
@ -407,7 +423,7 @@ func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
n[key[0]] = t.DeleteState(n[key[0]], key[1:])
|
n[key[0]] = t.deleteState(n[key[0]], key[1:])
|
||||||
amount := -1
|
amount := -1
|
||||||
for i := 0; i < 17; i++ {
|
for i := 0; i < 17; i++ {
|
||||||
if n[i] != "" {
|
if n[i] != "" {
|
||||||
@ -421,7 +437,7 @@ func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
|||||||
if amount == 16 {
|
if amount == 16 {
|
||||||
newNode = []interface{}{CompactEncode([]int{16}), n[amount]}
|
newNode = []interface{}{CompactEncode([]int{16}), n[amount]}
|
||||||
} else if amount >= 0 {
|
} else if amount >= 0 {
|
||||||
child := t.GetNode(n[amount])
|
child := t.getNode(n[amount])
|
||||||
if child.Len() == 17 {
|
if child.Len() == 17 {
|
||||||
newNode = []interface{}{CompactEncode([]int{amount}), n[amount]}
|
newNode = []interface{}{CompactEncode([]int{amount}), n[amount]}
|
||||||
} else if child.Len() == 2 {
|
} else if child.Len() == 2 {
|
||||||
@ -439,21 +455,6 @@ func (t *Trie) DeleteState(node interface{}, key []int) interface{} {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simple compare function which creates a rlp value out of the evaluated objects
|
|
||||||
func (t *Trie) Cmp(trie *Trie) bool {
|
|
||||||
return ethutil.NewValue(t.Root).Cmp(ethutil.NewValue(trie.Root))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a copy of this trie
|
|
||||||
func (t *Trie) Copy() *Trie {
|
|
||||||
trie := NewTrie(t.cache.db, t.Root)
|
|
||||||
for key, node := range t.cache.nodes {
|
|
||||||
trie.cache.nodes[key] = node.Copy()
|
|
||||||
}
|
|
||||||
|
|
||||||
return trie
|
|
||||||
}
|
|
||||||
|
|
||||||
type TrieIterator struct {
|
type TrieIterator struct {
|
||||||
trie *Trie
|
trie *Trie
|
||||||
key string
|
key string
|
||||||
|
Loading…
Reference in New Issue
Block a user