package xugu import ( "context" "errors" "fmt" ) func xgSockOpenConn(ctx context.Context, pConn *xuguConn) error { fmt.Println(" ---xgSockOpenConn(ctx context.Context, pConn *xuguConn)") //发送 //fmt.Printf("login database = '%s' user = '%s' password = '%s' version='201' ", pConn.Database, pConn.User, pConn.Password) // message := "login database = 'SYSTEM' user = 'SYSDBA' password = 'SYSDBA' version='201' " dsnMessage := generateLoginString(pConn.dsnConfig) _, err := pConn.conn.Write([]byte(dsnMessage)) if err != nil { return errors.New("conn 发送数据库连接失败:") } fmt.Println("数据已发送:", dsnMessage) buffer := make([]byte, 1) n, err := pConn.conn.Read(buffer) if err != nil { return errors.New("conn 接收数据库连接相应失败:") } fmt.Println("读取数据库服务返回:", string(buffer[:n])) //SockSendCommand0(pConn, "set schema SYSTEM") return nil } // func xgSockPrepare(pConn *xuguConn, sql string, prepareName *string) (int, error) { // fmt.Println(">>>>>xgSockPrepare") // if "" == *prepareName { // ret := 0 // //p_params := &conn.params // if pConn.havePrepare != 0 { // ret = xgCmdUnprepare(pConn, pConn.prepareName) // if ret < 0 { // return ret, errors.New("XG_ERROR") // } // pConn.prepareName = "" // pConn.prepareName = fmt.Sprintf(pConn.prepareName+"STC%d", pConn.prepareNo) // ret, err := xgCmdPrepare(pConn, sql, &pConn.prepareName) // if err != nil { // return ret, err // } // } // return ret, errors.New("xgSockPrepare_ERROR") // } // ret := 0 // // XGCSParam* p_params= pconn->params; // old_p := pConn.havePrepare // // char* sql=strdup(cmd_sql); // *prepareName = fmt.Sprintf("STC%d", pConn.prepareNo) // pConn.prepareNo++ // 递增 prepare_no 的值 // ret, err := xgCmdPrepare(pConn, sql, &pConn.prepareName) // if err != nil { // return 0, err // } // pConn.havePrepare = old_p // this keeped by prepare_name // return ret, nil // } func parseMsg(readBuf *buffer, pConn *xuguConn) (rs *xuguResult, err error) { result := &xuguResult{ affectedRows: 0, insertId: 0, } for { char := readBuf.peekChar() fmt.Println("parseMsg 内的 peekChar: ", char, "-", string(char)) switch char { case 'K': fmt.Println("消息类型为K") // readBuf.buf = make([]byte, 2048) //readBuf.idx++ readBuf.buf = make([]byte, 2048) readBuf.idx = 0 return result, nil case '$': readBuf.idx++ fmt.Println("消息类型为$") parseFormArgDescri(readBuf) case 'A': readBuf.idx++ fmt.Println("消息类型为A") parseSelectResult(readBuf) case 'I': readBuf.idx++ fmt.Println("消息类型为I") parseInsertResult(readBuf) case 'U': fmt.Println("消息类型为U") readBuf.idx++ parseUpdateResult(readBuf) case 'D': fmt.Println("消息类型为D") readBuf.idx++ parseDeleteResult(readBuf) case 'E': fmt.Println("消息类型为E") readBuf.idx++ pErr, err := parseErrInfo(readBuf) if err != nil { return nil, err } // fmt.Println("E ReadBuf : ", readBuf.buf[readBuf.idx:]) // fmt.Println("E ReadBuf string: ", string(readBuf.buf[readBuf.idx:])) pConn.errStr = pErr.ErrStr // char := readBuf.peekChar() // fmt.Println("Exec 内的 peekChar: ", char) case 'W': fmt.Println("消息类型为W") readBuf.idx++ parseWarnInfo(readBuf) case 'M': fmt.Println("消息类型为M") readBuf.idx++ parseMessage(readBuf) default: fmt.Println("消息类型为其他") return nil, errors.New("parseMsg: unknown message type") } } } func xuguSockRecvMsg(pConn *xuguConn) (rs *xuguResult, err error) { pConn.conn.Read(pConn.readBuff.buf) fmt.Println("pConn.readBuff.buf ::", pConn.readBuff.buf, string(pConn.readBuff.buf)) rs, err = parseMsg(&pConn.readBuff, pConn) if err != nil { fmt.Println("xuguPrepare parseMsg(&pConn.readBuff, pConn)") return nil, err } return rs, nil }