blob: 7c936383dfde124a0ac8567618f4d4f4083d1b3d [file] [log] [blame]
package util
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
// DirectoryStore implements a key-value store on a filesystem where data for each key is stored in its own file.
// TODO(suharshs): When vstore is ready replace this with the veyron store.
type DirectoryStore struct {
dir string
}
func (s DirectoryStore) Exists(key string) bool {
_, err := os.Stat(s.pathName(key))
return !os.IsNotExist(err)
}
func (s DirectoryStore) Put(key, value string) error {
return ioutil.WriteFile(s.pathName(key), []byte(value), 0600)
}
func (s DirectoryStore) Get(key string) (string, error) {
bytes, err := ioutil.ReadFile(s.pathName(key))
return string(bytes), err
}
func (s DirectoryStore) pathName(key string) string {
return filepath.Join(string(s.dir), key)
}
// NewDirectoryStore returns a key-value store that uses one file per key,
// and places all data in the provided directory.
func NewDirectoryStore(dir string) (*DirectoryStore, error) {
if len(dir) == 0 {
return nil, fmt.Errorf("must provide non-empty directory name")
}
// Make the directory if it doesn't already exist.
if err := os.MkdirAll(dir, 0700); err != nil {
return nil, err
}
return &DirectoryStore{dir}, nil
}