xugusql_connector.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package xugu
  2. import (
  3. "context"
  4. "database/sql/driver"
  5. "errors"
  6. "fmt"
  7. "net"
  8. "time"
  9. )
  10. type connector struct {
  11. dsn string
  12. }
  13. func NewConnector(dsn string) *connector {
  14. return &connector{dsn: dsn}
  15. }
  16. var IPS_COUNTER int = 0
  17. // Driver implements driver.Connector interface.
  18. // Driver returns &XuguDriver{}
  19. func (self *connector) Driver() driver.Driver {
  20. return &XuguDriver{}
  21. }
  22. // Connect implements driver.Connector interface.
  23. // Connect returns a connection to the database.
  24. func (self *connector) Connect(ctx context.Context) (driver.Conn, error) {
  25. obj := &xugusqlConn{conn: nil}
  26. //connKeyValue := C.CString(self.dsn)
  27. defer func() {
  28. // cgo_c_free(unsafe.Pointer(connKeyValue))
  29. }()
  30. fmt.Println("Connect")
  31. re, _ := xgc_connect(ctx, self.dsn, &obj.conn)
  32. if re < 0 {
  33. return nil, obj.get_error()
  34. // pos := strings.Index(strings.ToUpper(self.dsn), "IPS=")
  35. // if pos != -1 {
  36. // IPS_COUNTER++
  37. // re := xgc_connect_ips(ctx, &self.dsn, &obj.conn)
  38. // if re < 0 {
  39. // return nil, obj.get_error()
  40. // }
  41. // } else {
  42. // re, _ := xgc_connect(ctx, self.dsn, &obj.conn)
  43. // if re < 0 {
  44. // return nil, obj.get_error()
  45. // }
  46. }
  47. return obj, nil
  48. }
  49. func xgc_connect(ctx context.Context, pdsn string, __pConn *net.Conn) (int, error) {
  50. fmt.Println("xgc_connect pdsn:", pdsn)
  51. return XGSOpenConn(ctx, pdsn, __pConn)
  52. }
  53. func xgc_connect_ips(ctx context.Context, pdsn *string, __pConn *net.Conn) int {
  54. return 0
  55. }
  56. func XGSOpenConn(ctx context.Context, pdsn string, __pConn *net.Conn) (int, error) {
  57. fmt.Println("XGSOpenConn")
  58. nd := net.Dialer{Timeout: 5 * time.Second}
  59. netConn, err := nd.DialContext(ctx, "tcp", pdsn)
  60. if err != nil {
  61. fmt.Println("tcp", err)
  62. return -8, err
  63. }
  64. // 启用 TCP 保活
  65. if tc, ok := netConn.(*net.TCPConn); ok {
  66. if err := tc.SetKeepAlive(true); err != nil {
  67. //c.cfg.Logger.Print(err) // 如果设置保活失败,记录错误但不终止
  68. }
  69. }
  70. //发送
  71. message := "login database = 'SYSTEM' user = 'SYSDBA' password = 'SYSDBA' version='201' "
  72. _, err = netConn.Write([]byte(message))
  73. if err != nil {
  74. fmt.Println("发送数据失败:", err)
  75. }
  76. fmt.Println("数据已发送:", message)
  77. buffer := make([]byte, 1024)
  78. n, err := netConn.Read(buffer)
  79. if err != nil {
  80. fmt.Println("Error reading from server:", err)
  81. }
  82. fmt.Println("Message from server:", string(buffer[:n]))
  83. return 1, nil
  84. }
  85. func (self *xugusqlConn) get_error() error {
  86. return errors.New("errors")
  87. }