1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-05-05 11:33:48 +08:00

fix: fix btree iterate for empty db

This commit is contained in:
wdvxdr 2022-01-30 15:50:02 +08:00
parent 6c7445772c
commit e8bf497022
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
2 changed files with 27 additions and 20 deletions

View File

@ -528,9 +528,11 @@ func (d *DB) Delete(hash *byte) error {
// Foreach iterates over all items in the database file. // Foreach iterates over all items in the database file.
func (d *DB) Foreach(iter func(key [16]byte, value []byte)) { func (d *DB) Foreach(iter func(key [16]byte, value []byte)) {
if d.top != 0 {
top := d.get(d.top) top := d.get(d.top)
d.iterate(top, iter) d.iterate(top, iter)
} }
}
func (d *DB) iterate(table *table, iter func(key [16]byte, value []byte)) { func (d *DB) iterate(table *table, iter func(key [16]byte, value []byte)) {
for i := 0; i < table.size; i++ { for i := 0; i < table.size; i++ {

View File

@ -27,7 +27,8 @@ func TestBtree(t *testing.T) {
f := tempfile(t) f := tempfile(t)
defer os.Remove(f) defer os.Remove(f)
bt, err := Create(f) bt, err := Create(f)
assert2.NoError(t, err) assert := assert2.New(t)
assert.NoError(err)
tests := []string{ tests := []string{
"hello world", "hello world",
@ -42,51 +43,55 @@ func TestBtree(t *testing.T) {
sha[i] = &hash.Sum(nil)[0] sha[i] = &hash.Sum(nil)[0]
bt.Insert(sha[i], []byte(tt)) bt.Insert(sha[i], []byte(tt))
} }
assert2.NoError(t, bt.Close()) assert.NoError(bt.Close())
bt, err = Open(f) bt, err = Open(f)
assert2.NoError(t, err) assert.NoError(err)
var ss []string var ss []string
bt.Foreach(func(key [16]byte, value []byte) { bt.Foreach(func(key [16]byte, value []byte) {
ss = append(ss, string(value)) ss = append(ss, string(value))
}) })
assert2.ElementsMatch(t, tests, ss) assert.ElementsMatch(tests, ss)
for i, tt := range tests { for i, tt := range tests {
assert2.Equal(t, []byte(tt), bt.Get(sha[i])) assert.Equal([]byte(tt), bt.Get(sha[i]))
} }
for i := range tests { for i := range tests {
assert2.NoError(t, bt.Delete(sha[i])) assert.NoError(bt.Delete(sha[i]))
} }
for i := range tests { for i := range tests {
assert2.Equal(t, []byte(nil), bt.Get(sha[i])) assert.Equal([]byte(nil), bt.Get(sha[i]))
}
assert.NoError(bt.Close())
} }
assert2.NoError(t, bt.Close()) func testForeach(t *testing.T, elemSize int) {
} expected := make([]string, elemSize)
func TestDB_Foreach(t *testing.T) {
const elemSize = 100
set := make([]string, elemSize)
for i := 0; i < elemSize; i++ { for i := 0; i < elemSize; i++ {
set[i] = utils.RandomString(20) expected[i] = utils.RandomString(20)
} }
f := tempfile(t) f := tempfile(t)
defer os.Remove(f) defer os.Remove(f)
bt, err := Create(f) bt, err := Create(f)
defer bt.Close() defer bt.Close()
assert2.NoError(t, err) assert2.NoError(t, err)
for _, v := range set { for _, v := range expected {
hash := sha1.New() hash := sha1.New()
hash.Write([]byte(v)) hash.Write([]byte(v))
bt.Insert(&hash.Sum(nil)[0], []byte(v)) bt.Insert(&hash.Sum(nil)[0], []byte(v))
} }
var got []string
var ss []string
bt.Foreach(func(key [16]byte, value []byte) { bt.Foreach(func(key [16]byte, value []byte) {
ss = append(ss, string(value)) got = append(got, string(value))
}) })
assert2.ElementsMatch(t, set, ss) assert2.ElementsMatch(t, expected, got)
}
func TestDB_Foreach(t *testing.T) {
elemSizes := []int{0, 5, 100, 200}
for _, size := range elemSizes {
testForeach(t, size)
}
} }