xugu_connector.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package xugu
  2. import (
  3. "context"
  4. "database/sql/driver"
  5. "fmt"
  6. "net"
  7. "time"
  8. )
  9. type connector struct {
  10. dsn string
  11. }
  12. // Driver implements driver.Connector interface.
  13. // Driver returns &XuguDriver{}
  14. func (conntor *connector) Driver() driver.Driver {
  15. fmt.Println(">>>>>(conntor *connector) Driver()")
  16. return &XuguDriver{}
  17. }
  18. // Connect implements driver.Connector interface.
  19. // Connect returns a connection to the database.
  20. /*
  21. dsn解析
  22. 创建连接
  23. 设置为 tcp 长连接(
  24. 创建连接缓冲区
  25. 设置连接超时配置
  26. 接收来自服务端的握手请求
  27. */
  28. func (conntor *connector) Connect(ctx context.Context) (driver.Conn, error) {
  29. gt("(conntor *connector) Connect(ctx context.Context) run ")
  30. defer gt("(conntor *connector) Connect(ctx context.Context) end")
  31. dsnConfig := parseDSN(conntor.dsn)
  32. xgConn := &xuguConn{conn: nil}
  33. xgConn.dsnConfig = dsnConfig
  34. nd := net.Dialer{Timeout: 5 * time.Second}
  35. netConn, err := nd.DialContext(ctx, "tcp", fmt.Sprintf("%s:%s", xgConn.IP, xgConn.Port))
  36. if err != nil {
  37. fmt.Println("tcp Connect error: ", err)
  38. return nil, err
  39. }
  40. // 启用 TCP 保活
  41. if tc, ok := netConn.(*net.TCPConn); ok {
  42. if err := tc.SetKeepAlive(true); err != nil {
  43. //c.cfg.Logger.Print(err) // 如果设置保活失败,记录错误但不终止
  44. fmt.Println("SetKeepAlive error", err)
  45. return nil, err
  46. }
  47. }
  48. xgConn.conn = netConn
  49. xgConn.mu.Lock()
  50. xgConn.readBuff = newBuffer(xgConn.conn)
  51. fmt.Println("连接串为: ", conntor.dsn)
  52. err = xgSockOpenConn(ctx, xgConn)
  53. if err != nil {
  54. return nil, err
  55. }
  56. xgConn.mu.Unlock()
  57. return xgConn, nil
  58. }