mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-20 08:03:53 +08:00
116 lines
2.7 KiB
Go
116 lines
2.7 KiB
Go
/*
|
||
* Copyright (c) 2000-2018, 达梦数据库有限公司.
|
||
* All rights reserved.
|
||
*/
|
||
package dm
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"database/sql/driver"
|
||
"net"
|
||
"sync"
|
||
|
||
"gitee.com/chunanyong/dm/i18n"
|
||
)
|
||
|
||
// 发版标记
|
||
var version = "8.1.3.100"
|
||
var build_date = "2023.12.14"
|
||
var svn = "20657"
|
||
|
||
var globalDmDriver = newDmDriver()
|
||
|
||
func init() {
|
||
sql.Register("dm", globalDmDriver)
|
||
|
||
i18n.InitConfig(i18n.Messages_zh_CN)
|
||
i18n.InitConfig(i18n.Messages_en_US)
|
||
i18n.InitConfig(i18n.Messages_zh_HK)
|
||
}
|
||
|
||
func driverInit(svcConfPath string) {
|
||
load(svcConfPath)
|
||
if GlobalProperties != nil && GlobalProperties.Len() > 0 {
|
||
setDriverAttributes(GlobalProperties)
|
||
}
|
||
globalDmDriver.createFilterChain(nil, GlobalProperties)
|
||
}
|
||
|
||
type DmDriver struct {
|
||
filterable
|
||
mu sync.Mutex
|
||
//readPropMutex sync.Mutex
|
||
}
|
||
|
||
func newDmDriver() *DmDriver {
|
||
d := new(DmDriver)
|
||
d.idGenerator = dmDriverIDGenerator
|
||
return d
|
||
}
|
||
|
||
// 支持自定义连接网络地址,返回标准net.Conn对象,相关数据库操作的消息包都将发送到该对象
|
||
type DialFunc func(addr string) (net.Conn, error)
|
||
|
||
// 支持自定义连接网络地址,返回标准net.Conn对象,相关数据库操作的消息包都将发送到该对象
|
||
type DialContextFunc func(ctx context.Context, addr string) (net.Conn, error)
|
||
|
||
var (
|
||
dialsLock sync.RWMutex
|
||
dials map[string]DialContextFunc
|
||
)
|
||
|
||
// 注册自定义连接方法
|
||
func RegisterDial(dialName string, dial DialFunc) {
|
||
RegisterDialContext(dialName, func(_ context.Context, addr string) (net.Conn, error) {
|
||
return dial(addr)
|
||
})
|
||
}
|
||
|
||
// 注册自定义连接方法
|
||
func RegisterDialContext(dialName string, dial DialContextFunc) {
|
||
dialsLock.Lock()
|
||
defer dialsLock.Unlock()
|
||
if dials == nil {
|
||
dials = make(map[string]DialContextFunc)
|
||
}
|
||
dials[dialName] = dial
|
||
}
|
||
|
||
/*************************************************************
|
||
** PUBLIC METHODS AND FUNCTIONS
|
||
*************************************************************/
|
||
func (d *DmDriver) Open(dsn string) (driver.Conn, error) {
|
||
d.mu.Lock()
|
||
defer d.mu.Unlock()
|
||
return d.open(dsn)
|
||
}
|
||
|
||
func (d *DmDriver) OpenConnector(dsn string) (driver.Connector, error) {
|
||
d.mu.Lock()
|
||
defer d.mu.Unlock()
|
||
return d.openConnector(dsn)
|
||
}
|
||
|
||
func (d *DmDriver) open(dsn string) (*DmConnection, error) {
|
||
c, err := d.openConnector(dsn)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return c.connect(context.Background())
|
||
}
|
||
|
||
func (d *DmDriver) openConnector(dsn string) (*DmConnector, error) {
|
||
connector := new(DmConnector).init()
|
||
connector.url = dsn
|
||
connector.dmDriver = d
|
||
//d.readPropMutex.Lock()
|
||
err := connector.mergeConfigs(dsn)
|
||
//d.readPropMutex.Unlock()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
connector.createFilterChain(connector, nil)
|
||
return connector, nil
|
||
}
|