Initial commit: SRDB - High-performance LSM-Tree database

- Core engine with MemTable, SST, WAL
- B+Tree indexing for SST files  
- Leveled compaction strategy
- Multi-table database management
- Schema validation and secondary indexes
- Query builder with complex conditions
- Web UI with HTMX for data visualization
- Command-line tools for diagnostics
This commit is contained in:
2025-10-08 06:38:12 +08:00
commit ae87c38776
61 changed files with 15475 additions and 0 deletions

254
examples/webui/README.md Normal file
View File

@@ -0,0 +1,254 @@
# SRDB Web UI Example
这个示例展示了如何使用 SRDB 的内置 Web UI 来可视化查看数据库中的表和数据。
## 功能特性
- 📊 **表列表展示** - 左侧显示所有表及其行数
- 🔍 **Schema 查看** - 点击箭头展开查看表的字段定义
- 📋 **数据分页浏览** - 右侧以表格形式展示数据,支持分页
- 🎨 **响应式设计** - 现代化的界面设计
-**零构建** - 使用 HTMX 从 CDN 加载,无需构建步骤
- 💾 **大数据优化** - 自动截断显示,悬停查看,点击弹窗查看完整内容
- 📏 **数据大小显示** - 超过 1KB 的单元格自动显示大小标签
- 🔄 **后台数据插入** - 自动生成 2KB~512KB 的测试数据(每秒一条)
## 运行示例
```bash
# 进入示例目录
cd examples/webui
# 运行
go run main.go
```
程序会:
1. 创建/打开数据库目录 `./data`
2. 创建三个示例表:`users``products``logs`
3. 插入初始示例数据
4. **启动后台协程** - 每秒向 `logs` 表插入一条 2KB~512KB 的随机数据
5. 启动 Web 服务器在 `http://localhost:8080`
## 使用界面
打开浏览器访问 `http://localhost:8080`,你将看到:
### 左侧边栏
- 显示所有表的列表
- 显示每个表的字段数量
- 点击 ▶ 图标展开查看字段信息
- 点击表名选择要查看的表(蓝色高亮显示当前选中)
### 右侧主区域
- **Schema 区域**:显示表结构和字段定义
- **Data 区域**:以表格形式显示数据
- 支持分页浏览(每页 20 条)
- 显示系统字段_seq, _time和用户字段
- **自动截断长数据**:超过 400px 的内容显示省略号
- **鼠标悬停**:悬停在单元格上查看完整内容
- **点击查看**:点击单元格在弹窗中查看完整内容
- **大小指示**:超过 1KB 的数据显示大小标签
### 大数据查看
1. **表格截断**:单元格最大宽度 400px超长显示 `...`
2. **悬停展开**:鼠标悬停自动展开,黄色背景高亮
3. **模态框**:点击单元格弹出窗口
- 等宽字体显示(适合查看十六进制数据)
- 显示数据大小
- 支持滚动查看超长内容
## API 端点
Web UI 提供了以下 HTTP API
### 获取所有表
```
GET /api/tables
```
返回示例:
```json
[
{
"name": "users",
"rowCount": 5,
"dir": "./data/users"
}
]
```
### 获取表的 Schema
```
GET /api/tables/{name}/schema
```
返回示例:
```json
{
"fields": [
{"name": "name", "type": "string", "required": true},
{"name": "email", "type": "string", "required": true},
{"name": "age", "type": "int", "required": false}
]
}
```
### 获取表数据(分页)
```
GET /api/tables/{name}/data?page=1&pageSize=20
```
参数:
- `page` - 页码,从 1 开始默认1
- `pageSize` - 每页行数,最大 100默认20
返回示例:
```json
{
"page": 1,
"pageSize": 20,
"totalRows": 5,
"totalPages": 1,
"rows": [
{
"_seq": 1,
"_time": 1234567890,
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
]
}
```
### 获取表基本信息
```
GET /api/tables/{name}
```
## 在你的应用中使用
你可以在自己的应用中轻松集成 Web UI
```go
package main
import (
"net/http"
"code.tczkiot.com/srdb"
)
func main() {
// 打开数据库
db, _ := database.Open("./mydb")
defer db.Close()
// 获取 HTTP Handler
handler := db.WebUI()
// 启动服务器
http.ListenAndServe(":8080", handler)
}
```
或者将其作为现有 Web 应用的一部分:
```go
mux := http.NewServeMux()
// 你的其他路由
mux.HandleFunc("/api/myapp", myHandler)
// 挂载 SRDB Web UI 到 /admin/db 路径
mux.Handle("/admin/db/", http.StripPrefix("/admin/db", db.WebUI()))
http.ListenAndServe(":8080", mux)
```
## 技术栈
- **后端**: Go + 标准库 `net/http`
- **前端**: [HTMX](https://htmx.org/) + 原生 JavaScript + CSS
- **渲染**: 服务端 HTML 渲染Go 模板生成)
- **字体**: Google Fonts (Inter)
- **无构建**: 直接从 CDN 加载 HTMX无需 npm、webpack 等工具
- **部署**: 所有静态资源通过 `embed.FS` 嵌入到二进制文件中
## 测试大数据
### logs 表自动生成
程序会在后台持续向 `logs` 表插入大数据:
- **频率**:每秒一条
- **大小**2KB ~ 512KB 随机
- **格式**:十六进制字符串
- **字段**
- `timestamp` - 插入时间
- `data` - 随机数据(十六进制)
- `size_bytes` - 数据大小(字节)
你可以选择 `logs` 表来测试大数据的显示效果:
1. 单元格会显示数据大小标签(如 `245.12 KB`
2. 内容被自动截断,显示省略号
3. 点击单元格在弹窗中查看完整数据
终端会实时输出插入日志:
```
Inserted record #1, size: 245.12 KB
Inserted record #2, size: 128.50 KB
Inserted record #3, size: 487.23 KB
```
## 注意事项
- Web UI 是只读的,不提供数据修改功能
- 适合用于开发、调试和数据查看
- 生产环境建议添加身份验证和访问控制
- 大数据量表的分页查询性能取决于数据分布
- `logs` 表会持续增长,可手动删除 `./data/logs` 目录重置
## Compaction 状态
由于后台持续插入大数据,会产生大量 SST 文件。SRDB 会自动运行 compaction 合并这些文件。
### 检查 Compaction 状态
```bash
# 查看 SST 文件分布
./check_sst.sh
# 观察 webui 日志中的 [Compaction] 信息
```
### Compaction 改进
- **触发阈值**: L0 文件数量 ≥2 就触发(之前是 4
- **运行频率**: 每 10 秒自动检查
- **日志增强**: 显示详细的 compaction 状态和统计
详细说明请查看 [COMPACTION.md](./COMPACTION.md)
## 常见问题
### `invalid header` 错误
如果看到类似错误:
```
failed to open table logs: invalid header
```
**快速修复**
```bash
./fix_corrupted_table.sh logs
```
详见:[QUICK_FIX.md](./QUICK_FIX.md) 或 [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
## 更多信息
- [FEATURES.md](./FEATURES.md) - 详细功能说明
- [COMPACTION.md](./COMPACTION.md) - Compaction 机制和诊断
- [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) - 故障排除指南
- [QUICK_FIX.md](./QUICK_FIX.md) - 快速修复常见错误