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)") }