Smail/plugins/pmail_telegram_push/db/db.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)
}