p.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "context"
  8. "database/sql"
  9. "database/sql/driver"
  10. "net"
  11. "sync"
  12. "gitee.com/chunanyong/dm/i18n"
  13. )
  14. // 发版标记
  15. var version = "8.1.3.100"
  16. var build_date = "2023.12.14"
  17. var svn = "20657"
  18. var globalDmDriver = newDmDriver()
  19. func init() {
  20. sql.Register("dm", globalDmDriver)
  21. i18n.InitConfig(i18n.Messages_zh_CN)
  22. i18n.InitConfig(i18n.Messages_en_US)
  23. i18n.InitConfig(i18n.Messages_zh_HK)
  24. }
  25. func driverInit(svcConfPath string) {
  26. load(svcConfPath)
  27. if GlobalProperties != nil && GlobalProperties.Len() > 0 {
  28. setDriverAttributes(GlobalProperties)
  29. }
  30. globalDmDriver.createFilterChain(nil, GlobalProperties)
  31. }
  32. type DmDriver struct {
  33. filterable
  34. mu sync.Mutex
  35. //readPropMutex sync.Mutex
  36. }
  37. func newDmDriver() *DmDriver {
  38. d := new(DmDriver)
  39. d.idGenerator = dmDriverIDGenerator
  40. return d
  41. }
  42. // 支持自定义连接网络地址,返回标准net.Conn对象,相关数据库操作的消息包都将发送到该对象
  43. type DialFunc func(addr string) (net.Conn, error)
  44. // 支持自定义连接网络地址,返回标准net.Conn对象,相关数据库操作的消息包都将发送到该对象
  45. type DialContextFunc func(ctx context.Context, addr string) (net.Conn, error)
  46. var (
  47. dialsLock sync.RWMutex
  48. dials map[string]DialContextFunc
  49. )
  50. // 注册自定义连接方法
  51. func RegisterDial(dialName string, dial DialFunc) {
  52. RegisterDialContext(dialName, func(_ context.Context, addr string) (net.Conn, error) {
  53. return dial(addr)
  54. })
  55. }
  56. // 注册自定义连接方法
  57. func RegisterDialContext(dialName string, dial DialContextFunc) {
  58. dialsLock.Lock()
  59. defer dialsLock.Unlock()
  60. if dials == nil {
  61. dials = make(map[string]DialContextFunc)
  62. }
  63. dials[dialName] = dial
  64. }
  65. /*************************************************************
  66. ** PUBLIC METHODS AND FUNCTIONS
  67. *************************************************************/
  68. func (d *DmDriver) Open(dsn string) (driver.Conn, error) {
  69. d.mu.Lock()
  70. defer d.mu.Unlock()
  71. return d.open(dsn)
  72. }
  73. func (d *DmDriver) OpenConnector(dsn string) (driver.Connector, error) {
  74. d.mu.Lock()
  75. defer d.mu.Unlock()
  76. return d.openConnector(dsn)
  77. }
  78. func (d *DmDriver) open(dsn string) (*DmConnection, error) {
  79. c, err := d.openConnector(dsn)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return c.connect(context.Background())
  84. }
  85. func (d *DmDriver) openConnector(dsn string) (*DmConnector, error) {
  86. connector := new(DmConnector).init()
  87. connector.url = dsn
  88. connector.dmDriver = d
  89. //d.readPropMutex.Lock()
  90. err := connector.mergeConfigs(dsn)
  91. //d.readPropMutex.Unlock()
  92. if err != nil {
  93. return nil, err
  94. }
  95. connector.createFilterChain(connector, nil)
  96. return connector, nil
  97. }