package xugu import ( "bytes" "context" "encoding/binary" "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("向数据库发起连接失败") } fmt.Println("数据已发送:", dsnMessage) buffer := make([]byte, 1) n, err := pConn.conn.Read(buffer) if err != nil { return errors.New("接收数据库连接失败:") } fmt.Println("读取数据库服务返回:", string(buffer[:n])) if !bytes.Equal(buffer[:n], []byte("K")) { return errors.New("数据库连接失败") } else { return nil } } func sockSendPutStatement(pConn *xuguConn, sql []byte, values *[]xuguValue, paramCount int) error { if pConn.sendBuff.Len() > 0 { //将缓冲区重置为空 pConn.sendBuff.Reset() } // ? pConn.sendBuff.Write([]byte("?")) fmt.Println("?", pConn.sendBuff.Bytes()) // Comand_Len sqlLength := uint32(len(sql)) var networkBytes [4]byte binary.BigEndian.PutUint32(networkBytes[:], sqlLength) pConn.sendBuff.Write(networkBytes[:]) fmt.Println("Comand_Len", pConn.sendBuff.Bytes()) // Comand_str pConn.sendBuff.Write(sql) //'0' end binary.BigEndian.PutUint32(networkBytes[:], 0) pConn.sendBuff.Write([]byte{0}) fmt.Println("Comand_str + 0", pConn.sendBuff.Bytes()) // Param_num if paramCount <= 0 { var Param_num [4]byte binary.BigEndian.PutUint32(Param_num[:], 0) pConn.sendBuff.Write(Param_num[:]) } else { fmt.Println("paramCount> 0: ", paramCount) var networkBytes [2]byte binary.BigEndian.PutUint16(networkBytes[:], uint16(paramCount)) pConn.sendBuff.Write(networkBytes[:]) fmt.Println("Param_num", pConn.sendBuff.Bytes()) } fmt.Println("Param_num ", pConn.sendBuff.Bytes()) if values != nil { //当缓冲区大于8190字节时,直接发送 if pConn.sendBuff.Len() > 8190 { _, err := pConn.conn.Write(pConn.sendBuff.Bytes()) if err != nil { fmt.Println("sockSend Write failed: ", err) return err } } fmt.Println(" sendBuff ", pConn.sendBuff.Bytes()) //发送后续参数 // Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data } for _, value := range *values { //Param_name_len if value.paramName == nil { var Param_name_len [2]byte pConn.sendBuff.Write(Param_name_len[:]) fmt.Println("Param_name_len sendBuff ", pConn.sendBuff.Bytes()) //Param_name // var Param_name []byte // pConn.sendBuff.Write(Param_name) fmt.Println("Param_name_data sendBuff ", pConn.sendBuff.Bytes()) } else { var Param_name_len [2]byte fmt.Println("paramName ", value.paramName) binary.BigEndian.PutUint16(Param_name_len[:], uint16(len(value.paramName))) pConn.sendBuff.Write(Param_name_len[:]) fmt.Println("Param_name_len sendBuff ", pConn.sendBuff.Bytes()) //Param_name pConn.sendBuff.Write(value.paramName[:]) fmt.Println("Param_name_data sendBuff ", pConn.sendBuff.Bytes()) } //Param_INOUT Param_INOUT := [2]byte{0x1} pConn.sendBuff.Write(reverseBytes(Param_INOUT[:])) fmt.Println("Param_INOUT sendBuff ", pConn.sendBuff.Bytes()) //Param_DType var Param_DType [2]byte binary.BigEndian.PutUint16(Param_DType[:], uint16(value.types)) pConn.sendBuff.Write(Param_DType[:]) fmt.Println("Param_DType sendBuff ", pConn.sendBuff.Bytes()) //Param_Data_Len 根据DType 修改长度 //if value.types var Param_Data_Len [4]byte binary.BigEndian.PutUint32(Param_Data_Len[:], uint32(8)) pConn.sendBuff.Write(Param_Data_Len[:]) fmt.Println("Param_Data_Len sendBuff ", pConn.sendBuff.Bytes()) //Param_Data 根据DType 修改长度 var Param_Data [7]byte pConn.sendBuff.Write([]byte(Param_Data[:])) pConn.sendBuff.Write([]byte(value.value)) //binary.BigEndian.PutUint32(networkBytes[:], 0) // pConn.sendBuff.Write([]byte{0}) // fmt.Println("Param_Data sendBuff ", pConn.sendBuff.Bytes()) } } fmt.Println("SockSendPutStatement msg: ", pConn.sendBuff.String()) fmt.Println("SockSendPutStatement msg: ", pConn.sendBuff.Bytes()) return nil } func sockSendExecute(pConn *xuguConn) error { fmt.Println("\n ---sockSendExecute") fmt.Println("SockSendExecute msg: ", pConn.sendBuff.String()) _, err := pConn.conn.Write(pConn.sendBuff.Bytes()) if err != nil { return err } fmt.Println("\n ---sockSendExecute end") return nil } func xuguSockRecvMsg(pConn *xuguConn) (*allResult, 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 } pConn.readBuff.reset() return rs, nil }