rproxy3/storage/map.go

70 lines
1.1 KiB
Go
Executable File

package storage
import (
"fmt"
"gitea.inhome.blapointe.com/local/rproxy3/storage/packable"
)
type Map map[string]map[string][]byte
func NewMap() Map {
m := make(map[string]map[string][]byte)
n := Map(m)
return n
}
func (m Map) String() string {
s := ""
for k, v := range m {
if k == "clients" {
if s != "" {
s += ",\n"
}
s += fmt.Sprintf("[%s]:[%v]", k, v)
} else {
for k1, _ := range v {
if s != "" {
s += ",\n"
}
str := packable.NewString("")
m.Get(k, k1, str)
s += fmt.Sprintf("[%s:%s]:[%v]", k, k1, str)
}
}
}
return s
}
func (m Map) Close() error {
m = nil
return nil
}
func (m Map) Get(ns, key string, value packable.Packable) error {
if _, ok := m[ns]; !ok {
m[ns] = make(map[string][]byte)
}
if _, ok := m[ns][key]; !ok {
return ErrNotFound
}
return value.Decode(m[ns][key])
}
func (m Map) Set(ns, key string, value packable.Packable) error {
if _, ok := m[ns]; !ok {
m[ns] = make(map[string][]byte)
}
if value == nil {
if _, ok := m[ns][key]; ok {
delete(m[ns], key)
}
return nil
}
b, err := value.Encode()
if err != nil {
return err
}
m[ns][key] = b
return nil
}