resultset.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package mysql
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. "github.com/pingcap/errors"
  7. "github.com/siddontang/go/hack"
  8. )
  9. type StreamingType int
  10. const (
  11. // StreamingNone means there is no streaming
  12. StreamingNone StreamingType = iota
  13. // StreamingSelect is used with select queries for which each result is
  14. // directly returned to the client
  15. StreamingSelect
  16. // StreamingMultiple is used when multiple queries are given at once
  17. // usually in combination with SERVER_MORE_RESULTS_EXISTS flag set
  18. StreamingMultiple
  19. )
  20. type Resultset struct {
  21. Fields []*Field
  22. FieldNames map[string]int
  23. Values [][]FieldValue
  24. RawPkg []byte
  25. RowDatas []RowData
  26. Streaming StreamingType
  27. StreamingDone bool
  28. }
  29. var (
  30. resultsetPool = sync.Pool{
  31. New: func() interface{} {
  32. return &Resultset{}
  33. },
  34. }
  35. )
  36. func NewResultset(fieldsCount int) *Resultset {
  37. r := resultsetPool.Get().(*Resultset)
  38. r.Reset(fieldsCount)
  39. return r
  40. }
  41. func (r *Resultset) returnToPool() {
  42. resultsetPool.Put(r)
  43. }
  44. func (r *Resultset) Reset(fieldsCount int) {
  45. r.RawPkg = r.RawPkg[:0]
  46. r.Fields = r.Fields[:0]
  47. r.Values = r.Values[:0]
  48. r.RowDatas = r.RowDatas[:0]
  49. if r.FieldNames != nil {
  50. for k := range r.FieldNames {
  51. delete(r.FieldNames, k)
  52. }
  53. } else {
  54. r.FieldNames = make(map[string]int)
  55. }
  56. if fieldsCount == 0 {
  57. return
  58. }
  59. if cap(r.Fields) < fieldsCount {
  60. r.Fields = make([]*Field, fieldsCount)
  61. } else {
  62. r.Fields = r.Fields[:fieldsCount]
  63. }
  64. }
  65. func (r *Resultset) RowNumber() int {
  66. if r == nil {
  67. return 0
  68. }
  69. return len(r.Values)
  70. }
  71. func (r *Resultset) ColumnNumber() int {
  72. return len(r.Fields)
  73. }
  74. func (r *Resultset) GetValue(row, column int) (interface{}, error) {
  75. if row >= len(r.Values) || row < 0 {
  76. return nil, errors.Errorf("invalid row index %d", row)
  77. }
  78. if column >= len(r.Fields) || column < 0 {
  79. return nil, errors.Errorf("invalid column index %d", column)
  80. }
  81. return r.Values[row][column].Value(), nil
  82. }
  83. func (r *Resultset) NameIndex(name string) (int, error) {
  84. if column, ok := r.FieldNames[name]; ok {
  85. return column, nil
  86. } else {
  87. return 0, errors.Errorf("invalid field name %s", name)
  88. }
  89. }
  90. func (r *Resultset) GetValueByName(row int, name string) (interface{}, error) {
  91. if column, err := r.NameIndex(name); err != nil {
  92. return nil, errors.Trace(err)
  93. } else {
  94. return r.GetValue(row, column)
  95. }
  96. }
  97. func (r *Resultset) IsNull(row, column int) (bool, error) {
  98. d, err := r.GetValue(row, column)
  99. if err != nil {
  100. return false, err
  101. }
  102. return d == nil, nil
  103. }
  104. func (r *Resultset) IsNullByName(row int, name string) (bool, error) {
  105. if column, err := r.NameIndex(name); err != nil {
  106. return false, err
  107. } else {
  108. return r.IsNull(row, column)
  109. }
  110. }
  111. func (r *Resultset) GetUint(row, column int) (uint64, error) {
  112. d, err := r.GetValue(row, column)
  113. if err != nil {
  114. return 0, err
  115. }
  116. switch v := d.(type) {
  117. case int:
  118. return uint64(v), nil
  119. case int8:
  120. return uint64(v), nil
  121. case int16:
  122. return uint64(v), nil
  123. case int32:
  124. return uint64(v), nil
  125. case int64:
  126. return uint64(v), nil
  127. case uint:
  128. return uint64(v), nil
  129. case uint8:
  130. return uint64(v), nil
  131. case uint16:
  132. return uint64(v), nil
  133. case uint32:
  134. return uint64(v), nil
  135. case uint64:
  136. return v, nil
  137. case float32:
  138. return uint64(v), nil
  139. case float64:
  140. return uint64(v), nil
  141. case string:
  142. return strconv.ParseUint(v, 10, 64)
  143. case []byte:
  144. return strconv.ParseUint(string(v), 10, 64)
  145. case nil:
  146. return 0, nil
  147. default:
  148. return 0, errors.Errorf("data type is %T", v)
  149. }
  150. }
  151. func (r *Resultset) GetUintByName(row int, name string) (uint64, error) {
  152. if column, err := r.NameIndex(name); err != nil {
  153. return 0, err
  154. } else {
  155. return r.GetUint(row, column)
  156. }
  157. }
  158. func (r *Resultset) GetInt(row, column int) (int64, error) {
  159. v, err := r.GetUint(row, column)
  160. if err != nil {
  161. return 0, err
  162. }
  163. return int64(v), nil
  164. }
  165. func (r *Resultset) GetIntByName(row int, name string) (int64, error) {
  166. v, err := r.GetUintByName(row, name)
  167. if err != nil {
  168. return 0, err
  169. }
  170. return int64(v), nil
  171. }
  172. func (r *Resultset) GetFloat(row, column int) (float64, error) {
  173. d, err := r.GetValue(row, column)
  174. if err != nil {
  175. return 0, err
  176. }
  177. switch v := d.(type) {
  178. case int:
  179. return float64(v), nil
  180. case int8:
  181. return float64(v), nil
  182. case int16:
  183. return float64(v), nil
  184. case int32:
  185. return float64(v), nil
  186. case int64:
  187. return float64(v), nil
  188. case uint:
  189. return float64(v), nil
  190. case uint8:
  191. return float64(v), nil
  192. case uint16:
  193. return float64(v), nil
  194. case uint32:
  195. return float64(v), nil
  196. case uint64:
  197. return float64(v), nil
  198. case float32:
  199. return float64(v), nil
  200. case float64:
  201. return v, nil
  202. case string:
  203. return strconv.ParseFloat(v, 64)
  204. case []byte:
  205. return strconv.ParseFloat(string(v), 64)
  206. case nil:
  207. return 0, nil
  208. default:
  209. return 0, errors.Errorf("data type is %T", v)
  210. }
  211. }
  212. func (r *Resultset) GetFloatByName(row int, name string) (float64, error) {
  213. if column, err := r.NameIndex(name); err != nil {
  214. return 0, err
  215. } else {
  216. return r.GetFloat(row, column)
  217. }
  218. }
  219. func (r *Resultset) GetString(row, column int) (string, error) {
  220. d, err := r.GetValue(row, column)
  221. if err != nil {
  222. return "", err
  223. }
  224. switch v := d.(type) {
  225. case string:
  226. return v, nil
  227. case []byte:
  228. return hack.String(v), nil
  229. case int, int8, int16, int32, int64,
  230. uint, uint8, uint16, uint32, uint64:
  231. return fmt.Sprintf("%d", v), nil
  232. case float32:
  233. return strconv.FormatFloat(float64(v), 'f', -1, 64), nil
  234. case float64:
  235. return strconv.FormatFloat(v, 'f', -1, 64), nil
  236. case nil:
  237. return "", nil
  238. default:
  239. return "", errors.Errorf("data type is %T", v)
  240. }
  241. }
  242. func (r *Resultset) GetStringByName(row int, name string) (string, error) {
  243. if column, err := r.NameIndex(name); err != nil {
  244. return "", err
  245. } else {
  246. return r.GetString(row, column)
  247. }
  248. }