package main import ( "TsDB2/DB/core" "TsDB2/DB/core/page" "TsDB2/DB/core/types" "encoding/binary" "fmt" "os" ) func main() { os.RemoveAll("demo.db") db, err := core.Open("demo.db") if err != nil { fmt.Println("Open DB error:", err) return } defer db.Close() // 创建表 table, err := db.CreateTable("Ts", []types.FieldInfo{ {FieldType: types.FieldType_8byte, FieldName: []byte("TS")}, {FieldType: types.FieldType_32byte, FieldName: []byte("Name")}, {FieldType: types.FieldType_2byte, FieldName: []byte("Age")}, }) if err != nil { fmt.Println("CreateTable error:", err) return } fmt.Println("=== 表创建成功 ===") // 创建时序索引 _, err = table.CreateIndex("idx_Ts", page.IndexTypeTime, []byte{0}) if err != nil { fmt.Println("CreateIndex error:", err) return } fmt.Println("=== 索引创建成功 ===") // 插入数据 testData := []struct { ts uint64 name string age int16 }{ {1000, "Alice", 25}, {2000, "Bob", 30}, {3000, "Charlie", 28}, {4000, "Diana", 22}, {5000, "Eve", 35}, } fmt.Println("\n=== 插入数据 ===") for _, d := range testData { nameBytes := make([]byte, 32) copy(nameBytes, d.name) _, err := table.InsertRow([]types.FieldValue{ {FieldName: []byte("TS"), Value: d.ts}, {FieldName: []byte("Name"), Value: nameBytes}, {FieldName: []byte("Age"), Value: d.age}, }) if err != nil { fmt.Printf("InsertRow(%d, %s) error: %v\n", d.ts, d.name, err) } else { fmt.Printf("InsertRow(%d, %s, %d) OK\n", d.ts, d.name, d.age) } } // 查询数据 fmt.Println("\n=== 查询数据 ===") for _, d := range testData { key := make([]byte, 8) binary.BigEndian.PutUint64(key, d.ts) row, err := table.SearchByIndex("idx_Ts", key) if err != nil { fmt.Printf("Search(ts=%d) error: %v\n", d.ts, err) continue } fmt.Printf("Search(ts=%d) => ", d.ts) for _, fv := range row { fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value) } fmt.Println() } // 使用 Inserter API 插入 fmt.Println("\n=== 使用 Inserter API ===") nameBytes := make([]byte, 32) copy(nameBytes, "Frank") _, err = table.Insert(). Set("TS", uint64(6000), types.FieldType_8byte). Set("Name", nameBytes, types.FieldType_32byte). Set("Age", int16(40), types.FieldType_2byte). Exec() if err != nil { fmt.Println("Inserter.Exec error:", err) } else { fmt.Println("Inserter.Exec OK") } // 查询 Frank key := make([]byte, 8) binary.BigEndian.PutUint64(key, 6000) row, err := table.SearchByIndex("idx_Ts", key) if err != nil { fmt.Println("Search(Frank) error:", err) } else { fmt.Printf("Search(ts=6000) => ") for _, fv := range row { fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value) } fmt.Println() } // 删除数据 fmt.Println("\n=== 删除数据 ===") for _, ts := range []uint64{2000, 4000} { key := make([]byte, 8) binary.BigEndian.PutUint64(key, ts) err := table.DeleteRow("idx_Ts", key) if err != nil { fmt.Printf("Delete(ts=%d) error: %v\n", ts, err) } else { fmt.Printf("Delete(ts=%d) OK\n", ts) } } // 删除后再查询 fmt.Println("\n=== 删除后查询 ===") for _, d := range testData { key := make([]byte, 8) binary.BigEndian.PutUint64(key, d.ts) row, err := table.SearchByIndex("idx_Ts", key) if err != nil { fmt.Printf("Search(ts=%d) => 已删除或不存在\n", d.ts) } else { fmt.Printf("Search(ts=%d) => ", d.ts) for _, fv := range row { fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value) } fmt.Println() } } // 更新数据 fmt.Println("\n=== 更新数据 ===") // 把 ts=1000 的 Alice 改名为 "Alice_Update",年龄改为 26 updateName := make([]byte, 32) copy(updateName, "Alice_Update") key1000 := make([]byte, 8) binary.BigEndian.PutUint64(key1000, 1000) err = table.UpdateRow("idx_Ts", key1000, []types.FieldValue{ {FieldName: []byte("TS"), Value: uint64(1000)}, {FieldName: []byte("Name"), Value: updateName}, {FieldName: []byte("Age"), Value: int16(26)}, }) if err != nil { fmt.Printf("Update(ts=1000) error: %v\n", err) } else { fmt.Println("Update(ts=1000) OK") } // 更新后查询 fmt.Println("\n=== 更新后查询 ===") row, err = table.SearchByIndex("idx_Ts", key1000) if err != nil { fmt.Printf("Search(ts=1000) error: %v\n", err) } else { fmt.Printf("Search(ts=1000) => ") for _, fv := range row { fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value) } fmt.Println() } fmt.Println("\n=== 测试完成 ===") }