xugu_sock.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package xugu
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. )
  7. func xgSockOpenConn(ctx context.Context, pConn *xuguConn) error {
  8. fmt.Println(" ---xgSockOpenConn(ctx context.Context, pConn *xuguConn)")
  9. //发送
  10. //fmt.Printf("login database = '%s' user = '%s' password = '%s' version='201' ", pConn.Database, pConn.User, pConn.Password)
  11. // message := "login database = 'SYSTEM' user = 'SYSDBA' password = 'SYSDBA' version='201' "
  12. dsnMessage := generateLoginString(pConn.dsnConfig)
  13. _, err := pConn.conn.Write([]byte(dsnMessage))
  14. if err != nil {
  15. return errors.New("conn 发送数据库连接失败:")
  16. }
  17. fmt.Println("数据已发送:", dsnMessage)
  18. buffer := make([]byte, 1)
  19. n, err := pConn.conn.Read(buffer)
  20. if err != nil {
  21. return errors.New("conn 接收数据库连接相应失败:")
  22. }
  23. fmt.Println("读取数据库服务返回:", string(buffer[:n]))
  24. //SockSendCommand0(pConn, "set schema SYSTEM")
  25. return nil
  26. }
  27. // func xgSockPrepare(pConn *xuguConn, sql string, prepareName *string) (int, error) {
  28. // fmt.Println(">>>>>xgSockPrepare")
  29. // if "" == *prepareName {
  30. // ret := 0
  31. // //p_params := &conn.params
  32. // if pConn.havePrepare != 0 {
  33. // ret = xgCmdUnprepare(pConn, pConn.prepareName)
  34. // if ret < 0 {
  35. // return ret, errors.New("XG_ERROR")
  36. // }
  37. // pConn.prepareName = ""
  38. // pConn.prepareName = fmt.Sprintf(pConn.prepareName+"STC%d", pConn.prepareNo)
  39. // ret, err := xgCmdPrepare(pConn, sql, &pConn.prepareName)
  40. // if err != nil {
  41. // return ret, err
  42. // }
  43. // }
  44. // return ret, errors.New("xgSockPrepare_ERROR")
  45. // }
  46. // ret := 0
  47. // // XGCSParam* p_params= pconn->params;
  48. // old_p := pConn.havePrepare
  49. // // char* sql=strdup(cmd_sql);
  50. // *prepareName = fmt.Sprintf("STC%d", pConn.prepareNo)
  51. // pConn.prepareNo++ // 递增 prepare_no 的值
  52. // ret, err := xgCmdPrepare(pConn, sql, &pConn.prepareName)
  53. // if err != nil {
  54. // return 0, err
  55. // }
  56. // pConn.havePrepare = old_p // this keeped by prepare_name
  57. // return ret, nil
  58. // }
  59. func parseMsg(readBuf *buffer, pConn *xuguConn) (rs *xuguResult, err error) {
  60. result := &xuguResult{
  61. affectedRows: 0,
  62. insertId: 0,
  63. }
  64. for {
  65. char := readBuf.peekChar()
  66. fmt.Println("parseMsg 内的 peekChar: ", char, "-", string(char))
  67. switch char {
  68. case 'K':
  69. fmt.Println("消息类型为K")
  70. // readBuf.buf = make([]byte, 2048)
  71. //readBuf.idx++
  72. readBuf.buf = make([]byte, 2048)
  73. readBuf.idx = 0
  74. return result, nil
  75. case '$':
  76. readBuf.idx++
  77. fmt.Println("消息类型为$")
  78. parseFormArgDescri(readBuf)
  79. case 'A':
  80. readBuf.idx++
  81. fmt.Println("消息类型为A")
  82. parseSelectResult(readBuf)
  83. case 'I':
  84. readBuf.idx++
  85. fmt.Println("消息类型为I")
  86. parseInsertResult(readBuf)
  87. case 'U':
  88. fmt.Println("消息类型为U")
  89. readBuf.idx++
  90. parseUpdateResult(readBuf)
  91. case 'D':
  92. fmt.Println("消息类型为D")
  93. readBuf.idx++
  94. parseDeleteResult(readBuf)
  95. case 'E':
  96. fmt.Println("消息类型为E")
  97. readBuf.idx++
  98. pErr, err := parseErrInfo(readBuf)
  99. if err != nil {
  100. return nil, err
  101. }
  102. // fmt.Println("E ReadBuf : ", readBuf.buf[readBuf.idx:])
  103. // fmt.Println("E ReadBuf string: ", string(readBuf.buf[readBuf.idx:]))
  104. pConn.errStr = pErr.ErrStr
  105. // char := readBuf.peekChar()
  106. // fmt.Println("Exec 内的 peekChar: ", char)
  107. case 'W':
  108. fmt.Println("消息类型为W")
  109. readBuf.idx++
  110. parseWarnInfo(readBuf)
  111. case 'M':
  112. fmt.Println("消息类型为M")
  113. readBuf.idx++
  114. parseMessage(readBuf)
  115. default:
  116. fmt.Println("消息类型为其他")
  117. return nil, errors.New("parseMsg: unknown message type")
  118. }
  119. }
  120. }
  121. func xuguSockRecvMsg(pConn *xuguConn) (rs *xuguResult, err error) {
  122. pConn.conn.Read(pConn.readBuff.buf)
  123. fmt.Println("pConn.readBuff.buf ::", pConn.readBuff.buf, string(pConn.readBuff.buf))
  124. rs, err = parseMsg(&pConn.readBuff, pConn)
  125. if err != nil {
  126. fmt.Println("xuguPrepare parseMsg(&pConn.readBuff, pConn)")
  127. return nil, err
  128. }
  129. return rs, nil
  130. }