主要改动: - 重构目录结构:合并子目录到根目录,简化项目结构 - 添加完整的查询 API:支持复杂条件查询、字段选择、游标模式 - 实现 LSM-Tree Compaction:7层结构、Score-based策略、后台异步合并 - 添加 Web UI:基于 Lit 的现代化管理界面,支持数据浏览和 Manifest 查看 - 完善文档:添加 README.md 和 examples/webui/README.md 新增功能: - Query Builder:链式查询 API,支持 Eq/Lt/Gt/In/Between/Contains 等操作符 - Web UI 组件:srdb-app、srdb-table-list、srdb-data-view、srdb-manifest-view 等 - 列选择持久化:自动保存到 localStorage - 刷新按钮:一键刷新当前视图 - 主题切换:深色/浅色主题支持 代码优化: - 使用 Go 1.24 新特性:range 7、min()、maps.Copy()、slices.Sort() - 统一组件命名:所有 Web Components 使用 srdb-* 前缀 - CSS 优化:提取共享样式,减少重复代码 - 清理遗留代码:删除未使用的方法和样式
76 lines
1.8 KiB
Go
76 lines
1.8 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"code.tczkiot.com/srdb"
|
|
)
|
|
|
|
// InspectSST 检查特定 SST 文件
|
|
func InspectSST(sstPath string) {
|
|
// Check if file exists
|
|
info, err := os.Stat(sstPath)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf("File: %s\n", sstPath)
|
|
fmt.Printf("Size: %d bytes\n", info.Size())
|
|
|
|
// Open reader
|
|
reader, err := srdb.NewSSTableReader(sstPath)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer reader.Close()
|
|
|
|
// Get header
|
|
header := reader.GetHeader()
|
|
fmt.Printf("\nHeader:\n")
|
|
fmt.Printf(" RowCount: %d\n", header.RowCount)
|
|
fmt.Printf(" MinKey: %d\n", header.MinKey)
|
|
fmt.Printf(" MaxKey: %d\n", header.MaxKey)
|
|
fmt.Printf(" DataSize: %d bytes\n", header.DataSize)
|
|
|
|
// Get all keys using GetAllKeys()
|
|
allKeys := reader.GetAllKeys()
|
|
fmt.Printf("\nActual keys in file: %d keys\n", len(allKeys))
|
|
if len(allKeys) > 0 {
|
|
fmt.Printf(" First key: %d\n", allKeys[0])
|
|
fmt.Printf(" Last key: %d\n", allKeys[len(allKeys)-1])
|
|
|
|
if len(allKeys) <= 30 {
|
|
fmt.Printf(" All keys: %v\n", allKeys)
|
|
} else {
|
|
fmt.Printf(" First 15: %v\n", allKeys[:15])
|
|
fmt.Printf(" Last 15: %v\n", allKeys[len(allKeys)-15:])
|
|
}
|
|
}
|
|
|
|
// Try to get a specific key
|
|
fmt.Printf("\nTrying to get key 332:\n")
|
|
row, err := reader.Get(332)
|
|
if err != nil {
|
|
fmt.Printf(" Error: %v\n", err)
|
|
} else if row == nil {
|
|
fmt.Printf(" NULL\n")
|
|
} else {
|
|
fmt.Printf(" FOUND: seq=%d, time=%d\n", row.Seq, row.Time)
|
|
}
|
|
|
|
// Try to get key based on actual first key
|
|
if len(allKeys) > 0 {
|
|
firstKey := allKeys[0]
|
|
fmt.Printf("\nTrying to get actual first key %d:\n", firstKey)
|
|
row, err := reader.Get(firstKey)
|
|
if err != nil {
|
|
fmt.Printf(" Error: %v\n", err)
|
|
} else if row == nil {
|
|
fmt.Printf(" NULL\n")
|
|
} else {
|
|
fmt.Printf(" FOUND: seq=%d, time=%d\n", row.Seq, row.Time)
|
|
}
|
|
}
|
|
}
|