value.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package sql_tpl
  2. import (
  3. "errors"
  4. "git.sxidc.com/go-tools/utils/encoding"
  5. "git.sxidc.com/go-tools/utils/strutils"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. const (
  12. timeWriteFormat = time.DateTime + ".000000 +08:00"
  13. )
  14. type AfterParsedStrValueOption func(strValue string) (string, error)
  15. func WithAESKey(aesKey string) AfterParsedStrValueOption {
  16. return func(strValue string) (string, error) {
  17. if strutils.IsStringEmpty(strValue) {
  18. return "''", nil
  19. }
  20. encrypted, err := encoding.AESEncrypt(strValue, aesKey)
  21. if err != nil {
  22. return "", err
  23. }
  24. return "'" + encrypted + "'", nil
  25. }
  26. }
  27. func parseValue(value any, opts ...AfterParsedStrValueOption) (string, error) {
  28. valueValue := reflect.ValueOf(value)
  29. if !valueValue.IsValid() {
  30. return "", errors.New("无效值")
  31. }
  32. if valueValue.Kind() == reflect.Ptr && valueValue.IsNil() {
  33. return "", errors.New("空值")
  34. }
  35. if valueValue.Kind() == reflect.Ptr {
  36. valueValue = valueValue.Elem()
  37. }
  38. var parsedValue string
  39. switch v := valueValue.Interface().(type) {
  40. case string:
  41. parsedValue = v
  42. if opts == nil || len(opts) == 0 {
  43. return "'" + parsedValue + "'", nil
  44. }
  45. case bool:
  46. parsedValue = strconv.FormatBool(v)
  47. if opts == nil || len(opts) == 0 {
  48. return parsedValue, nil
  49. }
  50. case time.Time:
  51. parsedValue = v.Format(timeWriteFormat)
  52. if opts == nil || len(opts) == 0 {
  53. return "'" + parsedValue + "'", nil
  54. }
  55. case int:
  56. parsedValue = strconv.Itoa(v)
  57. if opts == nil || len(opts) == 0 {
  58. return parsedValue, nil
  59. }
  60. case int8:
  61. parsedValue = strconv.FormatInt(int64(v), 10)
  62. if opts == nil || len(opts) == 0 {
  63. return parsedValue, nil
  64. }
  65. case int16:
  66. parsedValue = strconv.FormatInt(int64(v), 10)
  67. if opts == nil || len(opts) == 0 {
  68. return parsedValue, nil
  69. }
  70. case int32:
  71. parsedValue = strconv.FormatInt(int64(v), 10)
  72. if opts == nil || len(opts) == 0 {
  73. return parsedValue, nil
  74. }
  75. case int64:
  76. parsedValue = strconv.FormatInt(v, 10)
  77. if opts == nil || len(opts) == 0 {
  78. return parsedValue, nil
  79. }
  80. case uint:
  81. parsedValue = strconv.FormatUint(uint64(v), 10)
  82. if opts == nil || len(opts) == 0 {
  83. return parsedValue, nil
  84. }
  85. case uint8:
  86. parsedValue = strconv.FormatUint(uint64(v), 10)
  87. if opts == nil || len(opts) == 0 {
  88. return parsedValue, nil
  89. }
  90. case uint16:
  91. parsedValue = strconv.FormatUint(uint64(v), 10)
  92. if opts == nil || len(opts) == 0 {
  93. return parsedValue, nil
  94. }
  95. case uint32:
  96. parsedValue = strconv.FormatUint(uint64(v), 10)
  97. if opts == nil || len(opts) == 0 {
  98. return parsedValue, nil
  99. }
  100. case uint64:
  101. parsedValue = strconv.FormatUint(v, 10)
  102. if opts == nil || len(opts) == 0 {
  103. return parsedValue, nil
  104. }
  105. default:
  106. return "", errors.New("不支持的类型")
  107. }
  108. for _, opt := range opts {
  109. innerParsedValue, err := opt(parsedValue)
  110. if err != nil {
  111. return "", err
  112. }
  113. parsedValue = innerParsedValue
  114. }
  115. return parsedValue, nil
  116. }
  117. func parseSliceValues(values any, opts ...AfterParsedStrValueOption) (string, error) {
  118. sliceValue := reflect.ValueOf(values)
  119. if !sliceValue.IsValid() {
  120. return "", errors.New("无效值")
  121. }
  122. if sliceValue.Kind() == reflect.Ptr && sliceValue.IsNil() {
  123. return "()", nil
  124. }
  125. if sliceValue.Kind() == reflect.Ptr {
  126. sliceValue = sliceValue.Elem()
  127. }
  128. if sliceValue.Kind() != reflect.Slice {
  129. return "", errors.New("传递的不是slice")
  130. }
  131. parsedValues := make([]string, 0)
  132. for i := 0; i < sliceValue.Len(); i++ {
  133. value := sliceValue.Index(i).Interface()
  134. parsedValue, err := parseValue(value)
  135. if err != nil {
  136. return "", err
  137. }
  138. for _, opt := range opts {
  139. innerParsedValue, err := opt(parsedValue)
  140. if err != nil {
  141. return "", err
  142. }
  143. parsedValue = innerParsedValue
  144. }
  145. parsedValues = append(parsedValues, parsedValue)
  146. }
  147. if len(parsedValues) == 0 {
  148. return "()", nil
  149. }
  150. return "(" + strings.Join(parsedValues, ",") + ")", nil
  151. }