添加 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:
83
database.go
83
database.go
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user