xugu_rows.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package xugu
  2. import (
  3. "database/sql/driver"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  7. "math"
  8. "reflect"
  9. "time"
  10. )
  11. type xuguRows struct {
  12. rows_conn *xuguConn
  13. aR *allResult
  14. results *SelectResult
  15. colIdx int
  16. prepared bool
  17. }
  18. func (row *xuguRows) Next(dest []driver.Value) error {
  19. if row.results.rowIdx >= len(row.results.Values[0]) {
  20. //return errors.New("The result set has been released")
  21. return io.EOF
  22. }
  23. for j := 0; j < int(row.results.Field_Num); j++ {
  24. coluType := row.results.Fields[j].FieldType
  25. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  26. dest[j] = nil
  27. } else {
  28. switch coluType {
  29. case fieldType_BINARY,
  30. fieldType_CLOB,
  31. fieldType_BLOB:
  32. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  33. case fieldType_INTERVAL_Y, fieldType_INTERVAL_M, fieldType_INTERVAL_D,
  34. fieldType_INTERVAL_H, fieldType_INTERVAL_S,
  35. fieldType_INTERVAL_MI:
  36. dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  37. case fieldType_TIME,
  38. fieldType_TIME_TZ:
  39. timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  40. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  41. tv := time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Millisecond * time.Duration(timeTmp)))
  42. utcTime := tv.UTC()
  43. dest[j] = utcTime
  44. case fieldType_DATE:
  45. timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  46. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  47. tv := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Hour * 24 * time.Duration(timeTmp)))
  48. utcTime := tv.UTC()
  49. dest[j] = utcTime
  50. // rintln(string(row.results.Values[j][row.results.rowIdx].Col_Data))
  51. // tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  52. // dest[j] = tv
  53. case fieldType_DATETIME,
  54. fieldType_DATETIME_TZ:
  55. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  56. dest[j] = nil
  57. } else {
  58. //timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
  59. timeTmp := binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data)
  60. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  61. tv := time.Unix(0, int64(timeTmp)*1000000)
  62. utcTime := tv.UTC()
  63. dest[j] = utcTime
  64. }
  65. case fieldType_R4:
  66. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  67. dest[j] = nil
  68. } else {
  69. dest[j] = math.Float32frombits(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  70. }
  71. case fieldType_R8:
  72. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  73. dest[j] = nil
  74. } else {
  75. dest[j] = math.Float64frombits(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  76. }
  77. case fieldType_NUM:
  78. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  79. case fieldType_I1:
  80. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  81. dest[j] = nil
  82. } else {
  83. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  84. }
  85. case fieldType_I2:
  86. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  87. dest[j] = nil
  88. } else {
  89. dest[j] = int16(binary.BigEndian.Uint16(row.results.Values[j][row.results.rowIdx].Col_Data))
  90. }
  91. case fieldType_I4:
  92. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  93. dest[j] = nil
  94. } else {
  95. dest[j] = int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  96. }
  97. case fieldType_I8:
  98. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  99. dest[j] = nil
  100. } else {
  101. dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  102. //dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  103. }
  104. case fieldType_CHAR, fieldType_NCHAR:
  105. if row.results.Values[j][row.results.rowIdx].Col_Data == nil {
  106. dest[j] = string("")
  107. } else if row.results.Values[j][row.results.rowIdx].Col_Data[0] == 0x00 {
  108. dest[j] = string("")
  109. } else {
  110. dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
  111. }
  112. default:
  113. //填入一行的数据
  114. //TODO这里长度改为一行长度
  115. dest[j] = make([]byte, len(row.results.Values))
  116. // Values[字段][0]
  117. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  118. }
  119. }
  120. }
  121. row.results.rowIdx++
  122. return nil
  123. }
  124. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  125. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  126. func (row *xuguRows) Columns() []string {
  127. var columns []string
  128. for _, v := range row.results.Fields {
  129. columns = append(columns, v.FieldName)
  130. }
  131. return columns
  132. }
  133. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  134. //rintln(">>>>>ColumnTypeScanType ")
  135. return row.results.Fields[index].scanType()
  136. }
  137. // The driver is at the end of the current result set.
  138. // Test to see if there is another result set after the current one.
  139. // Only close Rows if there is no further result sets to read.
  140. func (row *xuguRows) HasNextResultSet() bool {
  141. return row.aR.next != nil
  142. }
  143. // NextResultSet prepares the next result set for reading. It reports whether
  144. // there is further result sets, or false if there is no further result set
  145. // or if there is an error advancing to it. The Err method should be consulted
  146. // to distinguish between the two cases.
  147. //
  148. // After calling NextResultSet, the Next method should always be called before
  149. // scanning. If there are further result sets they may not have rows in the result
  150. // set.
  151. func (row *xuguRows) NextResultSet() error {
  152. if row.aR.next == nil {
  153. return fmt.Errorf("there are no multiple result sets available")
  154. }
  155. switch row.aR.next.rt {
  156. case errInfo:
  157. return fmt.Errorf("error: %s", string(row.aR.next.e.ErrStr))
  158. }
  159. row.results = row.aR.next.s
  160. row.aR = row.aR.next
  161. return nil
  162. }
  163. func (row *xuguRows) Close() error {
  164. return nil
  165. }