xugu_connector.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. return &XuguDriver{}
  16. }
  17. // Connect implements driver.Connector interface.
  18. // Connect returns a connection to the database.
  19. /*
  20. dsn解析
  21. 创建连接
  22. 设置为 tcp 长连接(
  23. 创建连接缓冲区
  24. 设置连接超时配置
  25. 接收来自服务端的握手请求
  26. */
  27. func (conntor *connector) Connect(ctx context.Context) (driver.Conn, error) {
  28. GlobalIsBig = CheckEndian()
  29. dsnConfig := parseDSN(conntor.dsn)
  30. xgConn := &xuguConn{conn: nil}
  31. xgConn.dsnConfig = dsnConfig
  32. nd := net.Dialer{Timeout: 10 * time.Millisecond}
  33. netConn, err := nd.DialContext(ctx, "tcp", fmt.Sprintf("%s:%s", xgConn.IP, xgConn.Port))
  34. if err != nil {
  35. return nil, err
  36. }
  37. // 启用 TCP 保活
  38. if tc, ok := netConn.(*net.TCPConn); ok {
  39. if err := tc.SetKeepAlive(true); err != nil {
  40. //c.cfg.Logger.Print(err) // 如果设置保活失败,记录错误但不终止
  41. return nil, err
  42. }
  43. }
  44. xgConn.conn = netConn
  45. xgConn.mu.Lock()
  46. xgConn.readBuff = newBuffer(xgConn.conn)
  47. err = xgSockOpenConn(ctx, xgConn)
  48. if err != nil {
  49. return nil, err
  50. }
  51. xgConn.mu.Unlock()
  52. return xgConn, nil
  53. }