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  }