xugu_rows.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package xugu
  2. // /查询结果:driver.Rows
  3. import (
  4. "database/sql/driver"
  5. "encoding/binary"
  6. "errors"
  7. "fmt"
  8. "reflect"
  9. "time"
  10. )
  11. // type Row struct {
  12. // // Data information storage carrier of each column in the result set
  13. // columns []FieldDescri
  14. // // The name of each column in the result set of the current query
  15. // names []string
  16. // done bool
  17. // }
  18. type xuguRows struct {
  19. // A context handle pointer, which can be used to obtain
  20. // information about the result set
  21. //result unsafe.Pointer
  22. results *SelectResult
  23. // The return value of the function cgo_xgc_read_next()
  24. lastRowRelt int
  25. // The return value of the function cgo_xgc_next_result()
  26. lastRelt int
  27. // Boolean value, used to identify whether the executed
  28. // SQL statement has been prepared
  29. prepared bool
  30. // Context connection handle pointer
  31. rows_conn *xuguConn
  32. //rowset Row
  33. }
  34. // Next用于把数据集中的下一行填入提供的slice中。该slice的
  35. // 长度应该跟Columns()的长度一致
  36. //
  37. // 当没有数据行时,Next应该返回io.EOF
  38. //
  39. // dest不应被声明在Next之外(应该作为Next的一个成员变量)
  40. // 关闭Rows时应特别注意,不要修改dest中缓冲区的值
  41. func (row *xuguRows) Next(dest []driver.Value) error {
  42. fmt.Println(">>>>>(self *xuguRows) Next() ")
  43. if row.results.rowIdx >= len(row.results.Values[0]) {
  44. return errors.New("The result set has been released")
  45. }
  46. // fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num))
  47. for j := 0; j < int(row.results.Field_Num); j++ {
  48. coluType := row.results.Fields[j].FieldType
  49. //fmt.Println(" --coluType: ", coluType, row.results.Fields[j].typeDatabaseName())
  50. switch coluType {
  51. case fieldType_DATE:
  52. case fieldType_BINARY,
  53. fieldType_CLOB,
  54. fieldType_BLOB:
  55. fmt.Println("这是 fieldType_BINARY")
  56. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  57. case fieldType_TIME,
  58. fieldType_TIME_TZ:
  59. tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  60. dest[j] = tv
  61. case fieldType_DATETIME,
  62. fieldType_DATETIME_TZ:
  63. tv, _ := time.Parse("2006-01-02 15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
  64. dest[j] = tv
  65. case fieldType_I1:
  66. dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
  67. case fieldType_I4:
  68. dest[j] = binary.LittleEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
  69. default:
  70. //填入一行的数据
  71. //TODO这里长度改为一行长度
  72. dest[j] = make([]byte, len(row.results.Values))
  73. // Values[字段][0]
  74. dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
  75. }
  76. }
  77. row.results.rowIdx++
  78. return nil
  79. }
  80. // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
  81. // 如果不知道特定的列名,应该为该条目返回一个空的字符串
  82. func (row *xuguRows) Columns() []string {
  83. fmt.Println(">>>>>(self *xuguRows) Columns() ")
  84. // if row.results == nil {
  85. // return nil
  86. // }
  87. // if row.results.Fields != nil {
  88. // //return self.results.Fields
  89. // }
  90. //columns := make([]string, int(row.results.Field_Num))
  91. var columns []string
  92. for i, v := range row.results.Fields {
  93. columns = append(columns, v.FieldName)
  94. fmt.Printf("append(columns, v.FieldName) 个数%d ,v: %s\n", i+1, columns[i])
  95. }
  96. // fmt.Println(" -columns len ", len(columns))
  97. // for i, v := range columns {
  98. // fmt.Println(" -columns: ", i, v)
  99. // }
  100. return columns
  101. }
  102. func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
  103. fmt.Println(">>>>>ColumnTypeScanType ")
  104. fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].FieldType)
  105. fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].scanType())
  106. return row.results.Fields[index].scanType()
  107. }
  108. func (self *xuguRows) Close() error {
  109. fmt.Println(">>>>>((self *xuguRows) Close() ")
  110. return nil
  111. }