diff --git a/internal/jsondb/db.go b/internal/jsondb/db.go index 6551f4ed1..10cef85c1 100644 --- a/internal/jsondb/db.go +++ b/internal/jsondb/db.go @@ -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 diff --git a/internal/jsondb/db_test.go b/internal/jsondb/db_test.go index 70dbbd0bc..c18b45949 100644 --- a/internal/jsondb/db_test.go +++ b/internal/jsondb/db_test.go @@ -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)