xugu_sock.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package xugu
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/binary"
  6. "errors"
  7. "fmt"
  8. )
  9. func xgSockOpenConn(ctx context.Context, pConn *xuguConn) error {
  10. fmt.Println(" ---xgSockOpenConn(ctx context.Context, pConn *xuguConn)")
  11. //发送
  12. //fmt.Printf("login database = '%s' user = '%s' password = '%s' version='201' ", pConn.Database, pConn.User, pConn.Password)
  13. // message := "login database = 'SYSTEM' user = 'SYSDBA' password = 'SYSDBA' version='201' "
  14. dsnMessage := generateLoginString(pConn.dsnConfig)
  15. _, err := pConn.conn.Write([]byte(dsnMessage))
  16. if err != nil {
  17. return errors.New("向数据库发起连接失败")
  18. }
  19. fmt.Println("数据已发送:", dsnMessage)
  20. buffer := make([]byte, 1)
  21. n, err := pConn.conn.Read(buffer)
  22. if err != nil {
  23. return errors.New("接收数据库连接失败:")
  24. }
  25. if !bytes.Equal(buffer[:n], []byte("K")) {
  26. return errors.New("数据库连接失败")
  27. } else {
  28. return nil
  29. }
  30. }
  31. func sockSendPutStatement(pConn *xuguConn, sql []byte, values *[]xuguValue, paramCount int) error {
  32. if pConn.sendBuff.Len() > 0 {
  33. //将缓冲区重置为空
  34. pConn.sendBuff.Reset()
  35. }
  36. // ?
  37. pConn.sendBuff.Write([]byte("?"))
  38. // Comand_Len
  39. sqlLength := uint32(len(sql))
  40. var networkBytes [4]byte
  41. binary.BigEndian.PutUint32(networkBytes[:], sqlLength)
  42. pConn.sendBuff.Write(networkBytes[:])
  43. fmt.Println("sqlLength", sqlLength)
  44. // Comand_str
  45. pConn.sendBuff.Write(sql)
  46. fmt.Println("Comand_str", sql, string(sql))
  47. //'0' end
  48. binary.BigEndian.PutUint32(networkBytes[:], 0)
  49. pConn.sendBuff.Write([]byte{0})
  50. fmt.Println("0", 0)
  51. // Param_num
  52. var Param_num [4]byte
  53. binary.BigEndian.PutUint32(Param_num[:], uint32(paramCount))
  54. pConn.sendBuff.Write(Param_num[:])
  55. fmt.Println("Param_num", paramCount)
  56. if values != nil {
  57. //当缓冲区大于8190字节时,直接发送
  58. // if pConn.sendBuff.Len() > 8190 {
  59. // _, err := pConn.conn.Write(pConn.sendBuff.Bytes())
  60. // if err != nil {
  61. // fmt.Println("sockSend Write failed: ", err)
  62. // return err
  63. // }
  64. // }
  65. //发送后续参数
  66. // Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }
  67. for i, value := range *values {
  68. fmt.Println("循环 ", i)
  69. //Param_name_len
  70. if value.paramName == nil {
  71. var Param_name_len [2]byte
  72. pConn.sendBuff.Write(Param_name_len[:])
  73. fmt.Println("Param_name_len", Param_name_len)
  74. //Param_name
  75. // var Param_name []byte
  76. // pConn.sendBuff.Write(Param_name)
  77. } else {
  78. var Param_name_len [2]byte
  79. binary.BigEndian.PutUint16(Param_name_len[:], uint16(len(value.paramName)))
  80. pConn.sendBuff.Write(Param_name_len[:])
  81. //Param_name
  82. pConn.sendBuff.Write(value.paramName[:])
  83. }
  84. //Param_INOUT
  85. Param_INOUT := [2]byte{0x1}
  86. pConn.sendBuff.Write(reverseBytes(Param_INOUT[:]))
  87. //Param_DType
  88. var Param_DType [2]byte
  89. binary.BigEndian.PutUint16(Param_DType[:], uint16(value.types))
  90. pConn.sendBuff.Write(Param_DType[:])
  91. fmt.Println("Param_DType: ", Param_DType)
  92. //Param_Data_Len 根据DType 修改长度
  93. Param_Data_Len := make([]byte, 4)
  94. binary.BigEndian.PutUint32(Param_Data_Len[:], uint32(value.valueLength))
  95. pConn.sendBuff.Write(Param_Data_Len[:])
  96. fmt.Println("Param_Data_Len: ", Param_Data_Len)
  97. //Param_Data 根据DType 修改长度
  98. //Param_Data := make([]byte, value.valueLength)
  99. pConn.sendBuff.Write([]byte(value.value))
  100. fmt.Println("Param_Data: ", []byte(value.value))
  101. }
  102. }
  103. return nil
  104. }
  105. func sockSendExecute(pConn *xuguConn) error {
  106. fmt.Println("\n ---sockSendExecute")
  107. // fmt.Println("SockSendExecute msg: ", pConn.sendBuff.String())
  108. _, err := pConn.conn.Write(pConn.sendBuff.Bytes())
  109. if err != nil {
  110. return err
  111. }
  112. fmt.Println("\n ---sockSendExecute end")
  113. return nil
  114. }
  115. func xuguSockRecvMsg(pConn *xuguConn) (*allResult, error) {
  116. n, _ := pConn.conn.Read(pConn.readBuff.buf)
  117. pConn.readBuff.length += n
  118. rs, err := parseMsg(&pConn.readBuff, pConn)
  119. if err != nil {
  120. fmt.Println("xuguPrepare parseMsg(&pConn.readBuff, pConn)")
  121. return nil, err
  122. }
  123. pConn.readBuff.reset()
  124. return rs, nil
  125. }