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}
|
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.
|
// false if a document with `name` does not exist.
|
||||||
func (db *JSONDatabase) Read(name string, document interface{}) (bool, error) {
|
func (db *JSONDatabase) Read(name string, document interface{}) (bool, error) {
|
||||||
f, err := os.Open(path.Join(db.dir, name+".json"))
|
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()
|
defer f.Close()
|
||||||
|
|
||||||
err = json.NewDecoder(f).Decode(&document)
|
if document != nil {
|
||||||
if err != nil {
|
err = json.NewDecoder(f).Decode(&document)
|
||||||
return false, fmt.Errorf("error reading db file %s: %v", name, err)
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("error reading db file %s: %v", name, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,39 @@ func TestCorrupt(t *testing.T) {
|
||||||
require.Error(t, err)
|
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) {
|
func TestMultiple(t *testing.T) {
|
||||||
dir, err := ioutil.TempDir("", "jsondb-test-")
|
dir, err := ioutil.TempDir("", "jsondb-test-")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue