3 // persistent key-value store
4 // TODO: thread safety, persistence, efficient update and query, incremental backup
19 memstore map[string][]byte
22 func Open(name string) (c *Conn, err error) {
24 c.memstore = make(map[string][]byte)
26 c.path, err = filepath.Abs(name)
30 err = os.MkdirAll(c.path, 0755)
34 err = filepath.Walk(c.path, func(path string, info *os.FileInfo, err error) error {
35 if info.IsDirectory() {
36 if info.Name == c.name {
39 return filepath.SkipDir
45 v, err := ioutil.ReadFile(filepath.Join(c.path, k))
55 func (c *Conn) Get(k string) (v []byte, err error) {
57 defer c.mutex.RUnlock()
58 v, ok := c.memstore[k]
60 err = fmt.Errorf("key not found")
65 func (c *Conn) Set(k string, v []byte) (err error) {
67 defer c.mutex.Unlock()
68 f, err := os.Create(filepath.Join(c.path, k))
80 func (c *Conn) Close() (err error) {