xugu_prepare.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package xugu
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. const RETURN_PREPARE_SELECT = 19665
  7. func xgCmdPrepare(pconn *xuguConn, cmd_sql string, prepareName *string) (int, error) {
  8. fmt.Println("\n>>>>>xgCmdPrepare")
  9. sqlRet := fmt.Sprintf("PREPARE %s AS %s", *prepareName, cmd_sql)
  10. //上锁
  11. //lockConnect(pconn)
  12. pconn.mu.Lock()
  13. SockSendCommand0(pconn, sqlRet)
  14. var ch byte
  15. var ret int
  16. for {
  17. recvRet, err := rhRecvChar(pconn, &ch)
  18. if err != nil {
  19. return 0, err
  20. }
  21. if !recvRet {
  22. pconn.mu.Unlock()
  23. return -4, errors.New("XG_NET_ERROR")
  24. }
  25. //A: SelectResult A在协议里为select返回
  26. if ch == 'A' {
  27. // pres := Result{}
  28. // pres.Type = HT_RS
  29. // ret, err = recvFiledsInfo(pconn, &pres)
  30. // if err != nil {
  31. // return ret, err
  32. // }
  33. // pconn.presPrepareCata = &pres
  34. ret = RETURN_PREPARE_SELECT
  35. continue
  36. } else if ch == '$' {
  37. var params XGCSParam
  38. params.Type = HT_PARAMS
  39. params.ImpExpType = 2
  40. recvParamsInfo2(pconn, &params)
  41. pconn.params = &params
  42. continue
  43. } else if ch == 'K' {
  44. pconn.havePrepare = 1
  45. } else {
  46. var errStr []byte
  47. ret, err = rhRecvStr(pconn, &errStr)
  48. if ret < 0 || err != nil {
  49. pconn.mu.Unlock()
  50. return ret, err
  51. }
  52. pconn.errStr = errStr
  53. ret = XG_ERROR
  54. rhRecvChar(pconn, &ch)
  55. if ch != 'K' {
  56. pconn.bkChar = ch
  57. continue
  58. }
  59. }
  60. break
  61. }
  62. pconn.mu.Unlock()
  63. return ret, nil
  64. }
  65. func xgCmdUnprepare(pConn *xuguConn, prepareName string) int {
  66. fmt.Println("\n>>>>>xgCmdUnprepare")
  67. var ch byte
  68. var err error
  69. ret := XG_OK
  70. sql := fmt.Sprintf("DEALLOCATE %s ", prepareName)
  71. pConn.mu.Lock()
  72. SockSendCommand0(pConn, sql)
  73. boolRet, err := rhRecvChar(pConn, &ch)
  74. fmt.Println("rhRecvChar => ch ", ch)
  75. if boolRet || err != nil {
  76. ret = XG_NET_ERROR
  77. } else if ch == 'K' {
  78. pConn.havePrepare = 0
  79. } else {
  80. pConn.havePrepare = 0
  81. var errStre []byte
  82. ret, err = rhRecvStr(pConn, &errStre)
  83. if err != nil || ret < 0 {
  84. pConn.mu.Unlock()
  85. return ret
  86. }
  87. rhRecvChar(pConn, &ch)
  88. ret = XG_ERROR
  89. }
  90. pConn.mu.Unlock()
  91. return 0
  92. }
  93. // execute for prepare2
  94. /* XGC_Execute2 综合执行文件 与 prepare2配合使用
  95. * p_conn 连接句柄
  96. * prepare_name 准备的prepare, 如果 prepare2(conn,NULL) 那么这里就是执行 XGC_Execute2(p_conn,NULL,NULL,&p_result)
  97. * servercursor_name ,生成的服务器端游标, 如果 prepare2(conn,prepare_name) , 那么这里就是执行 XGC_Execute2(p_conn,prepare_name,servercursor_name,NULL)
  98. * p_res 结果集指针, 其中 servercursor_name 与 pres 不同时并存
  99. */
  100. func XGC_Execute(pConn *xuguConn, sql string) int {
  101. fmt.Println("\n ---XGC_Execute")
  102. //发送没有参数的sql
  103. SockSendCommand0(pConn, sql)
  104. return 0
  105. }
  106. func send_params(p_conn *xuguConn, p_params *XGCSParam) {
  107. fmt.Println("--- send_params(p_conn *xuguConn, p_params *XGCSParam)")
  108. }