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:
parent
6c7445772c
commit
e8bf497022
@ -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++ {
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user