xugu_rows.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package xugu
  2. import (
  3. "database/sql/driver"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  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. gt("Next()")
  18. defer gt("Next() end")
  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. // fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num))
  24. for j := 0; j < int(row.results.Field_Num); j++ {
  25. coluType := row.results.Fields[j].FieldType
  26. //fmt.Println(" --coluType: ", coluType, row.results.Fields[j].typeDatabaseName())
  27. switch coluType {
  28. case fieldType_DATE:
  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_TIME,
  34. fieldType_TIME_TZ:
  35. tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  36. dest[j] = tv
  37. case fieldType_DATETIME,
  38. fieldType_DATETIME_TZ:
  39. if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
  40. dest[j] = nil
  41. } else {
  42. //timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
  43. timeTmp := binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data)
  44. //tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
  45. tv := time.Unix(0, int64(timeTmp)*1000000)
  46. utcTime := tv.UTC()
  47. dest[j] = utcTime
  48. }
  49. case fieldType_I1:
  50. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  51. case fieldType_I4:
  52. dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  53. case fieldType_I8:
  54. dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
  55. //dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  56. case fieldType_CHAR, fieldType_NCHAR:
  57. dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
  58. default:
  59. //填入一行的数据
  60. //TODO这里长度改为一行长度
  61. dest[j] = make([]byte, len(row.results.Values))
  62. // Values[字段][0]
  63. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  64. }
  65. }
  66. row.results.rowIdx++
  67. return nil
  68. }
  69. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  70. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  71. func (row *xuguRows) Columns() []string {
  72. gt("Columns()")
  73. defer gt("Columns() end")
  74. var columns []string
  75. for _, v := range row.results.Fields {
  76. columns = append(columns, v.FieldName)
  77. }
  78. return columns
  79. }
  80. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  81. fmt.Println(">>>>>ColumnTypeScanType ")
  82. return row.results.Fields[index].scanType()
  83. }
  84. func (self *xuguRows) Close() error {
  85. fmt.Println(">>>>>((self *xuguRows) Close() ")
  86. return nil
  87. }