Files
srdb/table.go
bourdon 9175b98202 添加 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 测试
2025-10-09 01:03:22 +08:00

155 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package srdb
import (
"os"
"path/filepath"
"time"
)
// Table 表
type Table struct {
name string // 表名
dir string // 表目录
schema *Schema // Schema
engine *Engine // Engine 实例
createdAt int64 // 创建时间
}
// createTable 创建新表
func createTable(name string, schema *Schema, db *Database) (*Table, error) {
// 创建表目录
tableDir := filepath.Join(db.dir, name)
err := os.MkdirAll(tableDir, 0755)
if err != nil {
os.RemoveAll(tableDir)
return nil, err
}
// 创建 EngineEngine 会自动保存 Schema 到文件)
engine, err := OpenEngine(&EngineOptions{
Dir: tableDir,
MemTableSize: DefaultMemTableSize,
Schema: schema,
})
if err != nil {
os.RemoveAll(tableDir)
return nil, err
}
table := &Table{
name: name,
dir: tableDir,
schema: schema,
engine: engine,
createdAt: time.Now().Unix(),
}
return table, nil
}
// openTable 打开已存在的表
func openTable(name string, db *Database) (*Table, error) {
tableDir := filepath.Join(db.dir, name)
// 打开 EngineEngine 会自动从 schema.json 恢复 Schema
eng, err := OpenEngine(&EngineOptions{
Dir: tableDir,
MemTableSize: DefaultMemTableSize,
// Schema 不设置,让 Engine 自动从磁盘恢复
})
if err != nil {
return nil, err
}
// 从 Engine 获取 Schema
sch := eng.GetSchema()
table := &Table{
name: name,
dir: tableDir,
schema: sch,
engine: eng,
}
return table, nil
}
// GetName 获取表名
func (t *Table) GetName() string {
return t.name
}
// GetSchema 获取 Schema
func (t *Table) GetSchema() *Schema {
return t.schema
}
// Insert 插入数据
func (t *Table) Insert(data map[string]any) error {
return t.engine.Insert(data)
}
// Get 查询数据
func (t *Table) Get(seq int64) (*SSTableRow, error) {
return t.engine.Get(seq)
}
// Query 创建查询构建器
func (t *Table) Query() *QueryBuilder {
return t.engine.Query()
}
// CreateIndex 创建索引
func (t *Table) CreateIndex(field string) error {
return t.engine.CreateIndex(field)
}
// DropIndex 删除索引
func (t *Table) DropIndex(field string) error {
return t.engine.DropIndex(field)
}
// ListIndexes 列出所有索引
func (t *Table) ListIndexes() []string {
return t.engine.ListIndexes()
}
// Stats 获取统计信息
func (t *Table) Stats() *TableStats {
return t.engine.Stats()
}
// GetEngine 获取底层 Engine
func (t *Table) GetEngine() *Engine {
return t.engine
}
// Close 关闭表
func (t *Table) Close() error {
if t.engine != nil {
return t.engine.Close()
}
return nil
}
// GetCreatedAt 获取表创建时间
func (t *Table) GetCreatedAt() int64 {
return t.createdAt
}
// Clean 清除表的所有数据(保留表结构和 Table 可用)
func (t *Table) Clean() error {
if t.engine != nil {
return t.engine.Clean()
}
return nil
}
// Destroy 销毁表并删除所有数据文件(不从 Database 中删除)
func (t *Table) Destroy() error {
if t.engine != nil {
return t.engine.Destroy()
}
return nil
}