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:
parent
e599a95067
commit
7592e38d3d
2 changed files with 40 additions and 4 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue