xugu_rows.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. results *SelectResult
  14. colIdx int
  15. prepared bool
  16. }
  17. func (row *xuguRows) Next(dest []driver.Value) error {
  18. if row.results.rowIdx >= len(row.results.Values[0]) {
  19. //return errors.New("The result set has been released")
  20. return io.EOF
  21. }
  22. // fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num))
  23. for j := 0; j < int(row.results.Field_Num); j++ {
  24. coluType := row.results.Fields[j].FieldType
  25. //fmt.Println(" --coluType: ", coluType, row.results.Fields[j].typeDatabaseName())
  26. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  27. dest[j] = nil
  28. } else {
  29. switch coluType {
  30. case fieldType_BINARY,
  31. fieldType_CLOB,
  32. fieldType_BLOB:
  33. fmt.Println(row.results.Values[j][row.results.rowIdx].Col_Data)
  34. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  35. case fieldType_INTERVAL_Y, fieldType_INTERVAL_M, fieldType_INTERVAL_D,
  36. fieldType_INTERVAL_H, fieldType_INTERVAL_S,
  37. fieldType_INTERVAL_MI:
  38. dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  39. case fieldType_TIME,
  40. fieldType_TIME_TZ:
  41. timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  42. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  43. tv := time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Millisecond * time.Duration(timeTmp)))
  44. utcTime := tv.UTC()
  45. dest[j] = utcTime
  46. case fieldType_DATE:
  47. timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  48. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  49. tv := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Hour * 24 * time.Duration(timeTmp)))
  50. utcTime := tv.UTC()
  51. dest[j] = utcTime
  52. // fmt.Println(string(row.results.Values[j][row.results.rowIdx].Col_Data))
  53. // tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  54. // dest[j] = tv
  55. case fieldType_DATETIME,
  56. fieldType_DATETIME_TZ:
  57. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  58. dest[j] = nil
  59. } else {
  60. //timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
  61. timeTmp := binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data)
  62. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  63. tv := time.Unix(0, int64(timeTmp)*1000000)
  64. utcTime := tv.UTC()
  65. dest[j] = utcTime
  66. }
  67. case fieldType_R4:
  68. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  69. dest[j] = nil
  70. } else {
  71. dest[j] = math.Float32frombits(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  72. }
  73. case fieldType_R8:
  74. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  75. dest[j] = nil
  76. } else {
  77. dest[j] = math.Float64frombits(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  78. }
  79. case fieldType_NUM:
  80. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  81. case fieldType_I1:
  82. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  83. dest[j] = nil
  84. } else {
  85. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  86. }
  87. case fieldType_I2:
  88. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  89. dest[j] = nil
  90. } else {
  91. dest[j] = int16(binary.BigEndian.Uint16(row.results.Values[j][row.results.rowIdx].Col_Data))
  92. }
  93. case fieldType_I4:
  94. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  95. dest[j] = nil
  96. } else {
  97. dest[j] = int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  98. }
  99. case fieldType_I8:
  100. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  101. dest[j] = nil
  102. } else {
  103. dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  104. //dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  105. }
  106. case fieldType_CHAR, fieldType_NCHAR:
  107. if row.results.Values[j][row.results.rowIdx].Col_Data == nil {
  108. dest[j] = string("")
  109. } else if row.results.Values[j][row.results.rowIdx].Col_Data[0] == 0x00 {
  110. dest[j] = string("")
  111. } else {
  112. dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
  113. }
  114. default:
  115. //填入一行的数据
  116. //TODO这里长度改为一行长度
  117. dest[j] = make([]byte, len(row.results.Values))
  118. // Values[字段][0]
  119. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  120. }
  121. }
  122. }
  123. row.results.rowIdx++
  124. return nil
  125. }
  126. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  127. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  128. func (row *xuguRows) Columns() []string {
  129. var columns []string
  130. for _, v := range row.results.Fields {
  131. columns = append(columns, v.FieldName)
  132. }
  133. return columns
  134. }
  135. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  136. fmt.Println(">>>>>ColumnTypeScanType ")
  137. return row.results.Fields[index].scanType()
  138. }
  139. func (self *xuguRows) Close() error {
  140. return nil
  141. }