Table.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package DB
  2. import (
  3. "TsDB2/DB/core"
  4. "TsDB2/DB/core/types"
  5. "encoding/binary"
  6. "fmt"
  7. )
  8. // Table 泛型表封装
  9. type Table[T any] struct {
  10. coreTable *core.Table
  11. model *ModelInfo
  12. name string // 表名
  13. activeColumns map[string]bool // 当前 DB schema 活跃列集合
  14. }
  15. // refreshActiveColumns 从 core table 刷新活跃列集合
  16. func (t *Table[T]) refreshActiveColumns() {
  17. t.activeColumns = make(map[string]bool)
  18. for _, name := range t.coreTable.GetActiveFieldNames() {
  19. t.activeColumns[name] = true
  20. }
  21. }
  22. // SchemaColumns 返回当前 DB 中的所有活跃列名
  23. func (t *Table[T]) SchemaColumns() []string {
  24. names := make([]string, 0, len(t.activeColumns))
  25. for name := range t.activeColumns {
  26. names = append(names, name)
  27. }
  28. return names
  29. }
  30. // Insert 插入一条记录
  31. func (t *Table[T]) Insert(obj *T) error {
  32. // 如果主键在结构体中且值为 0,预分配 pkID (与 core 的 TotalRows+1 保持一致)
  33. if t.model.PKInStruct && getPKValue(obj, t.model) == 0 {
  34. nextPK := t.coreTable.TotalRows() + 1
  35. setPKValue(obj, t.model, nextPK)
  36. }
  37. fvs, err := structToFieldValues(obj, t.model, t.activeColumns)
  38. if err != nil {
  39. return fmt.Errorf("tsdb: insert: %w", err)
  40. }
  41. _, err = t.coreTable.InsertRow(fvs)
  42. if err != nil {
  43. return fmt.Errorf("tsdb: insert: %w", err)
  44. }
  45. return nil
  46. }
  47. // BatchInsert 批量插入
  48. func (t *Table[T]) BatchInsert(objs []*T) error {
  49. for _, obj := range objs {
  50. if err := t.Insert(obj); err != nil {
  51. return err
  52. }
  53. }
  54. return nil
  55. }
  56. // Update 按主键更新一条记录
  57. func (t *Table[T]) Update(obj *T) error {
  58. pk := getPKValue(obj, t.model)
  59. if pk == 0 {
  60. return fmt.Errorf("tsdb: update: primary key is 0")
  61. }
  62. fvs, err := structToFieldValues(obj, t.model, t.activeColumns)
  63. if err != nil {
  64. return fmt.Errorf("tsdb: update: %w", err)
  65. }
  66. return t.coreTable.UpdateRow(t.pkIndexName(), encodePKKey(pk), fvs)
  67. }
  68. // Delete 按主键删除一条记录
  69. func (t *Table[T]) Delete(id uint64) error {
  70. return t.coreTable.DeleteRow(t.pkIndexName(), encodePKKey(id))
  71. }
  72. // Find 按主键查找一条记录
  73. func (t *Table[T]) Find(id uint64) (*T, error) {
  74. row, err := t.coreTable.SearchByIndex(t.pkIndexName(), encodePKKey(id))
  75. if err != nil {
  76. return nil, err
  77. }
  78. obj := new(T)
  79. if err := fieldValuesToStruct(row, t.model, obj); err != nil {
  80. return nil, err
  81. }
  82. return obj, nil
  83. }
  84. // FindAll 返回所有记录
  85. func (t *Table[T]) FindAll() ([]*T, error) {
  86. return t.Query().Find()
  87. }
  88. // Count 返回总行数
  89. func (t *Table[T]) Count() (int64, error) {
  90. return t.coreTable.Query().Count()
  91. }
  92. // Select 流式遍历所有记录
  93. func (t *Table[T]) Select(callback func(*T) bool) error {
  94. return t.coreTable.Query().Scan(func(row []types.FieldValue) bool {
  95. obj := new(T)
  96. if err := fieldValuesToStruct(row, t.model, obj); err != nil {
  97. return true
  98. }
  99. return callback(obj)
  100. })
  101. }
  102. // Where 开始条件查询
  103. func (t *Table[T]) Where(field string, op string, value interface{}) *Query[T] {
  104. q := &Query[T]{table: t}
  105. q.addWhere(field, op, value)
  106. return q
  107. }
  108. // OrderBy 排序
  109. func (t *Table[T]) OrderBy(field string, desc ...bool) *Query[T] {
  110. q := &Query[T]{table: t}
  111. q.OrderBy(field, desc...)
  112. return q
  113. }
  114. // Limit 限制返回行数
  115. func (t *Table[T]) Limit(n int) *Query[T] {
  116. q := &Query[T]{table: t}
  117. q.Limit(n)
  118. return q
  119. }
  120. // Offset 跳过行数
  121. func (t *Table[T]) Offset(n int) *Query[T] {
  122. q := &Query[T]{table: t}
  123. q.Offset(n)
  124. return q
  125. }
  126. // Query 创建一个新的查询构建器
  127. func (t *Table[T]) Query() *Query[T] {
  128. return &Query[T]{table: t}
  129. }
  130. func (t *Table[T]) pkIndexName() string {
  131. return "pk_" + t.name
  132. }
  133. func encodePKKey(pk uint64) []byte {
  134. buf := make([]byte, 8)
  135. binary.BigEndian.PutUint64(buf, pk)
  136. return buf
  137. }