xugu_rows.go 3.5 KB

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