check.go 957 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package schema
  2. import (
  3. "regexp"
  4. "strings"
  5. )
  6. var (
  7. // reg match english letters and midline
  8. regEnLetterAndMidline = regexp.MustCompile("^[A-Za-z-_]+$")
  9. )
  10. type Check struct {
  11. Name string
  12. Constraint string // length(phone) >= 10
  13. *Field
  14. }
  15. // ParseCheckConstraints parse schema check constraints
  16. func (schema *Schema) ParseCheckConstraints() map[string]Check {
  17. var checks = map[string]Check{}
  18. for _, field := range schema.FieldsByDBName {
  19. if chk := field.TagSettings["CHECK"]; chk != "" {
  20. names := strings.Split(chk, ",")
  21. if len(names) > 1 && regEnLetterAndMidline.MatchString(names[0]) {
  22. checks[names[0]] = Check{Name: names[0], Constraint: strings.Join(names[1:], ","), Field: field}
  23. } else {
  24. if names[0] == "" {
  25. chk = strings.Join(names[1:], ",")
  26. }
  27. name := schema.namer.CheckerName(schema.Table, field.DBName)
  28. checks[name] = Check{Name: name, Constraint: chk, Field: field}
  29. }
  30. }
  31. }
  32. return checks
  33. }