jsondb: Allow passing nil as document to Read()

This makes Read() usable in situations where only the existence of a
value has to be checked.
This commit is contained in:
Lars Karlitski 2020-05-10 17:38:03 +02:00 committed by Tom Gundersen
parent e599a95067
commit 7592e38d3d
2 changed files with 40 additions and 4 deletions

View file

@ -36,7 +36,8 @@ func New(dir string, perm os.FileMode) *JSONDatabase {
return &JSONDatabase{dir, perm}
}
// Reads the value at `name`. `document` must deserializable from JSON. Returns
// Reads the value at `name`. `document` must be a type that is deserializable
// from the JSON document `name`, or nil to not deserialize at all. Returns
// false if a document with `name` does not exist.
func (db *JSONDatabase) Read(name string, document interface{}) (bool, error) {
f, err := os.Open(path.Join(db.dir, name+".json"))
@ -48,9 +49,11 @@ func (db *JSONDatabase) Read(name string, document interface{}) (bool, error) {
}
defer f.Close()
err = json.NewDecoder(f).Decode(&document)
if err != nil {
return false, fmt.Errorf("error reading db file %s: %v", name, err)
if document != nil {
err = json.NewDecoder(f).Decode(&document)
if err != nil {
return false, fmt.Errorf("error reading db file %s: %v", name, err)
}
}
return true, nil

View file

@ -72,6 +72,39 @@ func TestCorrupt(t *testing.T) {
require.Error(t, err)
}
func TestRead(t *testing.T) {
dir, err := ioutil.TempDir("", "jsondb-test-")
require.NoError(t, err)
defer cleanupTempDir(t, dir)
err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("true"), 0755)
require.NoError(t, err)
db := jsondb.New(dir, 0755)
var b bool
exists, err := db.Read("one", &b)
require.NoError(t, err)
require.True(t, exists)
require.True(t, b)
// nil means don't deserialize
exists, err = db.Read("one", nil)
require.NoError(t, err)
require.True(t, exists)
b = false
exists, err = db.Read("two", &b)
require.NoError(t, err)
require.False(t, exists)
require.False(t, b)
// nil means don't deserialize
exists, err = db.Read("two", nil)
require.NoError(t, err)
require.False(t, exists)
}
func TestMultiple(t *testing.T) {
dir, err := ioutil.TempDir("", "jsondb-test-")
require.NoError(t, err)