github.com/RevenueMonster/sqlike@v1.0.6/types/set.go (about) 1 package types 2 3 import ( 4 "database/sql/driver" 5 "strings" 6 7 "github.com/RevenueMonster/sqlike/reflext" 8 sqldriver "github.com/RevenueMonster/sqlike/sql/driver" 9 "github.com/RevenueMonster/sqlike/sqlike/columns" 10 "github.com/RevenueMonster/sqlike/util" 11 ) 12 13 // Set : sql data type of `SET` 14 type Set []string 15 16 // DataType : 17 func (s Set) DataType(_ sqldriver.Info, sf reflext.StructFielder) columns.Column { 18 charset, collate := "utf8mb4", "utf8mb4_0900_ai_ci" 19 blr := util.AcquireString() 20 defer util.ReleaseString(blr) 21 var def *string 22 blr.WriteString("SET(") 23 blr.WriteByte('\'') 24 25 val, ok := sf.Tag().LookUp("set") 26 if ok { 27 paths := strings.Split(val, "|") 28 if len(paths) >= 64 { 29 panic("maximum 64 of SET value") 30 } 31 def = &paths[0] 32 blr.WriteString(strings.Join(paths, "','")) 33 } 34 blr.WriteByte('\'') 35 blr.WriteByte(')') 36 37 return columns.Column{ 38 Name: sf.Name(), 39 Type: blr.String(), 40 DataType: "SET", 41 Nullable: reflext.IsNullable(sf.Type()), 42 Charset: &charset, 43 Collation: &collate, 44 DefaultValue: def, 45 } 46 } 47 48 // Value : 49 func (s Set) Value() (driver.Value, error) { 50 if s == nil { 51 return nil, nil 52 } 53 return strings.Join(s, ","), nil 54 } 55 56 // Scan : 57 func (s *Set) Scan(it interface{}) error { 58 switch vi := it.(type) { 59 case []byte: 60 s.unmarshal(string(vi)) 61 62 case string: 63 s.unmarshal(vi) 64 65 case nil: 66 } 67 return nil 68 } 69 70 func (s *Set) unmarshal(val string) { 71 *s = strings.Split(val, ",") 72 }