xugu_rows.go 5.4 KB

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