154 lines
4.4 KiB
Go
154 lines
4.4 KiB
Go
package driver
|
|
|
|
import (
|
|
"database/sql"
|
|
"database/sql/driver"
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
// IDriverManager 驱动管理器接口 - 统一管理所有数据库驱动的注册和使用
|
|
type IDriverManager interface {
|
|
// 注册驱动
|
|
Register(name string, d driver.Driver) error // 注册一个新的数据库驱动
|
|
// 获取驱动
|
|
GetDriver(name string) (driver.Driver, error) // 根据名称获取已注册的驱动
|
|
// 列出所有驱动
|
|
ListDrivers() []string // 列出所有已注册的驱动名称
|
|
// 打开数据库连接
|
|
Open(driverName, dataSource string) (*sql.DB, error) // 使用指定驱动打开数据库连接
|
|
}
|
|
|
|
// DriverManager 驱动管理器实现 - 管理所有数据库驱动的生命周期
|
|
type DriverManager struct {
|
|
mu sync.RWMutex // 读写锁,保证并发安全
|
|
drivers map[string]driver.Driver // 存储所有已注册的驱动
|
|
sqlDBs map[string]*sql.DB // 存储已创建的数据库连接池
|
|
}
|
|
|
|
var defaultManager *DriverManager // 默认驱动管理器实例
|
|
var once sync.Once // 单例模式同步控制
|
|
|
|
// GetDefaultManager 获取默认驱动管理器 - 使用单例模式确保全局唯一实例
|
|
func GetDefaultManager() *DriverManager {
|
|
once.Do(func() {
|
|
defaultManager = &DriverManager{
|
|
drivers: make(map[string]driver.Driver), // 初始化驱动映射表
|
|
sqlDBs: make(map[string]*sql.DB), // 初始化连接池映射表
|
|
}
|
|
// 注册所有内置驱动
|
|
defaultManager.registerBuiltinDrivers()
|
|
})
|
|
return defaultManager
|
|
}
|
|
|
|
// registerBuiltinDrivers 注册所有内置驱动 - 自动注册框架自带的所有数据库驱动
|
|
func (dm *DriverManager) registerBuiltinDrivers() {
|
|
// TODO: 注册 MySQL 驱动
|
|
// dm.Register("mysql", &MySQLDriver{})
|
|
|
|
// TODO: 注册 SQLite 驱动
|
|
// dm.Register("sqlite", &SQLiteDriver{})
|
|
|
|
// TODO: 注册 PostgreSQL 驱动
|
|
// dm.Register("postgres", &PostgresDriver{})
|
|
|
|
// TODO: 注册 SQL Server 驱动
|
|
// dm.Register("sqlserver", &SQLServerDriver{})
|
|
|
|
// TODO: 注册 Oracle 驱动
|
|
// dm.Register("oracle", &OracleDriver{})
|
|
|
|
// TODO: 注册 ClickHouse 驱动
|
|
// dm.Register("clickhouse", &ClickHouseDriver{})
|
|
}
|
|
|
|
// Register 注册驱动 - 将新的数据库驱动注册到管理器中
|
|
func (dm *DriverManager) Register(name string, d driver.Driver) error {
|
|
dm.mu.Lock()
|
|
defer dm.mu.Unlock()
|
|
|
|
if _, exists := dm.drivers[name]; exists {
|
|
return nil // 已存在,不重复注册
|
|
}
|
|
|
|
dm.drivers[name] = d
|
|
return nil
|
|
}
|
|
|
|
// GetDriver 获取驱动 - 根据驱动名称查找并返回已注册的驱动
|
|
func (dm *DriverManager) GetDriver(name string) (driver.Driver, error) {
|
|
dm.mu.RLock()
|
|
defer dm.mu.RUnlock()
|
|
|
|
d, exists := dm.drivers[name]
|
|
if !exists {
|
|
return nil, ErrDriverNotFound // 驱动未找到错误
|
|
}
|
|
|
|
return d, nil
|
|
}
|
|
|
|
// ListDrivers 列出所有驱动 - 返回所有已注册的驱动名称列表
|
|
func (dm *DriverManager) ListDrivers() []string {
|
|
dm.mu.RLock()
|
|
defer dm.mu.RUnlock()
|
|
|
|
names := make([]string, 0, len(dm.drivers))
|
|
for name := range dm.drivers {
|
|
names = append(names, name)
|
|
}
|
|
return names
|
|
}
|
|
|
|
// Open 打开数据库连接 - 使用指定驱动和数据源创建数据库连接池
|
|
func (dm *DriverManager) Open(driverName, dataSource string) (*sql.DB, error) {
|
|
dm.mu.Lock()
|
|
defer dm.mu.Unlock()
|
|
|
|
// 检查是否已有连接(避免重复创建)
|
|
key := driverName + ":" + dataSource
|
|
if db, exists := dm.sqlDBs[key]; exists {
|
|
return db, nil
|
|
}
|
|
|
|
// 获取驱动
|
|
d, err := dm.GetDriver(driverName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 创建连接器(需要驱动实现 Connector 接口)
|
|
connector, ok := d.(driver.Connector)
|
|
if !ok {
|
|
return nil, ErrDriverNotConnector // 驱动不支持 Connector 接口
|
|
}
|
|
|
|
// 创建 sql.DB 连接池
|
|
db := sql.OpenDB(connector)
|
|
dm.sqlDBs[key] = db
|
|
|
|
return db, nil
|
|
}
|
|
|
|
// Close 关闭指定连接 - 释放特定数据源的数据库连接池
|
|
func (dm *DriverManager) Close(driverName, dataSource string) error {
|
|
dm.mu.Lock()
|
|
defer dm.mu.Unlock()
|
|
|
|
key := driverName + ":" + dataSource
|
|
if db, exists := dm.sqlDBs[key]; exists {
|
|
if err := db.Close(); err != nil {
|
|
return err
|
|
}
|
|
delete(dm.sqlDBs, key)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// 错误定义 - 定义驱动管理器相关的错误类型
|
|
var (
|
|
ErrDriverNotFound = errors.New("driver not found") // 驱动未找到错误
|
|
ErrDriverNotConnector = errors.New("driver does not implement Connector interface") // 驱动不支持 Connector 接口错误
|
|
)
|