tableinfo.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package schema
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // 对应 sqlite 中存储的 tableinfo 内部结构
  7. const TableInfoVersion = "1.0"
  8. // 表定义信息
  9. type TableDefine struct {
  10. TableName string
  11. Fields Fields
  12. Indexes map[string][]string
  13. Ttl time.Duration
  14. }
  15. // 表结构信息,对表定义信息的扩展
  16. type TableInfo struct {
  17. *TableDefine
  18. MapNameFields map[string]*Field
  19. FieldNames []string
  20. FieldTypes []string
  21. DefValues []any
  22. PartKeys []string
  23. IDKeys []string
  24. LatField string
  25. TableIndexes map[string][]string
  26. Version string
  27. }
  28. func (me *TableDefine) TableInfo() (tableinfo *TableInfo, createfieldtypes []string) {
  29. fields := me.Fields
  30. tableinfo = &TableInfo{
  31. TableDefine: me,
  32. MapNameFields: map[string]*Field{},
  33. FieldNames: []string{},
  34. FieldTypes: []string{},
  35. DefValues: []any{},
  36. PartKeys: []string{},
  37. IDKeys: []string{},
  38. TableIndexes: map[string][]string{},
  39. LatField: "",
  40. Version: TableInfoVersion,
  41. }
  42. for k, v := range me.Indexes {
  43. // 用户定义索引,i_ 开头
  44. tableinfo.TableIndexes["i_"+k] = v
  45. }
  46. for _, field := range fields {
  47. tableinfo.MapNameFields[field.Name] = field
  48. if me.Indexes == nil {
  49. // 未指定索引,自动生成全字段索引,i_ 开头
  50. // 指定空map,不建索引
  51. tableinfo.TableIndexes["i_"+me.TableName+"_"+field.Name] = []string{field.Name}
  52. }
  53. }
  54. for i := 0; ; i++ {
  55. tableinfo.LatField = fmt.Sprint("_last_access_time_", i)
  56. if tableinfo.MapNameFields[tableinfo.LatField] == nil {
  57. last_access_time_field := &Field{
  58. Name: tableinfo.LatField,
  59. Type: "int",
  60. Defval: time.Now().UnixNano(),
  61. }
  62. tableinfo.MapNameFields[tableinfo.LatField] = last_access_time_field
  63. fields = append(fields, last_access_time_field)
  64. // 内置索引,ii_ 开头,区别于用户定义索引
  65. tableinfo.TableIndexes["ii_"+me.TableName+"_"+tableinfo.LatField] = []string{tableinfo.LatField}
  66. break
  67. }
  68. }
  69. for _, field := range fields {
  70. tableinfo.FieldNames = append(tableinfo.FieldNames, field.Name)
  71. tableinfo.FieldTypes = append(tableinfo.FieldTypes, field.Type)
  72. createfieldtypes = append(createfieldtypes, `"`+field.Name+`" `+field.Type)
  73. if field.Defval == nil {
  74. tableinfo.DefValues = append(tableinfo.DefValues, DefaultValue(field.Type))
  75. } else {
  76. tableinfo.DefValues = append(tableinfo.DefValues, field.Defval)
  77. }
  78. if field.Partkeyi != 0 {
  79. for field.Partkeyi > len(tableinfo.PartKeys) {
  80. tableinfo.PartKeys = append(tableinfo.PartKeys, "")
  81. }
  82. tableinfo.PartKeys[field.Partkeyi-1] = field.Name
  83. }
  84. if field.Idkeyi != 0 {
  85. for field.Idkeyi > len(tableinfo.IDKeys) {
  86. tableinfo.IDKeys = append(tableinfo.IDKeys, "")
  87. }
  88. tableinfo.IDKeys[field.Idkeyi-1] = field.Name
  89. }
  90. }
  91. return
  92. }