12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package schema
- import (
- "fmt"
- "time"
- )
- // 对应 sqlite 中存储的 tableinfo 内部结构
- const TableInfoVersion = "1.0"
- // 表定义信息
- type TableDefine struct {
- TableName string
- Fields Fields
- Indexes map[string][]string
- Ttl time.Duration
- }
- // 表结构信息,对表定义信息的扩展
- type TableInfo struct {
- *TableDefine
- MapNameFields map[string]*Field
- FieldNames []string
- FieldTypes []string
- DefValues []any
- PartKeys []string
- IDKeys []string
- LatField string
- TableIndexes map[string][]string
- Version string
- }
- func (me *TableDefine) TableInfo() (tableinfo *TableInfo, createfieldtypes []string) {
- fields := me.Fields
- tableinfo = &TableInfo{
- TableDefine: me,
- MapNameFields: map[string]*Field{},
- FieldNames: []string{},
- FieldTypes: []string{},
- DefValues: []any{},
- PartKeys: []string{},
- IDKeys: []string{},
- TableIndexes: map[string][]string{},
- LatField: "",
- Version: TableInfoVersion,
- }
- for k, v := range me.Indexes {
- // 用户定义索引,i_ 开头
- tableinfo.TableIndexes["i_"+k] = v
- }
- for _, field := range fields {
- tableinfo.MapNameFields[field.Name] = field
- if me.Indexes == nil {
- // 未指定索引,自动生成全字段索引,i_ 开头
- // 指定空map,不建索引
- tableinfo.TableIndexes["i_"+me.TableName+"_"+field.Name] = []string{field.Name}
- }
- }
- for i := 0; ; i++ {
- tableinfo.LatField = fmt.Sprint("_last_access_time_", i)
- if tableinfo.MapNameFields[tableinfo.LatField] == nil {
- last_access_time_field := &Field{
- Name: tableinfo.LatField,
- Type: "int",
- Defval: time.Now().UnixNano(),
- }
- tableinfo.MapNameFields[tableinfo.LatField] = last_access_time_field
- fields = append(fields, last_access_time_field)
- // 内置索引,ii_ 开头,区别于用户定义索引
- tableinfo.TableIndexes["ii_"+me.TableName+"_"+tableinfo.LatField] = []string{tableinfo.LatField}
- break
- }
- }
- for _, field := range fields {
- tableinfo.FieldNames = append(tableinfo.FieldNames, field.Name)
- tableinfo.FieldTypes = append(tableinfo.FieldTypes, field.Type)
- createfieldtypes = append(createfieldtypes, `"`+field.Name+`" `+field.Type)
- if field.Defval == nil {
- tableinfo.DefValues = append(tableinfo.DefValues, DefaultValue(field.Type))
- } else {
- tableinfo.DefValues = append(tableinfo.DefValues, field.Defval)
- }
- if field.Partkeyi != 0 {
- for field.Partkeyi > len(tableinfo.PartKeys) {
- tableinfo.PartKeys = append(tableinfo.PartKeys, "")
- }
- tableinfo.PartKeys[field.Partkeyi-1] = field.Name
- }
- if field.Idkeyi != 0 {
- for field.Idkeyi > len(tableinfo.IDKeys) {
- tableinfo.IDKeys = append(tableinfo.IDKeys, "")
- }
- tableinfo.IDKeys[field.Idkeyi-1] = field.Name
- }
- }
- return
- }
|