storage/map.go

76 lines
1.4 KiB
Go
Executable File

package storage
import (
"fmt"
)
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 s != "" {
s += ",\n"
}
s += fmt.Sprintf("[%s]:[%s]", k, v)
}
return s
}
func (m *Map) Close() error {
m = nil
return nil
}
func (m *Map) List(ns []string, limits ...string) ([]string, error) {
namespace := resolveNamespace(ns)
limits = resolveLimits(limits)
keys := []string{}
n, _ := (*m)[DefaultNamespace]
if v, ok := (*m)[namespace]; ok {
n = v
}
for k := range n {
if k >= limits[0] && k <= limits[1] {
keys = append(keys, k)
}
}
return keys, nil
}
func (m *Map) Get(key string, ns ...string) ([]byte, error) {
namespace := resolveNamespace(ns)
if _, ok := (*m)[namespace]; !ok {
return nil, ErrNotFound
}
if _, ok := (*m)[namespace][key]; !ok {
return nil, ErrNotFound
}
return (*m)[namespace][key], nil
}
func (m *Map) Set(key string, value []byte, ns ...string) error {
namespace := resolveNamespace(ns)
if value == nil {
if _, ok := (*m)[namespace]; !ok {
return nil
} else if _, ok := (*m)[namespace][key]; ok {
delete((*m)[namespace], key)
}
} else {
if _, ok := (*m)[namespace]; !ok {
(*m)[namespace] = make(map[string][]byte)
}
(*m)[namespace][key] = value
}
return nil
}