添加 Clean 和 Destroy 功能

主要改动:
- Engine: 添加 Clean() 和 Destroy() 方法
- Table: 添加 Clean() 和 Destroy() 方法(不持有 Database 引用)
- Database: 添加 Clean()、CleanTable()、DestroyTable()、Destroy() 方法
- 自动 flush: 添加长时间无写入自动 flush 策略(默认 30 秒)
- WebUI 优化: 优化分页查询性能

新增功能:
- Clean(): 清除数据但保留结构,Engine/Table/Database 仍可用
- Destroy(): 销毁并删除所有文件,对象不可用
- CleanTable(name): 清除指定表的数据
- DestroyTable(name): 销毁指定表并从 Database 中删除
- 自动 flush 监控: 后台定期检查,空闲时自动持久化

代码优化:
- Engine.Close(): 支持 Destroy 后调用,不会 panic
- 二级索引持久化: 在 flush 时自动持久化索引
- WebUI 分页: 预构建字段类型 map,减少 Schema 查询
- 职责分离: Table 不再持有 Database 引用

测试覆盖:
- engine_clean_test.go: Engine Clean/Destroy 测试
- table_clean_test.go: Table Clean/Destroy 测试
- database_clean_test.go: Database Clean/Destroy 测试
- database_table_ops_test.go: Database CleanTable/DestroyTable 测试
This commit is contained in:
2025-10-09 01:03:22 +08:00
parent 23843493b8
commit 9175b98202
8 changed files with 1413 additions and 123 deletions

View File

@@ -254,3 +254,86 @@ func (db *Database) GetAllTablesInfo() map[string]*Table {
maps.Copy(result, db.tables)
return result
}
// CleanTable 清除指定表的数据(保留表结构)
func (db *Database) CleanTable(name string) error {
db.mu.RLock()
table, exists := db.tables[name]
db.mu.RUnlock()
if !exists {
return fmt.Errorf("table %s does not exist", name)
}
return table.Clean()
}
// DestroyTable 销毁指定表并从 Database 中删除
func (db *Database) DestroyTable(name string) error {
db.mu.Lock()
defer db.mu.Unlock()
table, exists := db.tables[name]
if !exists {
return fmt.Errorf("table %s does not exist", name)
}
// 1. 销毁表(删除文件)
if err := table.Destroy(); err != nil {
return fmt.Errorf("destroy table: %w", err)
}
// 2. 从内存中删除
delete(db.tables, name)
// 3. 从元数据中删除
newTables := make([]TableInfo, 0, len(db.metadata.Tables)-1)
for _, info := range db.metadata.Tables {
if info.Name != name {
newTables = append(newTables, info)
}
}
db.metadata.Tables = newTables
// 4. 保存元数据
return db.saveMetadata()
}
// Clean 清除所有表的数据(保留表结构和 Database 可用)
func (db *Database) Clean() error {
db.mu.Lock()
defer db.mu.Unlock()
// 清除所有表的数据
for name, table := range db.tables {
if err := table.Clean(); err != nil {
return fmt.Errorf("clean table %s: %w", name, err)
}
}
return nil
}
// Destroy 销毁整个数据库并删除所有数据文件
func (db *Database) Destroy() error {
db.mu.Lock()
defer db.mu.Unlock()
// 1. 关闭所有表
for _, table := range db.tables {
if err := table.Close(); err != nil {
return fmt.Errorf("close table: %w", err)
}
}
// 2. 删除整个数据库目录
if err := os.RemoveAll(db.dir); err != nil {
return fmt.Errorf("remove database directory: %w", err)
}
// 3. 清空内存中的表
db.tables = make(map[string]*Table)
db.metadata.Tables = nil
return nil
}