主要改动: - 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 测试
155 lines
3.0 KiB
Go
155 lines
3.0 KiB
Go
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
|
||
}
|
||
|
||
// 创建 Engine(Engine 会自动保存 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)
|
||
|
||
// 打开 Engine(Engine 会自动从 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
|
||
}
|