| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- package main
- import (
- "git.ycl.pub/yl32940/TsDB2/DB/core"
- "git.ycl.pub/yl32940/TsDB2/DB/core/page"
- "git.ycl.pub/yl32940/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_Uint64, FieldName: []byte("TS")},
- {FieldType: types.FieldType_String, Flag: types.WidthCodeFor(32), FieldName: []byte("Name")},
- {FieldType: types.FieldType_Uint16, 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_Uint64).
- Set("Name", nameBytes, types.FieldType_String).
- Set("Age", int16(40), types.FieldType_Uint16).
- 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=== 测试完成 ===")
- }
|