xugu_sock.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. fmt.Println("读取数据库服务返回:", string(buffer[:n]))
  26. if !bytes.Equal(buffer[:n], []byte("K")) {
  27. return errors.New("数据库连接失败")
  28. } else {
  29. return nil
  30. }
  31. }
  32. func sockSendPutStatement(pConn *xuguConn, sql []byte, values *[]xuguValue, paramCount int) error {
  33. if pConn.sendBuff.Len() > 0 {
  34. //将缓冲区重置为空
  35. pConn.sendBuff.Reset()
  36. }
  37. // ?
  38. pConn.sendBuff.Write([]byte("?"))
  39. fmt.Println("?", pConn.sendBuff.Bytes())
  40. // Comand_Len
  41. sqlLength := uint32(len(sql))
  42. var networkBytes [4]byte
  43. binary.BigEndian.PutUint32(networkBytes[:], sqlLength)
  44. pConn.sendBuff.Write(networkBytes[:])
  45. fmt.Println("Comand_Len", pConn.sendBuff.Bytes())
  46. // Comand_str
  47. pConn.sendBuff.Write(sql)
  48. //'0' end
  49. binary.BigEndian.PutUint32(networkBytes[:], 0)
  50. pConn.sendBuff.Write([]byte{0})
  51. fmt.Println("Comand_str + 0", pConn.sendBuff.Bytes())
  52. // Param_num
  53. if paramCount <= 0 {
  54. var Param_num [4]byte
  55. binary.BigEndian.PutUint32(Param_num[:], 0)
  56. pConn.sendBuff.Write(Param_num[:])
  57. } else {
  58. fmt.Println("paramCount> 0: ", paramCount)
  59. var networkBytes [2]byte
  60. binary.BigEndian.PutUint16(networkBytes[:], uint16(paramCount))
  61. pConn.sendBuff.Write(networkBytes[:])
  62. fmt.Println("Param_num", pConn.sendBuff.Bytes())
  63. }
  64. fmt.Println("Param_num ", pConn.sendBuff.Bytes())
  65. if values != nil {
  66. //当缓冲区大于8190字节时,直接发送
  67. if pConn.sendBuff.Len() > 8190 {
  68. _, err := pConn.conn.Write(pConn.sendBuff.Bytes())
  69. if err != nil {
  70. fmt.Println("sockSend Write failed: ", err)
  71. return err
  72. }
  73. }
  74. fmt.Println(" sendBuff ", pConn.sendBuff.Bytes())
  75. //发送后续参数
  76. // Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }
  77. for _, value := range *values {
  78. //Param_name_len
  79. if value.paramName == nil {
  80. var Param_name_len [2]byte
  81. pConn.sendBuff.Write(Param_name_len[:])
  82. fmt.Println("Param_name_len sendBuff ", pConn.sendBuff.Bytes())
  83. //Param_name
  84. // var Param_name []byte
  85. // pConn.sendBuff.Write(Param_name)
  86. fmt.Println("Param_name_data sendBuff ", pConn.sendBuff.Bytes())
  87. } else {
  88. var Param_name_len [2]byte
  89. fmt.Println("paramName ", value.paramName)
  90. binary.BigEndian.PutUint16(Param_name_len[:], uint16(len(value.paramName)))
  91. pConn.sendBuff.Write(Param_name_len[:])
  92. fmt.Println("Param_name_len sendBuff ", pConn.sendBuff.Bytes())
  93. //Param_name
  94. pConn.sendBuff.Write(value.paramName[:])
  95. fmt.Println("Param_name_data sendBuff ", pConn.sendBuff.Bytes())
  96. }
  97. //Param_INOUT
  98. Param_INOUT := [2]byte{0x1}
  99. pConn.sendBuff.Write(reverseBytes(Param_INOUT[:]))
  100. fmt.Println("Param_INOUT sendBuff ", pConn.sendBuff.Bytes())
  101. //Param_DType
  102. var Param_DType [2]byte
  103. binary.BigEndian.PutUint16(Param_DType[:], uint16(value.types))
  104. pConn.sendBuff.Write(Param_DType[:])
  105. fmt.Println("Param_DType sendBuff ", pConn.sendBuff.Bytes())
  106. //Param_Data_Len 根据DType 修改长度
  107. //if value.types
  108. var Param_Data_Len [4]byte
  109. binary.BigEndian.PutUint32(Param_Data_Len[:], uint32(8))
  110. pConn.sendBuff.Write(Param_Data_Len[:])
  111. fmt.Println("Param_Data_Len sendBuff ", pConn.sendBuff.Bytes())
  112. //Param_Data 根据DType 修改长度
  113. var Param_Data [7]byte
  114. pConn.sendBuff.Write([]byte(Param_Data[:]))
  115. pConn.sendBuff.Write([]byte(value.value))
  116. //binary.BigEndian.PutUint32(networkBytes[:], 0)
  117. // pConn.sendBuff.Write([]byte{0})
  118. // fmt.Println("Param_Data sendBuff ", pConn.sendBuff.Bytes())
  119. }
  120. }
  121. fmt.Println("SockSendPutStatement msg: ", pConn.sendBuff.String())
  122. fmt.Println("SockSendPutStatement msg: ", pConn.sendBuff.Bytes())
  123. return nil
  124. }
  125. func sockSendExecute(pConn *xuguConn) error {
  126. fmt.Println("\n ---sockSendExecute")
  127. fmt.Println("SockSendExecute msg: ", pConn.sendBuff.String())
  128. _, err := pConn.conn.Write(pConn.sendBuff.Bytes())
  129. if err != nil {
  130. return err
  131. }
  132. fmt.Println("\n ---sockSendExecute end")
  133. return nil
  134. }
  135. func xuguSockRecvMsg(pConn *xuguConn) (*allResult, error) {
  136. pConn.conn.Read(pConn.readBuff.buf)
  137. fmt.Println("pConn.readBuff.buf ::", pConn.readBuff.buf, string(pConn.readBuff.buf))
  138. rs, err := parseMsg(&pConn.readBuff, pConn)
  139. if err != nil {
  140. fmt.Println("xuguPrepare parseMsg(&pConn.readBuff, pConn)")
  141. return nil, err
  142. }
  143. pConn.readBuff.reset()
  144. return rs, nil
  145. }