xugu_rows.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. switch coluType {
  27. case fieldType_BINARY,
  28. fieldType_CLOB,
  29. fieldType_BLOB:
  30. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  31. case fieldType_INTERVAL_Y, fieldType_INTERVAL_M, fieldType_INTERVAL_D,
  32. fieldType_INTERVAL_H, fieldType_INTERVAL_S,
  33. fieldType_INTERVAL_MI:
  34. dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  35. case fieldType_TIME,
  36. fieldType_TIME_TZ, fieldType_DATE:
  37. tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  38. dest[j] = tv
  39. case fieldType_DATETIME,
  40. fieldType_DATETIME_TZ:
  41. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  42. dest[j] = nil
  43. } else {
  44. //timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
  45. timeTmp := binary.BigEndian.Uint64(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.Unix(0, int64(timeTmp)*1000000)
  48. utcTime := tv.UTC()
  49. dest[j] = utcTime
  50. }
  51. case fieldType_R4:
  52. dest[j] = math.Float32frombits(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
  53. case fieldType_R8:
  54. dest[j] = math.Float64frombits(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  55. case fieldType_NUM:
  56. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  57. case fieldType_I1:
  58. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  59. dest[j] = nil
  60. } else {
  61. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  62. }
  63. case fieldType_I2:
  64. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  65. dest[j] = nil
  66. } else {
  67. dest[j] = int16(binary.BigEndian.Uint16(row.results.Values[j][row.results.rowIdx].Col_Data))
  68. }
  69. case fieldType_I4:
  70. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  71. dest[j] = nil
  72. } else {
  73. dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  74. }
  75. case fieldType_I8:
  76. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  77. dest[j] = nil
  78. } else {
  79. dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  80. //dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  81. }
  82. case fieldType_CHAR, fieldType_NCHAR:
  83. if row.results.Values[j][row.results.rowIdx].Col_Data == nil {
  84. dest[j] = string("")
  85. } else if row.results.Values[j][row.results.rowIdx].Col_Data[0] == 0x00 {
  86. dest[j] = string("")
  87. } else {
  88. dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
  89. }
  90. default:
  91. //填入一行的数据
  92. //TODO这里长度改为一行长度
  93. dest[j] = make([]byte, len(row.results.Values))
  94. // Values[字段][0]
  95. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  96. }
  97. }
  98. row.results.rowIdx++
  99. return nil
  100. }
  101. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  102. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  103. func (row *xuguRows) Columns() []string {
  104. var columns []string
  105. for _, v := range row.results.Fields {
  106. columns = append(columns, v.FieldName)
  107. }
  108. return columns
  109. }
  110. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  111. fmt.Println(">>>>>ColumnTypeScanType ")
  112. return row.results.Fields[index].scanType()
  113. }
  114. func (self *xuguRows) Close() error {
  115. return nil
  116. }