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

98
sst/encoding.go Normal file
View File

@@ -0,0 +1,98 @@
package sst
import (
"bytes"
"encoding/binary"
"encoding/json"
"fmt"
)
// 二进制编码格式:
// [Magic: 4 bytes][Seq: 8 bytes][Time: 8 bytes][DataLen: 4 bytes][Data: variable]
const (
RowMagic = 0x524F5733 // "ROW3"
)
// encodeRowBinary 使用二进制格式编码行数据
func encodeRowBinary(row *Row) ([]byte, error) {
buf := new(bytes.Buffer)
// 写入 Magic Number (用于验证)
if err := binary.Write(buf, binary.LittleEndian, uint32(RowMagic)); err != nil {
return nil, err
}
// 写入 Seq
if err := binary.Write(buf, binary.LittleEndian, row.Seq); err != nil {
return nil, err
}
// 写入 Time
if err := binary.Write(buf, binary.LittleEndian, row.Time); err != nil {
return nil, err
}
// 序列化用户数据 (仍使用 JSON但只序列化用户数据部分)
dataBytes, err := json.Marshal(row.Data)
if err != nil {
return nil, err
}
// 写入数据长度
if err := binary.Write(buf, binary.LittleEndian, uint32(len(dataBytes))); err != nil {
return nil, err
}
// 写入数据
if _, err := buf.Write(dataBytes); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
// decodeRowBinary 解码二进制格式的行数据
func decodeRowBinary(data []byte) (*Row, error) {
buf := bytes.NewReader(data)
// 读取并验证 Magic Number
var magic uint32
if err := binary.Read(buf, binary.LittleEndian, &magic); err != nil {
return nil, err
}
if magic != RowMagic {
return nil, fmt.Errorf("invalid row magic: %x", magic)
}
row := &Row{}
// 读取 Seq
if err := binary.Read(buf, binary.LittleEndian, &row.Seq); err != nil {
return nil, err
}
// 读取 Time
if err := binary.Read(buf, binary.LittleEndian, &row.Time); err != nil {
return nil, err
}
// 读取数据长度
var dataLen uint32
if err := binary.Read(buf, binary.LittleEndian, &dataLen); err != nil {
return nil, err
}
// 读取数据
dataBytes := make([]byte, dataLen)
if _, err := buf.Read(dataBytes); err != nil {
return nil, err
}
// 反序列化用户数据
if err := json.Unmarshal(dataBytes, &row.Data); err != nil {
return nil, err
}
return row, nil
}