result.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package sql
  2. import (
  3. "fmt"
  4. "git.sxidc.com/go-framework/baize/framwork/tag/sql/sql_result"
  5. "git.sxidc.com/go-tools/utils/reflectutils"
  6. "git.sxidc.com/service-supports/fserr"
  7. "reflect"
  8. "strings"
  9. "time"
  10. )
  11. const (
  12. resultTimeMicroFormat = "2006-01-02T15:04:05.000000+08:00"
  13. resultTimeMilliFormat = "2006-01-02T15:04:05.000+08:00"
  14. resultTimeSecFormat = "2006-01-02T15:04:05+08:00"
  15. )
  16. func ParseSqlResult(input any, e any) error {
  17. if input == nil {
  18. return nil
  19. }
  20. if e == nil {
  21. return nil
  22. }
  23. results, ok := input.([]Result)
  24. if !ok {
  25. tableRow, ok := input.(Result)
  26. if !ok {
  27. return fserr.New("输入数据应该为sdk.SqlResult或[]sdk.SqlResult")
  28. }
  29. results = []Result{tableRow}
  30. }
  31. typeCheckErr := fserr.New("可以接受的输出类型为结构指针或者结构slice的指针")
  32. outputValue := reflect.ValueOf(e)
  33. if outputValue.Kind() != reflect.Pointer {
  34. return typeCheckErr
  35. } else {
  36. outputElemValue := reflectutils.PointerValueElem(outputValue)
  37. if outputElemValue.Kind() != reflect.Struct && outputElemValue.Kind() != reflect.Slice {
  38. return typeCheckErr
  39. }
  40. if outputElemValue.Kind() == reflect.Slice && !reflectutils.IsSliceValueOf(outputElemValue, reflect.Struct) {
  41. return typeCheckErr
  42. }
  43. }
  44. outputElemValue := reflectutils.PointerValueElem(outputValue)
  45. // 构造输出实体slice
  46. var outputEntities reflect.Value
  47. if outputElemValue.Kind() == reflect.Struct {
  48. outputEntities = reflect.MakeSlice(reflect.SliceOf(outputElemValue.Type()), 0, 0)
  49. } else {
  50. outputEntities = reflect.MakeSlice(outputElemValue.Type(), 0, 0)
  51. }
  52. for _, result := range results {
  53. var outputEntityValue reflect.Value
  54. if outputElemValue.Kind() == reflect.Struct {
  55. outputEntityValue = reflect.New(outputElemValue.Type()).Elem()
  56. } else {
  57. outputEntityValue = reflect.New(outputElemValue.Type().Elem()).Elem()
  58. }
  59. outputEntity := outputEntityValue.Addr().Interface()
  60. err := sql_result.DefaultUsage(result, outputEntity)
  61. if err != nil {
  62. return err
  63. }
  64. // 保存输出实体
  65. outputEntities = reflect.Append(outputEntities, outputEntityValue)
  66. }
  67. // 将输出实体赋值给输出指针变量
  68. if outputElemValue.Kind() == reflect.Slice {
  69. outputElemValue.Set(outputEntities)
  70. } else {
  71. outputElemValue.Set(outputEntities.Index(0))
  72. }
  73. return nil
  74. }
  75. type Result map[string]any
  76. func (result Result) ColumnValueStringAsTime(columnName string) time.Time {
  77. value, ok := result[columnName].(string)
  78. if !ok {
  79. return time.Time{}
  80. }
  81. layout := resultTimeSecFormat
  82. timeZoneIndex := strings.LastIndex(value, "+08:")
  83. if timeZoneIndex != -1 {
  84. value = value[:timeZoneIndex]
  85. afterSecondIndex := strings.LastIndex(value, ".")
  86. if afterSecondIndex != -1 {
  87. if len(value)-afterSecondIndex-1 == 6 {
  88. layout = resultTimeMicroFormat
  89. } else if len(value)-afterSecondIndex-1 == 3 {
  90. layout = resultTimeMilliFormat
  91. }
  92. }
  93. }
  94. t, err := time.ParseInLocation(layout, value, time.Local)
  95. if err != nil {
  96. return time.Time{}
  97. }
  98. return t
  99. }
  100. func (result Result) ColumnValueBool(columnName string) bool {
  101. value, err := reflectutils.ToBool(result[columnName])
  102. if err != nil {
  103. fmt.Println(err)
  104. return false
  105. }
  106. return value
  107. }
  108. func (result Result) ColumnValueString(columnName string) string {
  109. value, err := reflectutils.ToString(result[columnName])
  110. if err != nil {
  111. fmt.Println(err)
  112. return ""
  113. }
  114. return value
  115. }
  116. func (result Result) ColumnValueInt(columnName string) int {
  117. value, err := reflectutils.ToInt64(result[columnName])
  118. if err != nil {
  119. fmt.Println(err)
  120. return 0
  121. }
  122. return int(value)
  123. }
  124. func (result Result) ColumnValueInt8(columnName string) int8 {
  125. value, err := reflectutils.ToInt64(result[columnName])
  126. if err != nil {
  127. fmt.Println(err)
  128. return 0
  129. }
  130. return int8(value)
  131. }
  132. func (result Result) ColumnValueInt16(columnName string) int16 {
  133. value, err := reflectutils.ToInt64(result[columnName])
  134. if err != nil {
  135. fmt.Println(err)
  136. return 0
  137. }
  138. return int16(value)
  139. }
  140. func (result Result) ColumnValueInt32(columnName string) int32 {
  141. value, err := reflectutils.ToInt64(result[columnName])
  142. if err != nil {
  143. fmt.Println(err)
  144. return 0
  145. }
  146. return int32(value)
  147. }
  148. func (result Result) ColumnValueInt64(columnName string) int64 {
  149. value, err := reflectutils.ToInt64(result[columnName])
  150. if err != nil {
  151. fmt.Println(err)
  152. return 0
  153. }
  154. return value
  155. }
  156. func (result Result) ColumnValueUint(columnName string) uint {
  157. value, err := reflectutils.ToUint64(result[columnName])
  158. if err != nil {
  159. fmt.Println(err)
  160. return 0
  161. }
  162. return uint(value)
  163. }
  164. func (result Result) ColumnValueUint8(columnName string) uint8 {
  165. value, err := reflectutils.ToUint64(result[columnName])
  166. if err != nil {
  167. fmt.Println(err)
  168. return 0
  169. }
  170. return uint8(value)
  171. }
  172. func (result Result) ColumnValueUint16(columnName string) uint16 {
  173. value, err := reflectutils.ToUint64(result[columnName])
  174. if err != nil {
  175. fmt.Println(err)
  176. return 0
  177. }
  178. return uint16(value)
  179. }
  180. func (result Result) ColumnValueUint32(columnName string) uint32 {
  181. value, err := reflectutils.ToUint64(result[columnName])
  182. if err != nil {
  183. fmt.Println(err)
  184. return 0
  185. }
  186. return uint32(value)
  187. }
  188. func (result Result) ColumnValueUint64(columnName string) uint64 {
  189. value, err := reflectutils.ToUint64(result[columnName])
  190. if err != nil {
  191. fmt.Println(err)
  192. return 0
  193. }
  194. return value
  195. }
  196. func (result Result) ColumnValueFloat32(columnName string) float32 {
  197. value, err := reflectutils.ToFloat64(result[columnName])
  198. if err != nil {
  199. fmt.Println(err)
  200. return 0
  201. }
  202. return float32(value)
  203. }
  204. func (result Result) ColumnValueFloat64(columnName string) float64 {
  205. value, err := reflectutils.ToFloat64(result[columnName])
  206. if err != nil {
  207. fmt.Println(err)
  208. return 0
  209. }
  210. return value
  211. }