main.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package main
  2. import (
  3. "git.ycl.pub/yl32940/TsDB2/DB/core"
  4. "git.ycl.pub/yl32940/TsDB2/DB/core/page"
  5. "git.ycl.pub/yl32940/TsDB2/DB/core/types"
  6. "encoding/binary"
  7. "fmt"
  8. "os"
  9. )
  10. func main() {
  11. os.RemoveAll("demo.db")
  12. db, err := core.Open("demo.db")
  13. if err != nil {
  14. fmt.Println("Open DB error:", err)
  15. return
  16. }
  17. defer db.Close()
  18. // 创建表
  19. table, err := db.CreateTable("Ts", []types.FieldInfo{
  20. {FieldType: types.FieldType_Uint64, FieldName: []byte("TS")},
  21. {FieldType: types.FieldType_String, Flag: types.WidthCodeFor(32), FieldName: []byte("Name")},
  22. {FieldType: types.FieldType_Uint16, FieldName: []byte("Age")},
  23. })
  24. if err != nil {
  25. fmt.Println("CreateTable error:", err)
  26. return
  27. }
  28. fmt.Println("=== 表创建成功 ===")
  29. // 创建时序索引
  30. _, err = table.CreateIndex("idx_Ts", page.IndexTypeTime, []byte{0})
  31. if err != nil {
  32. fmt.Println("CreateIndex error:", err)
  33. return
  34. }
  35. fmt.Println("=== 索引创建成功 ===")
  36. // 插入数据
  37. testData := []struct {
  38. ts uint64
  39. name string
  40. age int16
  41. }{
  42. {1000, "Alice", 25},
  43. {2000, "Bob", 30},
  44. {3000, "Charlie", 28},
  45. {4000, "Diana", 22},
  46. {5000, "Eve", 35},
  47. }
  48. fmt.Println("\n=== 插入数据 ===")
  49. for _, d := range testData {
  50. nameBytes := make([]byte, 32)
  51. copy(nameBytes, d.name)
  52. _, err := table.InsertRow([]types.FieldValue{
  53. {FieldName: []byte("TS"), Value: d.ts},
  54. {FieldName: []byte("Name"), Value: nameBytes},
  55. {FieldName: []byte("Age"), Value: d.age},
  56. })
  57. if err != nil {
  58. fmt.Printf("InsertRow(%d, %s) error: %v\n", d.ts, d.name, err)
  59. } else {
  60. fmt.Printf("InsertRow(%d, %s, %d) OK\n", d.ts, d.name, d.age)
  61. }
  62. }
  63. // 查询数据
  64. fmt.Println("\n=== 查询数据 ===")
  65. for _, d := range testData {
  66. key := make([]byte, 8)
  67. binary.BigEndian.PutUint64(key, d.ts)
  68. row, err := table.SearchByIndex("idx_Ts", key)
  69. if err != nil {
  70. fmt.Printf("Search(ts=%d) error: %v\n", d.ts, err)
  71. continue
  72. }
  73. fmt.Printf("Search(ts=%d) => ", d.ts)
  74. for _, fv := range row {
  75. fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value)
  76. }
  77. fmt.Println()
  78. }
  79. // 使用 Inserter API 插入
  80. fmt.Println("\n=== 使用 Inserter API ===")
  81. nameBytes := make([]byte, 32)
  82. copy(nameBytes, "Frank")
  83. _, err = table.Insert().
  84. Set("TS", uint64(6000), types.FieldType_Uint64).
  85. Set("Name", nameBytes, types.FieldType_String).
  86. Set("Age", int16(40), types.FieldType_Uint16).
  87. Exec()
  88. if err != nil {
  89. fmt.Println("Inserter.Exec error:", err)
  90. } else {
  91. fmt.Println("Inserter.Exec OK")
  92. }
  93. // 查询 Frank
  94. key := make([]byte, 8)
  95. binary.BigEndian.PutUint64(key, 6000)
  96. row, err := table.SearchByIndex("idx_Ts", key)
  97. if err != nil {
  98. fmt.Println("Search(Frank) error:", err)
  99. } else {
  100. fmt.Printf("Search(ts=6000) => ")
  101. for _, fv := range row {
  102. fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value)
  103. }
  104. fmt.Println()
  105. }
  106. // 删除数据
  107. fmt.Println("\n=== 删除数据 ===")
  108. for _, ts := range []uint64{2000, 4000} {
  109. key := make([]byte, 8)
  110. binary.BigEndian.PutUint64(key, ts)
  111. err := table.DeleteRow("idx_Ts", key)
  112. if err != nil {
  113. fmt.Printf("Delete(ts=%d) error: %v\n", ts, err)
  114. } else {
  115. fmt.Printf("Delete(ts=%d) OK\n", ts)
  116. }
  117. }
  118. // 删除后再查询
  119. fmt.Println("\n=== 删除后查询 ===")
  120. for _, d := range testData {
  121. key := make([]byte, 8)
  122. binary.BigEndian.PutUint64(key, d.ts)
  123. row, err := table.SearchByIndex("idx_Ts", key)
  124. if err != nil {
  125. fmt.Printf("Search(ts=%d) => 已删除或不存在\n", d.ts)
  126. } else {
  127. fmt.Printf("Search(ts=%d) => ", d.ts)
  128. for _, fv := range row {
  129. fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value)
  130. }
  131. fmt.Println()
  132. }
  133. }
  134. // 更新数据
  135. fmt.Println("\n=== 更新数据 ===")
  136. // 把 ts=1000 的 Alice 改名为 "Alice_Update",年龄改为 26
  137. updateName := make([]byte, 32)
  138. copy(updateName, "Alice_Update")
  139. key1000 := make([]byte, 8)
  140. binary.BigEndian.PutUint64(key1000, 1000)
  141. err = table.UpdateRow("idx_Ts", key1000, []types.FieldValue{
  142. {FieldName: []byte("TS"), Value: uint64(1000)},
  143. {FieldName: []byte("Name"), Value: updateName},
  144. {FieldName: []byte("Age"), Value: int16(26)},
  145. })
  146. if err != nil {
  147. fmt.Printf("Update(ts=1000) error: %v\n", err)
  148. } else {
  149. fmt.Println("Update(ts=1000) OK")
  150. }
  151. // 更新后查询
  152. fmt.Println("\n=== 更新后查询 ===")
  153. row, err = table.SearchByIndex("idx_Ts", key1000)
  154. if err != nil {
  155. fmt.Printf("Search(ts=1000) error: %v\n", err)
  156. } else {
  157. fmt.Printf("Search(ts=1000) => ")
  158. for _, fv := range row {
  159. fmt.Printf("%s=%v ", string(fv.FieldName), fv.Value)
  160. }
  161. fmt.Println()
  162. }
  163. fmt.Println("\n=== 测试完成 ===")
  164. }