diff --git a/internal/btree/btree.go b/internal/btree/btree.go index 2f7dc18..ccbdb00 100644 --- a/internal/btree/btree.go +++ b/internal/btree/btree.go @@ -498,6 +498,27 @@ func (d *DB) Get(hash *byte) []byte { } // Delete remove item with the given key 'hash' from the database file. -func (d *DB) Delete(sha1 *byte) error { - return errors.New("impl me") +func (d *DB) Delete(hash *byte) error { + var h [hashSize]byte + copyhash(&h[0], hash) + + off := d.delete(d.top, &h[0]) + if off == 0 { + return nil // not found key + } + + d.top = collapse(d, d.top) + freeQueued(d) + d.flushSuper() + + d.fd.Seek(off, io.SeekStart) + length, err := read32(d.fd) // len: 0 + if err != nil { + return errors.Wrap(err, "btree I/O error") + } + + d.freeChunk(off, int(length+4)) + freeQueued(d) + d.flushSuper() + return nil } diff --git a/internal/btree/btree_test.go b/internal/btree/btree_test.go index 65b28a1..5afc4ae 100644 --- a/internal/btree/btree_test.go +++ b/internal/btree/btree_test.go @@ -9,7 +9,7 @@ import ( ) func tempfile(t *testing.T) string { - temp, err := os.CreateTemp("", "temp.*.db") + temp, err := os.CreateTemp(".", "temp.*.db") assert2.NoError(t, temp.Close()) assert2.NoError(t, err) return temp.Name() @@ -48,9 +48,14 @@ func TestBtree(t *testing.T) { for i, tt := range tests { assert2.Equal(t, []byte(tt), bt.Get(sha[i])) } + + for i := range tests { + assert2.NoError(t, bt.Delete(sha[i])) + } + + for i := range tests { + assert2.Equal(t, []byte(nil), bt.Get(sha[i])) + } + assert2.NoError(t, bt.Close()) } - -func TestOpen(t *testing.T) { - println(tableSize) -} diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 31c8027..d4f4e7f 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -50,6 +50,16 @@ func (c *Cache) Get(md5 []byte) []byte { return c.db.Get(&hash[0]) } +// Delete 删除指定缓存 +func (c *Cache) Delete(md5 []byte) { + c.lock.Lock() + defer c.lock.Unlock() + + var hash [16]byte + copy(hash[:], md5) + _ = c.db.Delete(&hash[0]) +} + // Init 初始化 Cache func Init() { node, ok := base.Database["cache"]