result.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. var layout string
  82. if strings.HasSuffix(value, ".000000+08:00") {
  83. layout = resultTimeMicroFormat
  84. } else if strings.HasSuffix(value, ".000+08:00") {
  85. layout = resultTimeMilliFormat
  86. } else {
  87. layout = resultTimeSecFormat
  88. }
  89. t, err := time.ParseInLocation(layout, value, time.Local)
  90. if err != nil {
  91. return time.Time{}
  92. }
  93. return t
  94. }
  95. func (result Result) ColumnValueBool(columnName string) bool {
  96. value, err := reflectutils.ToBool(result[columnName])
  97. if err != nil {
  98. fmt.Println(err)
  99. return false
  100. }
  101. return value
  102. }
  103. func (result Result) ColumnValueString(columnName string) string {
  104. value, err := reflectutils.ToString(result[columnName])
  105. if err != nil {
  106. fmt.Println(err)
  107. return ""
  108. }
  109. return value
  110. }
  111. func (result Result) ColumnValueInt(columnName string) int {
  112. value, err := reflectutils.ToInt64(result[columnName])
  113. if err != nil {
  114. fmt.Println(err)
  115. return 0
  116. }
  117. return int(value)
  118. }
  119. func (result Result) ColumnValueInt8(columnName string) int8 {
  120. value, err := reflectutils.ToInt64(result[columnName])
  121. if err != nil {
  122. fmt.Println(err)
  123. return 0
  124. }
  125. return int8(value)
  126. }
  127. func (result Result) ColumnValueInt16(columnName string) int16 {
  128. value, err := reflectutils.ToInt64(result[columnName])
  129. if err != nil {
  130. fmt.Println(err)
  131. return 0
  132. }
  133. return int16(value)
  134. }
  135. func (result Result) ColumnValueInt32(columnName string) int32 {
  136. value, err := reflectutils.ToInt64(result[columnName])
  137. if err != nil {
  138. fmt.Println(err)
  139. return 0
  140. }
  141. return int32(value)
  142. }
  143. func (result Result) ColumnValueInt64(columnName string) int64 {
  144. value, err := reflectutils.ToInt64(result[columnName])
  145. if err != nil {
  146. fmt.Println(err)
  147. return 0
  148. }
  149. return value
  150. }
  151. func (result Result) ColumnValueUint(columnName string) uint {
  152. value, err := reflectutils.ToUint64(result[columnName])
  153. if err != nil {
  154. fmt.Println(err)
  155. return 0
  156. }
  157. return uint(value)
  158. }
  159. func (result Result) ColumnValueUint8(columnName string) uint8 {
  160. value, err := reflectutils.ToUint64(result[columnName])
  161. if err != nil {
  162. fmt.Println(err)
  163. return 0
  164. }
  165. return uint8(value)
  166. }
  167. func (result Result) ColumnValueUint16(columnName string) uint16 {
  168. value, err := reflectutils.ToUint64(result[columnName])
  169. if err != nil {
  170. fmt.Println(err)
  171. return 0
  172. }
  173. return uint16(value)
  174. }
  175. func (result Result) ColumnValueUint32(columnName string) uint32 {
  176. value, err := reflectutils.ToUint64(result[columnName])
  177. if err != nil {
  178. fmt.Println(err)
  179. return 0
  180. }
  181. return uint32(value)
  182. }
  183. func (result Result) ColumnValueUint64(columnName string) uint64 {
  184. value, err := reflectutils.ToUint64(result[columnName])
  185. if err != nil {
  186. fmt.Println(err)
  187. return 0
  188. }
  189. return value
  190. }
  191. func (result Result) ColumnValueFloat32(columnName string) float32 {
  192. value, err := reflectutils.ToFloat64(result[columnName])
  193. if err != nil {
  194. fmt.Println(err)
  195. return 0
  196. }
  197. return float32(value)
  198. }
  199. func (result Result) ColumnValueFloat64(columnName string) float64 {
  200. value, err := reflectutils.ToFloat64(result[columnName])
  201. if err != nil {
  202. fmt.Println(err)
  203. return 0
  204. }
  205. return value
  206. }