xugu_rows.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package xugu
  2. import (
  3. "database/sql/driver"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  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. fmt.Println("rowIdx", row.results.rowIdx, len(row.results.Values[0]))
  20. if row.results.rowIdx >= len(row.results.Values[0]) {
  21. return errors.New("The result set has been released")
  22. }
  23. // fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num))
  24. fmt.Printf("这个 %#v", row.results.Values)
  25. for j := 0; j < int(row.results.Field_Num); j++ {
  26. coluType := row.results.Fields[j].FieldType
  27. //fmt.Println(" --coluType: ", coluType, row.results.Fields[j].typeDatabaseName())
  28. switch coluType {
  29. case fieldType_DATE:
  30. case fieldType_BINARY,
  31. fieldType_CLOB,
  32. fieldType_BLOB:
  33. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  34. case fieldType_TIME,
  35. fieldType_TIME_TZ:
  36. tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  37. dest[j] = tv
  38. case fieldType_DATETIME,
  39. fieldType_DATETIME_TZ:
  40. tv, _ := time.Parse("2006-01-02 15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  41. dest[j] = tv
  42. case fieldType_I1:
  43. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  44. case fieldType_I4:
  45. dest[j] = binary.LittleEndian.Uint32(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data))
  46. case fieldType_CHAR:
  47. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  48. default:
  49. //填入一行的数据
  50. //TODO这里长度改为一行长度
  51. dest[j] = make([]byte, len(row.results.Values))
  52. // Values[字段][0]
  53. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  54. }
  55. }
  56. row.results.rowIdx++
  57. return nil
  58. }
  59. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  60. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  61. func (row *xuguRows) Columns() []string {
  62. gt("Columns()")
  63. defer gt("Columns() end")
  64. var columns []string
  65. for i, v := range row.results.Fields {
  66. columns = append(columns, v.FieldName)
  67. fmt.Printf("append(columns, v.FieldName) 个数%d ,v: %s\n", i+1, columns[i])
  68. }
  69. return columns
  70. }
  71. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  72. fmt.Println(">>>>>ColumnTypeScanType ")
  73. fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].FieldType)
  74. fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].scanType())
  75. return row.results.Fields[index].scanType()
  76. }
  77. func (self *xuguRows) Close() error {
  78. fmt.Println(">>>>>((self *xuguRows) Close() ")
  79. return nil
  80. }