xugu_stmt.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 updateResult:
  63. return &xuguResult{affectedRows: int64(aR.u.UpdateNum), insertId: int64(0)}, nil
  64. case insertResult:
  65. return &xuguResult{affectedRows: int64(0), insertId: int64(aR.i.RowidLen)}, nil
  66. case errInfo:
  67. return nil, errors.New(string(aR.e.ErrStr))
  68. case warnInfo:
  69. return nil, errors.New(string(aR.w.WarnStr))
  70. default:
  71. return &xuguResult{
  72. affectedRows: int64(0),
  73. insertId: int64(0),
  74. }, nil
  75. }
  76. }
  77. func (stmt *xuguStmt) Query(args []driver.Value) (driver.Rows, error) {
  78. gt("stmt Query")
  79. defer gt("stmt Query end")
  80. stmt.stmt_conn.mu.Lock()
  81. defer stmt.stmt_conn.mu.Unlock()
  82. //send msg
  83. //如果有参数
  84. if stmt.paramCount > 0 && len(args) > 0 {
  85. values := []xuguValue{}
  86. for _, param := range args {
  87. assertParamType(param, &values)
  88. //fmt.Printf("Field Name: %s, Field Type: %s, Field Value: %v\n", v1, v1, v1)
  89. }
  90. sockSendPutStatement(stmt.stmt_conn, stmt.prename, &values, stmt.paramCount)
  91. sockSendExecute(stmt.stmt_conn)
  92. //没有参数
  93. } else {
  94. sockSendPutStatement(stmt.stmt_conn, []byte(stmt.mysql), nil, 0)
  95. sockSendExecute(stmt.stmt_conn)
  96. }
  97. //recv msg
  98. aR, err := xuguSockRecvMsg(stmt.stmt_conn)
  99. if err != nil {
  100. return nil, err
  101. }
  102. switch aR.rt {
  103. case selectResult:
  104. rows := &xuguRows{
  105. rows_conn: stmt.stmt_conn,
  106. results: aR.s,
  107. colIdx: 0,
  108. prepared: false,
  109. }
  110. return rows, nil
  111. case errInfo:
  112. return nil, errors.New(string(aR.e.ErrStr))
  113. case warnInfo:
  114. return nil, errors.New(string(aR.w.WarnStr))
  115. default:
  116. }
  117. return nil, errors.New("xugu Query error")
  118. }