98 lines
2.1 KiB
Go
98 lines
2.1 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
_ "github.com/lib/pq"
|
|
"github.com/ydzydzydz/pmail_telegram_push/config"
|
|
"github.com/ydzydzydz/pmail_telegram_push/dao"
|
|
"github.com/ydzydzydz/pmail_telegram_push/model"
|
|
_ "modernc.org/sqlite"
|
|
"xorm.io/xorm"
|
|
)
|
|
|
|
// DataSource 数据库数据源
|
|
type DataSource struct {
|
|
db *xorm.Engine
|
|
}
|
|
|
|
// NewDataSource 创建数据库数据源
|
|
func NewDataSource(cfg *config.Config) (*DataSource, error) {
|
|
db, err := getDB(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &DataSource{db: db}, nil
|
|
}
|
|
|
|
// getDB 获取数据库连接
|
|
func getDB(cfg *config.Config) (*xorm.Engine, error) {
|
|
var db *xorm.Engine
|
|
var err error
|
|
|
|
// 根据数据库类型初始化数据库连接
|
|
dsn := cfg.MainConfig.DbDSN
|
|
switch cfg.MainConfig.DbType {
|
|
case "mysql":
|
|
db, err = initMysql(dsn)
|
|
case "sqlite":
|
|
db, err = initSqlite(dsn)
|
|
case "postgres":
|
|
db, err = initPostgres(dsn)
|
|
default:
|
|
return nil, fmt.Errorf("database type %s is not supported", cfg.MainConfig.DbType)
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 设置连接最大生命周期为 30 分钟
|
|
db.SetConnMaxLifetime(30 * time.Minute)
|
|
// 关闭 SQL 日志记录
|
|
db.ShowSQL(false)
|
|
// 同步数据库模型
|
|
db.Sync2(new(model.TelegramPushSetting))
|
|
return db, nil
|
|
}
|
|
|
|
// initMysql 初始化 MySQL 数据库连接
|
|
func initMysql(dsn string) (*xorm.Engine, error) {
|
|
db, err := xorm.NewEngine("mysql", dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.SetMaxOpenConns(100)
|
|
db.SetMaxIdleConns(10)
|
|
return db, nil
|
|
}
|
|
|
|
// initPostgres 初始化 PostgreSQL 数据库连接
|
|
func initPostgres(dsn string) (*xorm.Engine, error) {
|
|
db, err := xorm.NewEngine("postgres", dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.SetMaxOpenConns(100)
|
|
db.SetMaxIdleConns(10)
|
|
return db, nil
|
|
}
|
|
|
|
// initSqlite 初始化 SQLite 数据库连接
|
|
func initSqlite(dsn string) (*xorm.Engine, error) {
|
|
db, err := xorm.NewEngine("sqlite", dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.SetMaxOpenConns(1)
|
|
db.SetMaxIdleConns(1)
|
|
return db, nil
|
|
}
|
|
|
|
// SettingDao 返回设置数据访问对象
|
|
func (d *DataSource) SettingDao() dao.ISettingDao {
|
|
return dao.NewSettingDaoImpl(d.db)
|
|
}
|