xugu_stmt.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package xugu
  2. import (
  3. "database/sql/driver"
  4. "errors"
  5. "fmt"
  6. )
  7. type xuguStmt struct {
  8. // 上下文连接句柄指针
  9. stmt_conn *xuguConn
  10. // 布尔值,用于标识执行的 SQL 语句是否已准备好
  11. prepared bool
  12. // 接受准备好的 SQL 语句的代码
  13. prename []byte
  14. // 布尔值,用于标识游标是否启用
  15. curopend bool
  16. // 游标名称
  17. curname []byte
  18. // 执行的 SQL 语句中的参数数量
  19. paramCount int
  20. mysql string
  21. //需替换的参数字段信息
  22. //parser *xuguParse
  23. }
  24. func (stmt *xuguStmt) Close() error {
  25. fmt.Println("\n>>>>>> (stmt *xuguStmt) Close method called")
  26. return nil
  27. }
  28. func (stmt *xuguStmt) NumInput() int {
  29. fmt.Println("\n>>>>>(stmt *xuguStmt) NumInput()")
  30. fmt.Println("stmt.mysql: ", stmt.mysql)
  31. return assertParamCount(stmt.mysql)
  32. //return 0
  33. }
  34. func (stmt *xuguStmt) Exec(args []driver.Value) (driver.Result, error) {
  35. gt("stmt Exec")
  36. defer gt("stmt Exec end")
  37. stmt.stmt_conn.mu.Lock()
  38. defer stmt.stmt_conn.mu.Unlock()
  39. //send msg
  40. //如果有参数
  41. if stmt.paramCount > 0 && len(args) > 0 {
  42. values := []xuguValue{}
  43. for _, param := range args {
  44. assertParamType(param, &values)
  45. //fmt.Printf("Field Name: %s, Field Type: %s, Field Value: %v\n", v1, v1, v1)
  46. }
  47. sockSendPutStatement(stmt.stmt_conn, stmt.prename, &values, stmt.paramCount)
  48. sockSendExecute(stmt.stmt_conn)
  49. //没有参数
  50. } else {
  51. sockSendPutStatement(stmt.stmt_conn, []byte(stmt.mysql), nil, 0)
  52. sockSendExecute(stmt.stmt_conn)
  53. }
  54. //recv msg
  55. aR, err := xuguSockRecvMsg(stmt.stmt_conn)
  56. if err != nil {
  57. return nil, err
  58. }
  59. switch aR.rt {
  60. case selectResult:
  61. return nil, errors.New("exec is Query error")
  62. case errInfo:
  63. return nil, errors.New(string(aR.e.ErrStr))
  64. case warnInfo:
  65. return nil, errors.New(string(aR.w.WarnStr))
  66. default:
  67. return &xuguResult{
  68. affectedRows: int64(0),
  69. insertId: int64(0),
  70. }, nil
  71. }
  72. }
  73. func (stmt *xuguStmt) Query(args []driver.Value) (driver.Rows, error) {
  74. gt("stmt Query")
  75. defer gt("stmt Query end")
  76. stmt.stmt_conn.mu.Lock()
  77. defer stmt.stmt_conn.mu.Unlock()
  78. //send msg
  79. //如果有参数
  80. if stmt.paramCount > 0 && len(args) > 0 {
  81. values := []xuguValue{}
  82. for _, param := range args {
  83. assertParamType(param, &values)
  84. //fmt.Printf("Field Name: %s, Field Type: %s, Field Value: %v\n", v1, v1, v1)
  85. }
  86. sockSendPutStatement(stmt.stmt_conn, stmt.prename, &values, stmt.paramCount)
  87. sockSendExecute(stmt.stmt_conn)
  88. //没有参数
  89. } else {
  90. sockSendPutStatement(stmt.stmt_conn, []byte(stmt.mysql), nil, 0)
  91. sockSendExecute(stmt.stmt_conn)
  92. }
  93. //recv msg
  94. aR, err := xuguSockRecvMsg(stmt.stmt_conn)
  95. if err != nil {
  96. return nil, err
  97. }
  98. switch aR.rt {
  99. case selectResult:
  100. fmt.Printf("selectResult %#v\n", aR.s)
  101. rows := &xuguRows{
  102. rows_conn: stmt.stmt_conn,
  103. results: aR.s,
  104. colIdx: 0,
  105. prepared: false,
  106. }
  107. return rows, nil
  108. case errInfo:
  109. return nil, errors.New(string(aR.e.ErrStr))
  110. case warnInfo:
  111. return nil, errors.New(string(aR.w.WarnStr))
  112. default:
  113. }
  114. return nil, errors.New("xugu Query error")
  115. }