123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package xugu
- import (
- "errors"
- "fmt"
- )
- const RETURN_PREPARE_SELECT = 19665
- func xgCmdPrepare(pconn *xuguConn, cmd_sql string, prepareName *string) (int, error) {
- fmt.Println("\n>>>>>xgCmdPrepare")
- sqlRet := fmt.Sprintf("PREPARE %s AS %s", *prepareName, cmd_sql)
- //上锁
- //lockConnect(pconn)
- pconn.mu.Lock()
- SockSendCommand0(pconn, sqlRet)
- var ch byte
- var ret int
- for {
- recvRet, err := rhRecvChar(pconn, &ch)
- if err != nil {
- return 0, err
- }
- if !recvRet {
- pconn.mu.Unlock()
- return -4, errors.New("XG_NET_ERROR")
- }
- //A: SelectResult A在协议里为select返回
- if ch == 'A' {
- // pres := Result{}
- // pres.Type = HT_RS
- // ret, err = recvFiledsInfo(pconn, &pres)
- // if err != nil {
- // return ret, err
- // }
- // pconn.presPrepareCata = &pres
- ret = RETURN_PREPARE_SELECT
- continue
- } else if ch == '$' {
- var params XGCSParam
- params.Type = HT_PARAMS
- params.ImpExpType = 2
- recvParamsInfo2(pconn, ¶ms)
- pconn.params = ¶ms
- continue
- } else if ch == 'K' {
- pconn.havePrepare = 1
- } else {
- var errStr []byte
- ret, err = rhRecvStr(pconn, &errStr)
- if ret < 0 || err != nil {
- pconn.mu.Unlock()
- return ret, err
- }
- pconn.errStr = errStr
- ret = XG_ERROR
- rhRecvChar(pconn, &ch)
- if ch != 'K' {
- pconn.bkChar = ch
- continue
- }
- }
- break
- }
- pconn.mu.Unlock()
- return ret, nil
- }
- func xgCmdUnprepare(pConn *xuguConn, prepareName string) int {
- fmt.Println("\n>>>>>xgCmdUnprepare")
- var ch byte
- var err error
- ret := XG_OK
- sql := fmt.Sprintf("DEALLOCATE %s ", prepareName)
- pConn.mu.Lock()
- SockSendCommand0(pConn, sql)
- boolRet, err := rhRecvChar(pConn, &ch)
- fmt.Println("rhRecvChar => ch ", ch)
- if boolRet || err != nil {
- ret = XG_NET_ERROR
- } else if ch == 'K' {
- pConn.havePrepare = 0
- } else {
- pConn.havePrepare = 0
- var errStre []byte
- ret, err = rhRecvStr(pConn, &errStre)
- if err != nil || ret < 0 {
- pConn.mu.Unlock()
- return ret
- }
- rhRecvChar(pConn, &ch)
- ret = XG_ERROR
- }
- pConn.mu.Unlock()
- return 0
- }
- // execute for prepare2
- /* XGC_Execute2 综合执行文件 与 prepare2配合使用
- * p_conn 连接句柄
- * prepare_name 准备的prepare, 如果 prepare2(conn,NULL) 那么这里就是执行 XGC_Execute2(p_conn,NULL,NULL,&p_result)
- * servercursor_name ,生成的服务器端游标, 如果 prepare2(conn,prepare_name) , 那么这里就是执行 XGC_Execute2(p_conn,prepare_name,servercursor_name,NULL)
- * p_res 结果集指针, 其中 servercursor_name 与 pres 不同时并存
- */
- func XGC_Execute(pConn *xuguConn, sql string) int {
- fmt.Println("\n ---XGC_Execute")
- //发送没有参数的sql
- SockSendCommand0(pConn, sql)
- return 0
- }
- func send_params(p_conn *xuguConn, p_params *XGCSParam) {
- fmt.Println("--- send_params(p_conn *xuguConn, p_params *XGCSParam)")
- }
|