83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/XingfenD/yoresee_doc/pkg/errs"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
var DB *gorm.DB
|
|
|
|
func OpenPostgres(cfg *PostgresOptions) (*gorm.DB, error) {
|
|
if cfg == nil {
|
|
return nil, errs.ErrPostgresOptionsNil
|
|
}
|
|
|
|
dsn := fmt.Sprintf(
|
|
"host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
|
|
cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.Name,
|
|
)
|
|
|
|
gormLogLevel, err := resolveGormLogLevel(cfg.GormLogLevel)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
|
|
Logger: logger.Default.LogMode(gormLogLevel),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if cfg.MaxIdleConns > 0 {
|
|
sqlDB.SetMaxIdleConns(cfg.MaxIdleConns)
|
|
}
|
|
if cfg.MaxOpenConns > 0 {
|
|
sqlDB.SetMaxOpenConns(cfg.MaxOpenConns)
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func resolveGormLogLevel(levelText string) (logger.LogLevel, error) {
|
|
levelText = strings.TrimSpace(levelText)
|
|
if levelText == "" {
|
|
levelText = "info"
|
|
}
|
|
|
|
switch strings.ToLower(levelText) {
|
|
case "silent":
|
|
return logger.Silent, nil
|
|
case "error":
|
|
return logger.Error, nil
|
|
case "warn", "warning":
|
|
return logger.Warn, nil
|
|
case "info", "debug", "trace":
|
|
return logger.Info, nil
|
|
case "fatal", "panic":
|
|
return logger.Error, nil
|
|
default:
|
|
return logger.Info, errs.Detail(errs.ErrInvalidGormLogLevel, levelText)
|
|
}
|
|
}
|
|
|
|
func ClosePostgres() error {
|
|
if DB == nil {
|
|
return nil
|
|
}
|
|
sqlDB, err := DB.DB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return sqlDB.Close()
|
|
}
|