Files
srdb/table.go

155 lines
3.0 KiB
Go
Raw Normal View History

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
}