This repository has been archived by the owner on Mar 30, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1k
/
trie_key.go
105 lines (85 loc) · 2.95 KB
/
trie_key.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package trie
import (
"bytes"
"fmt"
"github.com/openblockchain/obc-peer/openchain/ledger/statemgmt"
)
type trieKeyEncoder interface {
newTrieKey(originalBytes []byte) trieKeyInterface
getMaxTrieWidth() int
decodeTrieKeyBytes(encodedBytes []byte) (originalBytes []byte)
}
type trieKeyInterface interface {
getLevel() int
getParentTrieKey() trieKeyInterface
getIndexInParent() int
getEncodedBytes() []byte
}
var trieKeyEncoderImpl trieKeyEncoder = newByteTrieKeyEncoder()
var rootTrieKeyBytes = []byte{}
var rootTrieKeyStr = string(rootTrieKeyBytes)
var rootTrieKey = newTrieKeyFromCompositeKey(rootTrieKeyBytes)
type trieKey struct {
trieKeyImpl trieKeyInterface
}
func newTrieKey(chaincodeID string, key string) *trieKey {
compositeKey := statemgmt.ConstructCompositeKey(chaincodeID, key)
return newTrieKeyFromCompositeKey(compositeKey)
}
func newTrieKeyFromCompositeKey(compositeKey []byte) *trieKey {
return &trieKey{trieKeyEncoderImpl.newTrieKey(compositeKey)}
}
func decodeTrieKeyBytes(encodedBytes []byte) []byte {
return trieKeyEncoderImpl.decodeTrieKeyBytes(encodedBytes)
}
func (key *trieKey) getEncodedBytes() []byte {
return key.trieKeyImpl.getEncodedBytes()
}
func (key *trieKey) getLevel() int {
return key.trieKeyImpl.getLevel()
}
func (key *trieKey) getIndexInParent() int {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return key.trieKeyImpl.getIndexInParent()
}
func (key *trieKey) getParentTrieKey() *trieKey {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return &trieKey{key.trieKeyImpl.getParentTrieKey()}
}
func (key *trieKey) getEncodedBytesAsStr() string {
return string(key.trieKeyImpl.getEncodedBytes())
}
func (key *trieKey) isRootKey() bool {
return len(key.getEncodedBytes()) == 0
}
func (key *trieKey) getParentLevel() int {
if key.isRootKey() {
panic(fmt.Errorf("Parent for Trie root shoould not be asked for"))
}
return key.getLevel() - 1
}
func (key *trieKey) assertIsChildOf(parentTrieKey *trieKey) {
if !bytes.Equal(key.getParentTrieKey().getEncodedBytes(), parentTrieKey.getEncodedBytes()) {
panic(fmt.Errorf("trie key [%s] is not a child of trie key [%s]", key, parentTrieKey))
}
}