gin-base/db/driver/manager.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 接口错误
)