forked from TrueCloudLab/frostfs-contract
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
|
package policy
|
||
|
|
||
|
import (
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-contract/common"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/interop/iterator"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
||
|
)
|
||
|
|
||
|
// Kind represents the object the chain is attached to.
|
||
|
// Currently only namespace and container are supported.
|
||
|
type Kind byte
|
||
|
|
||
|
const (
|
||
|
Namespace = 'n'
|
||
|
Container = 'c'
|
||
|
IAM = 'i'
|
||
|
)
|
||
|
|
||
|
// _deploy function sets up initial list of inner ring public keys.
|
||
|
func _deploy(data interface{}, isUpdate bool) {
|
||
|
}
|
||
|
|
||
|
func storageKey(prefix Kind, entityName, name string) []byte {
|
||
|
ln := len(entityName)
|
||
|
key := append([]byte{byte(prefix)}, byte(ln&0xFF), byte(ln>>8))
|
||
|
key = append(key, entityName...)
|
||
|
return append(key, name...)
|
||
|
}
|
||
|
|
||
|
func AddChain(entity Kind, entityName, name string, chain []byte) {
|
||
|
common.CheckAlphabetWitness() // TODO: Allow to work with chain directly for everyone?
|
||
|
|
||
|
ctx := storage.GetContext()
|
||
|
key := storageKey(entity, entityName, name)
|
||
|
storage.Put(ctx, key, chain)
|
||
|
}
|
||
|
|
||
|
func RemoveChain(entity Kind, entityName string, name string) {
|
||
|
common.CheckAlphabetWitness()
|
||
|
|
||
|
ctx := storage.GetContext()
|
||
|
key := storageKey(entity, entityName, name)
|
||
|
storage.Delete(ctx, key)
|
||
|
}
|
||
|
|
||
|
func RemoveChainsByPrefix(entity Kind, entityName string, name string) {
|
||
|
common.CheckAlphabetWitness()
|
||
|
|
||
|
ctx := storage.GetContext()
|
||
|
key := storageKey(entity, entityName, name)
|
||
|
it := storage.Find(ctx, key, storage.KeysOnly)
|
||
|
for iterator.Next(it) {
|
||
|
storage.Delete(ctx, iterator.Value(it).([]byte))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ListChains lists all chains for the namespace by prefix.
|
||
|
// container may be empty.
|
||
|
func ListChains(namespace, container, name string) [][]byte {
|
||
|
ctx := storage.GetReadOnlyContext()
|
||
|
|
||
|
var result [][]byte
|
||
|
|
||
|
prefixNs := storageKey(Namespace, namespace, name)
|
||
|
it := storage.Find(ctx, prefixNs, storage.ValuesOnly)
|
||
|
for iterator.Next(it) {
|
||
|
result = append(result, iterator.Value(it).([]byte))
|
||
|
}
|
||
|
|
||
|
if container != "" {
|
||
|
prefixCnr := storageKey(Container, container, name)
|
||
|
it = storage.Find(ctx, prefixCnr, storage.ValuesOnly)
|
||
|
for iterator.Next(it) {
|
||
|
result = append(result, iterator.Value(it).([]byte))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|