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 }