Nil bytes are OK for Get/Set etc

And s/Release/Close/g
This commit is contained in:
Jae Kwon
2017-12-19 20:33:34 -08:00
parent 4ce8448d7f
commit ca56a274bd
3 changed files with 19 additions and 18 deletions

View File

@ -21,27 +21,27 @@ func testBackendGetSetDelete(t *testing.T, backend string) {
defer dir.Close() defer dir.Close()
db := NewDB("testdb", backend, dirname) db := NewDB("testdb", backend, dirname)
// A nonexistent key should return nil, even if the key is empty. // A nonexistent key should return nil, even if the key is empty
require.Nil(t, db.Get([]byte(""))) require.Nil(t, db.Get([]byte("")))
// A nonexistent key should return nil, even if the key is nil. // A nonexistent key should return nil, even if the key is nil
require.Nil(t, db.Get(nil)) require.Nil(t, db.Get(nil))
// A nonexistent key should return nil. // A nonexistent key should return nil.
key := []byte("abc") key := []byte("abc")
require.Nil(t, db.Get(key)) require.Nil(t, db.Get(key))
// Set empty ("") // Set empty value.
db.Set(key, []byte("")) db.Set(key, []byte(""))
require.NotNil(t, db.Get(key)) require.NotNil(t, db.Get(key))
require.Empty(t, db.Get(key)) require.Empty(t, db.Get(key))
// Set empty (nil) // Set nil value.
db.Set(key, nil) db.Set(key, nil)
require.NotNil(t, db.Get(key)) require.NotNil(t, db.Get(key))
require.Empty(t, db.Get(key)) require.Empty(t, db.Get(key))
// Delete // Delete.
db.Delete(key) db.Delete(key)
require.Nil(t, db.Get(key)) require.Nil(t, db.Get(key))
} }
@ -62,12 +62,13 @@ func withDB(t *testing.T, creator dbCreator, fn func(DB)) {
} }
func TestBackendsNilKeys(t *testing.T) { func TestBackendsNilKeys(t *testing.T) {
// test all backends.
// nil keys are treated as the empty key for most operations. // Test all backends.
for dbType, creator := range backends { for dbType, creator := range backends {
withDB(t, creator, func(db DB) { withDB(t, creator, func(db DB) {
t.Run(fmt.Sprintf("Testing %s", dbType), func(t *testing.T) { t.Run(fmt.Sprintf("Testing %s", dbType), func(t *testing.T) {
// Nil keys are treated as the empty key for most operations.
expect := func(key, value []byte) { expect := func(key, value []byte) {
if len(key) == 0 { // nil or empty if len(key) == 0 { // nil or empty
assert.Equal(t, db.Get(nil), db.Get([]byte(""))) assert.Equal(t, db.Get(nil), db.Get([]byte("")))

View File

@ -199,12 +199,12 @@ func newCLevelDBIterator(source *levigo.Iterator, start, end []byte, isReverse b
} }
} }
func (itr *cLevelDBIterator) Domain() ([]byte, []byte) { func (itr cLevelDBIterator) Domain() ([]byte, []byte) {
return itr.start, itr.end return itr.start, itr.end
} }
func (itr *cLevelDBIterator) Valid() bool { func (itr cLevelDBIterator) Valid() bool {
// Once invalid, forever invalid. // Once invalid, forever invalid.
if itr.isInvalid { if itr.isInvalid {
return false return false
@ -227,33 +227,33 @@ func (itr *cLevelDBIterator) Valid() bool {
return false return false
} }
// Valid // It's valid.
return true return true
} }
func (itr *cLevelDBIterator) Key() []byte { func (itr cLevelDBIterator) Key() []byte {
itr.assertNoError() itr.assertNoError()
itr.assertIsValid() itr.assertIsValid()
return itr.source.Key() return itr.source.Key()
} }
func (itr *cLevelDBIterator) Value() []byte { func (itr cLevelDBIterator) Value() []byte {
itr.assertNoError() itr.assertNoError()
itr.assertIsValid() itr.assertIsValid()
return itr.source.Value() return itr.source.Value()
} }
func (itr *cLevelDBIterator) Next() { func (itr cLevelDBIterator) Next() {
itr.assertNoError() itr.assertNoError()
itr.assertIsValid() itr.assertIsValid()
itr.source.Next() itr.source.Next()
} }
func (itr *cLevelDBIterator) Close() { func (itr cLevelDBIterator) Close() {
itr.source.Close() itr.source.Close()
} }
func (itr *cLevelDBIterator) assertNoError() { func (itr cLevelDBIterator) assertNoError() {
if err := itr.source.GetError(); err != nil { if err := itr.source.GetError(); err != nil {
panic(err) panic(err)
} }

View File

@ -30,7 +30,7 @@ func (db *MemDB) Get(key []byte) []byte {
db.mtx.Lock() db.mtx.Lock()
defer db.mtx.Unlock() defer db.mtx.Unlock()
key = nonNilBytes(key) key = nonNilBytes(key)
return db.db[string(key)] return db.db[string(key)]
} }
@ -215,4 +215,4 @@ func (itr *memDBIterator) assertIsValid() {
if !itr.Valid() { if !itr.Valid() {
panic("memDBIterator is invalid") panic("memDBIterator is invalid")
} }
} }