helpersplus.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package xorm
  2. import (
  3. "fmt"
  4. "reflect"
  5. "time"
  6. "github.com/xormplus/core"
  7. )
  8. func reflect2objectWithDateFormat(rawValue *reflect.Value, dateFormat string) (value interface{}, err error) {
  9. aa := reflect.TypeOf((*rawValue).Interface())
  10. vv := reflect.ValueOf((*rawValue).Interface())
  11. switch aa.Kind() {
  12. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  13. value = vv.Int()
  14. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  15. value = vv.Uint()
  16. case reflect.Float32, reflect.Float64:
  17. value = vv.Float()
  18. case reflect.String:
  19. value = vv.String()
  20. case reflect.Array, reflect.Slice:
  21. switch aa.Elem().Kind() {
  22. case reflect.Uint8:
  23. data := rawValue.Interface().([]byte)
  24. value = string(data)
  25. default:
  26. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  27. }
  28. //时间类型
  29. case reflect.Struct:
  30. if aa == core.TimeType {
  31. // loc, _ := time.LoadLocation("Local") //重要:获取时区
  32. // value, _ = time.ParseInLocation(dateFormat, rawValue.Interface().(time.Time).Format(dateFormat), loc)
  33. value = rawValue.Interface().(time.Time).Format(dateFormat)
  34. } else {
  35. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  36. }
  37. case reflect.Bool:
  38. value = vv.Bool()
  39. case reflect.Complex128, reflect.Complex64:
  40. value = vv.Complex()
  41. /* TODO: unsupported types below
  42. case reflect.Map:
  43. case reflect.Ptr:
  44. case reflect.Uintptr:
  45. case reflect.UnsafePointer:
  46. case reflect.Chan, reflect.Func, reflect.Interface:
  47. */
  48. default:
  49. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  50. }
  51. return
  52. }
  53. func value2ObjectWithDateFormat(rawValue *reflect.Value, dateFormat string) (data interface{}, err error) {
  54. data, err = reflect2objectWithDateFormat(rawValue, dateFormat)
  55. if err != nil {
  56. return
  57. }
  58. return
  59. }
  60. func rows2mapObjectsWithDateFormat(rows *core.Rows, dateFormat string) (resultsSlice []map[string]interface{}, err error) {
  61. fields, err := rows.Columns()
  62. if err != nil {
  63. return nil, err
  64. }
  65. for rows.Next() {
  66. result, err := rows2mapObjectWithDateFormat(rows, dateFormat, fields)
  67. if err != nil {
  68. return nil, err
  69. }
  70. resultsSlice = append(resultsSlice, result)
  71. }
  72. return resultsSlice, nil
  73. }
  74. func rows2mapObjectWithDateFormat(rows *core.Rows, dateFormat string, fields []string) (resultsMap map[string]interface{}, err error) {
  75. result := make(map[string]interface{})
  76. scanResultContainers := make([]interface{}, len(fields))
  77. for i := 0; i < len(fields); i++ {
  78. var scanResultContainer interface{}
  79. scanResultContainers[i] = &scanResultContainer
  80. }
  81. if err := rows.Scan(scanResultContainers...); err != nil {
  82. return nil, err
  83. }
  84. for ii, key := range fields {
  85. rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
  86. //if row is null then ignore
  87. if rawValue.Interface() == nil {
  88. continue
  89. }
  90. if data, err := value2ObjectWithDateFormat(&rawValue, dateFormat); err == nil {
  91. result[key] = data
  92. } else {
  93. return nil, err // !nashtsai! REVIEW, should return err or just error log?
  94. }
  95. }
  96. return result, nil
  97. }
  98. func txQueryByMap(tx *core.Tx, sqlStr string, params interface{}) (resultsSlice []map[string]interface{}, err error) {
  99. rows, err := tx.QueryMap(sqlStr, params)
  100. if err != nil {
  101. return nil, err
  102. }
  103. defer rows.Close()
  104. return rows2mapObjects(rows)
  105. }
  106. func txQuery3WithDateFormat(tx *core.Tx, dateFormat string, sqlStr string, params ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  107. rows, err := tx.Query(sqlStr, params...)
  108. if err != nil {
  109. return nil, err
  110. }
  111. defer rows.Close()
  112. return rows2mapObjectsWithDateFormat(rows, dateFormat)
  113. }
  114. func queryByMap(db *core.DB, sqlStr string, params interface{}) (resultsSlice []map[string]interface{}, err error) {
  115. s, err := db.Prepare(sqlStr)
  116. if err != nil {
  117. return nil, err
  118. }
  119. defer s.Close()
  120. rows, err := s.QueryMap(params)
  121. if err != nil {
  122. return nil, err
  123. }
  124. defer rows.Close()
  125. return rows2mapObjects(rows)
  126. }
  127. func query3WithDateFormat(db *core.DB, dateFormat string, sqlStr string, params ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  128. s, err := db.Prepare(sqlStr)
  129. if err != nil {
  130. return nil, err
  131. }
  132. defer s.Close()
  133. rows, err := s.Query(params...)
  134. if err != nil {
  135. return nil, err
  136. }
  137. defer rows.Close()
  138. return rows2mapObjectsWithDateFormat(rows, dateFormat)
  139. }
  140. func reflect2object(rawValue *reflect.Value) (value interface{}, err error) {
  141. aa := reflect.TypeOf((*rawValue).Interface())
  142. vv := reflect.ValueOf((*rawValue).Interface())
  143. switch aa.Kind() {
  144. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  145. value = vv.Int()
  146. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  147. value = vv.Uint()
  148. case reflect.Float32, reflect.Float64:
  149. value = vv.Float()
  150. case reflect.String:
  151. value = vv.String()
  152. case reflect.Array, reflect.Slice:
  153. switch aa.Elem().Kind() {
  154. case reflect.Uint8:
  155. data := rawValue.Interface().([]byte)
  156. value = string(data)
  157. default:
  158. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  159. }
  160. //时间类型
  161. case reflect.Struct:
  162. if aa == core.TimeType {
  163. value = rawValue.Interface().(time.Time)
  164. } else {
  165. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  166. }
  167. case reflect.Bool:
  168. value = vv.Bool()
  169. case reflect.Complex128, reflect.Complex64:
  170. value = vv.Complex()
  171. /* TODO: unsupported types below
  172. case reflect.Map:
  173. case reflect.Ptr:
  174. case reflect.Uintptr:
  175. case reflect.UnsafePointer:
  176. case reflect.Chan, reflect.Func, reflect.Interface:
  177. */
  178. default:
  179. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  180. }
  181. return
  182. }
  183. func value2Object(rawValue *reflect.Value) (data interface{}, err error) {
  184. data, err = reflect2object(rawValue)
  185. if err != nil {
  186. return
  187. }
  188. return
  189. }
  190. func rows2mapObjects(rows *core.Rows) (resultsSlice []map[string]interface{}, err error) {
  191. fields, err := rows.Columns()
  192. if err != nil {
  193. return nil, err
  194. }
  195. for rows.Next() {
  196. result, err := rows2mapObject(rows, fields)
  197. if err != nil {
  198. return nil, err
  199. }
  200. resultsSlice = append(resultsSlice, result)
  201. }
  202. return resultsSlice, nil
  203. }
  204. func rows2mapObject(rows *core.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
  205. result := make(map[string]interface{})
  206. scanResultContainers := make([]interface{}, len(fields))
  207. for i := 0; i < len(fields); i++ {
  208. var scanResultContainer interface{}
  209. scanResultContainers[i] = &scanResultContainer
  210. }
  211. if err := rows.Scan(scanResultContainers...); err != nil {
  212. return nil, err
  213. }
  214. for ii, key := range fields {
  215. rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
  216. //if row is null then ignore
  217. if rawValue.Interface() == nil {
  218. continue
  219. }
  220. if data, err := value2Object(&rawValue); err == nil {
  221. result[key] = data
  222. } else {
  223. return nil, err // !nashtsai! REVIEW, should return err or just error log?
  224. }
  225. }
  226. return result, nil
  227. }
  228. //xiaolipeng
  229. func txQuery3(tx *core.Tx, sqlStr string, params ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  230. rows, err := tx.Query(sqlStr, params...)
  231. if err != nil {
  232. return nil, err
  233. }
  234. defer rows.Close()
  235. return rows2mapObjects(rows)
  236. }
  237. //xiaolipeng
  238. func query3(db *core.DB, sqlStr string, params ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  239. s, err := db.Prepare(sqlStr)
  240. if err != nil {
  241. return nil, err
  242. }
  243. defer s.Close()
  244. rows, err := s.Query(params...)
  245. if err != nil {
  246. return nil, err
  247. }
  248. defer rows.Close()
  249. return rows2mapObjects(rows)
  250. }